examples: use separate crypto session mempools
[dpdk.git] / examples / ip_pipeline / cryptodev.c
index b365810..ac1e38d 100644 (file)
@@ -11,6 +11,8 @@
 
 #include "cryptodev.h"
 
+#define PIPELINE_CRYPTO_SESSION_CACHE_SIZE     128
+
 static struct cryptodev_list cryptodev_list;
 
 int
@@ -53,13 +55,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) {
@@ -75,6 +80,11 @@ cryptodev_create(const char *name, struct cryptodev_params *params)
                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);
 
@@ -111,7 +121,44 @@ 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:
+       if (cryptodev->mp_create)
+               rte_mempool_free(cryptodev->mp_create);
+       if (cryptodev->mp_init)
+               rte_mempool_free(cryptodev->mp_init);
+
+       free(cryptodev);
+
+       return NULL;
 }