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.
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 */