net/virtio: unmap PCI device in secondary process
[dpdk.git] / examples / ip_pipeline / cryptodev.c
index b365810..cd0f9c3 100644 (file)
@@ -6,11 +6,12 @@
 #include <stdio.h>
 
 #include <rte_cryptodev.h>
-#include <rte_cryptodev_pmd.h>
 #include <rte_string_fns.h>
 
 #include "cryptodev.h"
 
+#define PIPELINE_CRYPTO_SESSION_CACHE_SIZE     128
+
 static struct cryptodev_list cryptodev_list;
 
 int
@@ -53,13 +54,16 @@ cryptodev_create(const char *name, struct cryptodev_params *params)
        struct cryptodev *cryptodev;
        uint32_t dev_id, i;
        uint32_t socket_id;
+       uint32_t cache_size;
+       char mp_name[NAME_SIZE];
        int status;
 
        /* Check input params */
        if ((name == NULL) ||
                cryptodev_find(name) ||
                (params->n_queues == 0) ||
-               (params->queue_size == 0))
+               (params->queue_size == 0) ||
+               (params->session_pool_size == 0))
                return NULL;
 
        if (params->dev_name) {
@@ -69,22 +73,26 @@ cryptodev_create(const char *name, struct cryptodev_params *params)
 
                dev_id = (uint32_t)status;
        } else {
-               if (rte_cryptodev_pmd_is_valid_dev(params->dev_id) == 0)
+               if (rte_cryptodev_is_valid_dev(params->dev_id) == 0)
                        return NULL;
 
                dev_id = params->dev_id;
        }
 
+       cache_size = (params->session_pool_size / 2 <
+                       PIPELINE_CRYPTO_SESSION_CACHE_SIZE) ?
+                                       (params->session_pool_size / 2) :
+                                       PIPELINE_CRYPTO_SESSION_CACHE_SIZE;
+
        socket_id = rte_cryptodev_socket_id(dev_id);
        rte_cryptodev_info_get(dev_id, &dev_info);
 
        if (dev_info.max_nb_queue_pairs < params->n_queues)
                return NULL;
-       if (dev_info.feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED)
-               return NULL;
 
        dev_conf.socket_id = socket_id;
        dev_conf.nb_queue_pairs = params->n_queues;
+       dev_conf.ff_disable = 0;
 
        status = rte_cryptodev_configure(dev_id, &dev_conf);
        if (status < 0)
@@ -111,7 +119,42 @@ cryptodev_create(const char *name, struct cryptodev_params *params)
        cryptodev->dev_id = dev_id;
        cryptodev->n_queues = params->n_queues;
 
+       snprintf(mp_name, NAME_SIZE, "%s_mp%u", name, dev_id);
+       cryptodev->mp_create = rte_cryptodev_sym_session_pool_create(
+                       mp_name,
+                       params->session_pool_size,
+                       0,
+                       cache_size,
+                       0,
+                       socket_id);
+       if (!cryptodev->mp_create)
+               goto error_exit;
+
+       snprintf(mp_name, NAME_SIZE, "%s_mp_priv%u", name, dev_id);
+       cryptodev->mp_init = rte_mempool_create(
+                       NULL,
+                       params->session_pool_size,
+                       rte_cryptodev_sym_get_private_session_size(dev_id),
+                       cache_size,
+                       0,
+                       NULL,
+                       NULL,
+                       NULL,
+                       NULL,
+                       socket_id,
+                       0);
+       if (!cryptodev->mp_init)
+               goto error_exit;
+
        TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node);
 
        return cryptodev;
+
+error_exit:
+       rte_mempool_free(cryptodev->mp_create);
+       rte_mempool_free(cryptodev->mp_init);
+
+       free(cryptodev);
+
+       return NULL;
 }