crypto: SW scheduler async crypto engine
[vpp.git] / src / plugins / dpdk / cryptodev / cryptodev.c
index 86cec8a..6fc09c3 100644 (file)
@@ -706,7 +706,8 @@ cryptodev_get_ring_head (struct rte_ring * ring)
 }
 
 static_always_inline vnet_crypto_async_frame_t *
-cryptodev_frame_dequeue (vlib_main_t * vm)
+cryptodev_frame_dequeue (vlib_main_t * vm, u32 * nb_elts_processed,
+                        u32 * enqueue_thread_idx)
 {
   cryptodev_main_t *cmt = &cryptodev_main;
   cryptodev_numa_data_t *numa = cmt->per_numa_data + vm->numa_node;
@@ -768,7 +769,8 @@ cryptodev_frame_dequeue (vlib_main_t * vm)
     VNET_CRYPTO_FRAME_STATE_SUCCESS : VNET_CRYPTO_FRAME_STATE_ELT_ERROR;
 
   rte_mempool_put_bulk (numa->cop_pool, (void **) cet->cops, frame->n_elts);
-
+  *nb_elts_processed = frame->n_elts;
+  *enqueue_thread_idx = frame->enqueue_thread_index;
   return frame;
 }
 
@@ -1181,9 +1183,23 @@ cryptodev_create_device (vlib_main_t *vm, u32 n_queues)
   return 0;
 }
 
+static int
+cryptodev_cmp (void *v1, void *v2)
+{
+  cryptodev_inst_t *a1 = v1;
+  cryptodev_inst_t *a2 = v2;
+
+  if (a1->q_id > a2->q_id)
+    return 1;
+  if (a1->q_id < a2->q_id)
+    return -1;
+  return 0;
+}
+
 static int
 cryptodev_probe (vlib_main_t *vm, u32 n_workers)
 {
+  cryptodev_main_t *cmt = &cryptodev_main;
   u32 n_queues = cryptodev_count_queue (vm->numa_node);
   u32 i;
   int ret;
@@ -1204,6 +1220,8 @@ cryptodev_probe (vlib_main_t *vm, u32 n_workers)
        return ret;
     }
 
+  vec_sort_with_function(cmt->cryptodev_inst, cryptodev_cmp);
+
   return 0;
 }