convert crypto queue to the task(9) api

2013-10-30 Thread Mike Belopuhov
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)  0x;
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 */



Re: convert crypto queue to the task(9) api

2013-10-30 Thread Mike Belopuhov
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)  0x;
   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 */