Check crypto driver capabilities and if the driver operates synchronously

mark crypto requests with ``callback immediately'' to avoid doing a context
switch to return crypto results.  This completes the work to eliminate
context switches for using software crypto via the crypto subsystem (with
symmetric crypto ops).
This commit is contained in:
sam 2003-06-27 20:10:03 +00:00
parent 0feda3c8b4
commit 191c1bf982
3 changed files with 54 additions and 0 deletions

View File

@ -688,6 +688,15 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
/* Crypto operation descriptor. */
crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = ah_input_cb;
crp->crp_sid = sav->tdb_cryptoid;
@ -1091,6 +1100,15 @@ ah_output(
/* Crypto operation descriptor. */
crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = ah_output_cb;
crp->crp_sid = sav->tdb_cryptoid;

View File

@ -396,6 +396,15 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
/* Crypto operation descriptor */
crp->crp_ilen = m->m_pkthdr.len; /* Total input length */
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = esp_input_cb;
crp->crp_sid = sav->tdb_cryptoid;
@ -834,6 +843,15 @@ esp_output(
/* Crypto operation descriptor. */
crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = esp_output_cb;
crp->crp_opaque = (caddr_t) tc;

View File

@ -174,6 +174,15 @@ ipcomp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
/* Crypto operation descriptor */
crp->crp_ilen = m->m_pkthdr.len - (skip + hlen);
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = ipcomp_input_cb;
crp->crp_sid = sav->tdb_cryptoid;
@ -478,6 +487,15 @@ ipcomp_output(
/* Crypto operation descriptor */
crp->crp_ilen = m->m_pkthdr.len; /* Total input length */
crp->crp_flags = CRYPTO_F_IMBUF;
/*
* When using crypto support the operates "synchronously" (e.g.
* software crypto) mark the operation for immediate callback to
* avoid the context switch. This increases the amount of kernel
* stack required to process a frame but we assume there is enough
* to do this.
*/
if (CRYPTO_SESID2CAPS(sav->tdb_cryptoid) & CRYPTOCAP_F_SYNC)
crp->crp_flags |= CRYPTO_F_CBIMM;
crp->crp_buf = (caddr_t) m;
crp->crp_callback = ipcomp_output_cb;
crp->crp_opaque = (caddr_t) tc;