On Wed, Oct 30, 2013 at 14:58 +0100, Mike Belopuhov wrote: > Tested on amd64 SP and MP, i386 SP so far. sparc64 MP test > is in progress. I've also tested the crypto(4) interface > (doesn't use queue) so softraid should work as well. >
sparc64 test is done. on a side note, that IPL_HIGH can be safely converted to IPL_VM since crypto code itself uses splvm (which is also rather pointless because hw crypto uses IPL_NET and mbuf allocation code will bump IPL itself anyways). i have just tested IPL_VM taskq on the aforementioned machines. > ok? > > diff --git sys/crypto/crypto.c sys/crypto/crypto.c > index 7df0c435..fbdcd97 100644 > --- sys/crypto/crypto.c > +++ sys/crypto/crypto.c > @@ -34,11 +34,11 @@ struct cryptocap *crypto_drivers = NULL; > int crypto_drivers_num = 0; > > struct pool cryptop_pool; > struct pool cryptodesc_pool; > > -struct workq *crypto_workq; > +struct taskq *crypto_taskq; > > /* > * Create a new session. > */ > int > @@ -414,26 +414,26 @@ crypto_dispatch(struct cryptop *crp) > hid = (crp->crp_sid >> 32) & 0xffffffff; > if (hid < crypto_drivers_num) > crypto_drivers[hid].cc_queued++; > splx(s); > > - if (crypto_workq) { > - workq_queue_task(crypto_workq, &crp->crp_wqt, 0, > - (workq_fn)crypto_invoke, crp, NULL); > + if (crypto_taskq) { > + task_set(&crp->crp_task, (void (*))crypto_invoke, crp, NULL); > + task_add(crypto_taskq, &crp->crp_task); > } else { > crypto_invoke(crp); > } > > return 0; > } > > int > crypto_kdispatch(struct cryptkop *krp) > { > - if (crypto_workq) { > - workq_queue_task(crypto_workq, &krp->krp_wqt, 0, > - (workq_fn)crypto_kinvoke, krp, NULL); > + if (crypto_taskq) { > + task_set(&krp->krp_task, (void (*))crypto_kinvoke, krp, NULL); > + task_add(crypto_taskq, &krp->krp_task); > } else { > crypto_kinvoke(krp); > } > > return 0; > @@ -616,11 +616,11 @@ crypto_getreq(int num) > } > > void > crypto_init(void) > { > - crypto_workq = workq_create("crypto", 1, IPL_HIGH); > + crypto_taskq = taskq_create("crypto", 1, IPL_HIGH); > > pool_init(&cryptop_pool, sizeof(struct cryptop), 0, 0, > 0, "cryptop", NULL); > pool_init(&cryptodesc_pool, sizeof(struct cryptodesc), 0, 0, > 0, "cryptodesc", NULL); > @@ -635,23 +635,24 @@ crypto_done(struct cryptop *crp) > crp->crp_flags |= CRYPTO_F_DONE; > if (crp->crp_flags & CRYPTO_F_NOQUEUE) { > /* not from the crypto queue, wakeup the userland process */ > crp->crp_callback(crp); > } else { > - workq_queue_task(crypto_workq, &crp->crp_wqt, 0, > - (workq_fn)crp->crp_callback, crp, NULL); > + task_set(&crp->crp_task, (void (*))crp->crp_callback, > + crp, NULL); > + task_add(crypto_taskq, &crp->crp_task); > } > } > > /* > * Invoke the callback on behalf of the driver. > */ > void > crypto_kdone(struct cryptkop *krp) > { > - workq_queue_task(crypto_workq, &krp->krp_wqt, 0, > - (workq_fn)krp->krp_callback, krp, NULL); > + task_set(&krp->krp_task, (void (*))krp->krp_callback, krp, NULL); > + task_add(crypto_taskq, &krp->krp_task); > } > > int > crypto_getfeat(int *featp) > { > diff --git sys/crypto/cryptodev.h sys/crypto/cryptodev.h > index 4f87046..4f732f9 100644 > --- sys/crypto/cryptodev.h > +++ sys/crypto/cryptodev.h > @@ -51,11 +51,11 @@ > > #ifndef _CRYPTO_CRYPTO_H_ > #define _CRYPTO_CRYPTO_H_ > > #include <sys/ioccom.h> > -#include <sys/workq.h> > +#include <sys/task.h> > > /* Some initial values */ > #define CRYPTO_DRIVERS_INITIAL 4 > #define CRYPTO_DRIVERS_MAX 128 > #define CRYPTO_SW_SESSIONS 32 > @@ -158,11 +158,11 @@ struct cryptodesc { > struct cryptodesc *crd_next; > }; > > /* Structure describing complete operation */ > struct cryptop { > - struct workq_task crp_wqt; > + struct task crp_task; > > u_int64_t crp_sid; /* Session ID */ > int crp_ilen; /* Input data total length */ > int crp_olen; /* Result total length */ > int crp_alloctype; /* Type of buf to allocate if needed */ > @@ -228,11 +228,11 @@ struct crypt_kop { > #define CRF_DSA_SIGN (1 << CRK_DSA_SIGN) > #define CRF_DSA_VERIFY (1 << CRK_DSA_VERIFY) > #define CRF_DH_COMPUTE_KEY (1 << CRK_DH_COMPUTE_KEY) > > struct cryptkop { > - struct workq_task krp_wqt; > + struct task krp_task; > > u_int krp_op; /* ie. CRK_MOD_EXP or other */ > u_int krp_status; /* return status */ > u_short krp_iparams; /* # of input parameters */ > u_short krp_oparams; /* # of output parameters */