]> git.droids-corp.org - dpdk.git/commitdiff
crypto/ipsec_mb: support multi-process
authorCiara Power <ciara.power@intel.com>
Fri, 15 Oct 2021 14:39:45 +0000 (14:39 +0000)
committerAkhil Goyal <gakhil@marvell.com>
Wed, 20 Oct 2021 10:06:01 +0000 (12:06 +0200)
The ipsec_mb SW PMD now has multiprocess support.
The queue-pair IMB_MGR is stored in a memzone instead of being allocated
externally by the Intel IPSec MB library, when v1.1 is used.
If v1.0 is used, multi process is not supported, and allocation is
done as before.
The secondary process needs to reconfigure the queue-pair to allow for
IMB_MGR function pointers be updated.

Intel IPsec MB library version 1.1 is required for this support.

Signed-off-by: Ciara Power <ciara.power@intel.com>
Acked-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
Acked-by: Akhil Goyal <gakhil@marvell.com>
doc/guides/rel_notes/release_21_11.rst
drivers/crypto/ipsec_mb/ipsec_mb_ops.c
drivers/crypto/ipsec_mb/ipsec_mb_private.h

index 49903a17b98ece29ff75d75b0b61cb08b2120a5c..403f915ec258bcdae5668b241964b9d26c375170 100644 (file)
@@ -226,6 +226,8 @@ New Features
 
   * The IPsec_MB framework was added to share common code between Intel
     SW Crypto PMDs that depend on the intel-ipsec-mb library.
+  * Multiprocess support was added for the consolidated PMDs,
+    which requires v1.1 of the intel-ipsec-mb library.
 
 * **Updated the ACC100 bbdev PMD.**
 
index 409c7556bbd1deae619d67ee93839fdb71f5d747..189262c4ad52cf9280cda07b22f5630d5f15c138 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "ipsec_mb_private.h"
 
+#define IMB_MP_REQ_VER_STR "1.1.0"
+
 /** Configure device */
 int
 ipsec_mb_config(__rte_unused struct rte_cryptodev *dev,
@@ -98,10 +100,20 @@ ipsec_mb_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
        struct ipsec_mb_qp *qp = dev->data->queue_pairs[qp_id];
        struct rte_ring *r = NULL;
 
-       if (qp != NULL) {
+       if (qp != NULL && rte_eal_process_type() == RTE_PROC_PRIMARY) {
                r = rte_ring_lookup(qp->name);
                if (r)
                        rte_ring_free(r);
+
+#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM
+               if (qp->mb_mgr)
+                       free_mb_mgr(qp->mb_mgr);
+#else
+               if (qp->mb_mgr_mz) {
+                       rte_memzone_free(qp->mb_mgr_mz);
+                       qp->mb_mgr = NULL;
+               }
+#endif
                rte_free(qp);
                dev->data->queue_pairs[qp_id] = NULL;
        }
@@ -154,6 +166,41 @@ static struct rte_ring
                               RING_F_SP_ENQ | RING_F_SC_DEQ);
 }
 
+#if IMB_VERSION(1, 1, 0) <= IMB_VERSION_NUM
+static IMB_MGR *
+ipsec_mb_alloc_mgr_from_memzone(const struct rte_memzone **mb_mgr_mz,
+               const char *mb_mgr_mz_name)
+{
+       IMB_MGR *mb_mgr;
+
+       if (rte_eal_process_type() ==  RTE_PROC_PRIMARY) {
+               *mb_mgr_mz = rte_memzone_lookup(mb_mgr_mz_name);
+               if (*mb_mgr_mz == NULL) {
+                       *mb_mgr_mz = rte_memzone_reserve(mb_mgr_mz_name,
+                       imb_get_mb_mgr_size(),
+                       rte_socket_id(), 0);
+               }
+               if (*mb_mgr_mz == NULL) {
+                       IPSEC_MB_LOG(DEBUG, "Error allocating memzone for %s",
+                                       mb_mgr_mz_name);
+                       return NULL;
+               }
+               mb_mgr = imb_set_pointers_mb_mgr((*mb_mgr_mz)->addr, 0, 1);
+               init_mb_mgr_auto(mb_mgr, NULL);
+       } else {
+               *mb_mgr_mz = rte_memzone_lookup(mb_mgr_mz_name);
+               if (*mb_mgr_mz == NULL) {
+                       IPSEC_MB_LOG(ERR,
+                               "Secondary can't find %s mz, did primary create it?",
+                               mb_mgr_mz_name);
+                       return NULL;
+               }
+               mb_mgr = imb_set_pointers_mb_mgr((*mb_mgr_mz)->addr, 0, 0);
+       }
+       return mb_mgr;
+}
+#endif
+
 /** Setup a queue pair */
 int
 ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
@@ -167,16 +214,44 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
        uint32_t qp_size;
        int ret;
 
-       /* Free memory prior to re-allocation if needed. */
-       if (dev->data->queue_pairs[qp_id] != NULL)
-               ipsec_mb_qp_release(dev, qp_id);
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM
+               IPSEC_MB_LOG(ERR, "The intel-ipsec-mb version (%s) does not support multiprocess,"
+                               "the minimum version required for this feature is %s.",
+                               IMB_VERSION_STR, IMB_MP_REQ_VER_STR);
+               return -EINVAL;
+#endif
+               if (dev->data->queue_pairs[qp_id] != NULL)
+                       qp = dev->data->queue_pairs[qp_id];
+       } else {
+               /* Free memory prior to re-allocation if needed. */
+               if (dev->data->queue_pairs[qp_id] != NULL)
+                       ipsec_mb_qp_release(dev, qp_id);
+
+               qp_size = sizeof(*qp) + pmd_data->qp_priv_size;
+               /* Allocate the queue pair data structure. */
+               qp = rte_zmalloc_socket("IPSEC PMD Queue Pair", qp_size,
+                                       RTE_CACHE_LINE_SIZE, socket_id);
+               if (qp == NULL)
+                       return -ENOMEM;
+       }
+
+#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM
+       qp->mb_mgr = alloc_init_mb_mgr();
+#else
+       char mz_name[IPSEC_MB_MAX_MZ_NAME];
+       snprintf(mz_name, sizeof(mz_name), "IMB_MGR_DEV_%d_QP_%d",
+                       dev->data->dev_id, qp_id);
+       qp->mb_mgr = ipsec_mb_alloc_mgr_from_memzone(&(qp->mb_mgr_mz),
+                       mz_name);
+#endif
+       if (qp->mb_mgr == NULL) {
+               ret = -ENOMEM;
+               goto qp_setup_cleanup;
+       }
 
-       qp_size = sizeof(*qp) + pmd_data->qp_priv_size;
-       /* Allocate the queue pair data structure. */
-       qp = rte_zmalloc_socket("IPSEC PMD Queue Pair", qp_size,
-                               RTE_CACHE_LINE_SIZE, socket_id);
-       if (qp == NULL)
-               return -ENOMEM;
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY)
+               return 0;
 
        qp->id = qp_id;
        dev->data->queue_pairs[qp_id] = qp;
@@ -196,12 +271,6 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
                goto qp_setup_cleanup;
        }
 
-       qp->mb_mgr = alloc_init_mb_mgr();
-       if (!qp->mb_mgr) {
-               ret = -ENOMEM;
-               goto qp_setup_cleanup;
-       }
-
        memset(&qp->stats, 0, sizeof(qp->stats));
 
        if (pmd_data->queue_pair_configure) {
@@ -213,8 +282,15 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
        return 0;
 
 qp_setup_cleanup:
+#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM
        if (qp->mb_mgr)
                free_mb_mgr(qp->mb_mgr);
+#else
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY)
+               return ret;
+       if (qp->mb_mgr_mz)
+               rte_memzone_free(qp->mb_mgr_mz);
+#endif
        if (qp)
                rte_free(qp);
        return ret;
@@ -271,6 +347,7 @@ ipsec_mb_sym_session_configure(
 
        set_sym_session_private_data(sess, dev->driver_id, sess_private_data);
 
+       free_mb_mgr(mb_mgr);
        return 0;
 }
 
index a6e05a07db0217940f23512685c5905f956b111c..541f759e66c58b93419fb47781f2f6a157a3b7ac 100644 (file)
@@ -18,6 +18,9 @@
 /* Maximum length for digest */
 #define DIGEST_LENGTH_MAX 64
 
+/* Maximum length for memzone name */
+#define IPSEC_MB_MAX_MZ_NAME 32
+
 enum ipsec_mb_vector_mode {
        IPSEC_MB_NOT_SUPPORTED = 0,
        IPSEC_MB_SSE,
@@ -95,6 +98,8 @@ struct ipsec_mb_qp {
         */
        IMB_MGR *mb_mgr;
        /* Multi buffer manager */
+       const struct rte_memzone *mb_mgr_mz;
+       /* Shared memzone for storing mb_mgr */
        __extension__ uint8_t additional_data[0];
        /**< Storing PMD specific additional data */
 };