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