diff options
author | Xinyao Cai <xinyao.cai@intel.com> | 2023-04-12 18:35:23 +0800 |
---|---|---|
committer | Damjan Marion <dmarion@0xa5.net> | 2023-04-25 15:13:22 +0000 |
commit | efad24a84d35458e2c672b94027e54923a42fd25 (patch) | |
tree | e3ebb21f1c3274d81e5d1b9fbcf874f0685a5dbc /src/plugins/dpdk/cryptodev/cryptodev.c | |
parent | 140ca0fa95b4b8c037dfa83e99fd08620e93c646 (diff) |
dpdk: code preparation for bumping to DPDK 22.11
This patch prepares code for bumping DPDK version to 22.11, but the DPDK version of this patch keeps at 22.07 for compatibility.
the "no-dsa" parameter in DPDK configuration is removed, the "blacklist" parameter can be used to block the related DSA devices.
Type: feature
Signed-off-by: Xinyao Cai <xinyao.cai@intel.com>
Change-Id: I08787c6584bba66383fc0a784963f33171196910
Diffstat (limited to 'src/plugins/dpdk/cryptodev/cryptodev.c')
-rw-r--r-- | src/plugins/dpdk/cryptodev/cryptodev.c | 86 |
1 files changed, 77 insertions, 9 deletions
diff --git a/src/plugins/dpdk/cryptodev/cryptodev.c b/src/plugins/dpdk/cryptodev/cryptodev.c index adb437e3465..84a307d02ce 100644 --- a/src/plugins/dpdk/cryptodev/cryptodev.c +++ b/src/plugins/dpdk/cryptodev/cryptodev.c @@ -141,7 +141,7 @@ prepare_linked_xform (struct rte_crypto_sym_xform *xforms, } static_always_inline void -cryptodev_session_del (struct rte_cryptodev_sym_session *sess) +cryptodev_session_del (cryptodev_session_t *sess) { u32 n_devs, i; @@ -151,9 +151,14 @@ cryptodev_session_del (struct rte_cryptodev_sym_session *sess) n_devs = rte_cryptodev_count (); for (i = 0; i < n_devs; i++) +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + if (rte_cryptodev_sym_session_free (i, sess) == 0) + break; +#else rte_cryptodev_sym_session_clear (i, sess); rte_cryptodev_sym_session_free (sess); +#endif } static int @@ -337,8 +342,13 @@ allocate_session_pools (u32 numa_node, clib_error_t *error = NULL; name = format (0, "vcrypto_sess_pool_%u_%04x%c", numa_node, len, 0); +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + sess_pools_elt->sess_pool = rte_cryptodev_sym_session_pool_create ( + (char *) name, CRYPTODEV_NB_SESSION, cmt->sess_sz, 0, 0, numa_node); +#else sess_pools_elt->sess_pool = rte_cryptodev_sym_session_pool_create ( (char *) name, CRYPTODEV_NB_SESSION, 0, 0, 0, numa_node); +#endif if (!sess_pools_elt->sess_pool) { @@ -347,6 +357,7 @@ allocate_session_pools (u32 numa_node, } vec_free (name); +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) name = format (0, "crypto_sess_pool_%u_%04x%c", numa_node, len, 0); sess_pools_elt->sess_priv_pool = rte_mempool_create ( (char *) name, CRYPTODEV_NB_SESSION * (cmt->drivers_cnt), cmt->sess_sz, 0, @@ -358,6 +369,7 @@ allocate_session_pools (u32 numa_node, goto clear_mempools; } vec_free (name); +#endif clear_mempools: if (error) @@ -365,8 +377,10 @@ clear_mempools: vec_free (name); if (sess_pools_elt->sess_pool) rte_mempool_free (sess_pools_elt->sess_pool); +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) if (sess_pools_elt->sess_priv_pool) rte_mempool_free (sess_pools_elt->sess_priv_pool); +#endif return error; } return 0; @@ -380,13 +394,16 @@ cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx, cryptodev_numa_data_t *numa_data; cryptodev_inst_t *dev_inst; vnet_crypto_key_t *key = vnet_crypto_get_key (idx); - struct rte_mempool *sess_pool, *sess_priv_pool; + struct rte_mempool *sess_pool; cryptodev_session_pool_t *sess_pools_elt; cryptodev_key_t *ckey = vec_elt_at_index (cmt->keys, idx); struct rte_crypto_sym_xform xforms_enc[2] = { { 0 } }; struct rte_crypto_sym_xform xforms_dec[2] = { { 0 } }; - struct rte_cryptodev_sym_session *sessions[CRYPTODEV_N_OP_TYPES] = { 0 }; + cryptodev_session_t *sessions[CRYPTODEV_N_OP_TYPES] = { 0 }; +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) + struct rte_mempool *sess_priv_pool; struct rte_cryptodev_info dev_info; +#endif u32 numa_node = vm->numa_node; clib_error_t *error; int ret = 0; @@ -427,6 +444,7 @@ cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx, } sess_pool = sess_pools_elt->sess_pool; +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) sess_priv_pool = sess_pools_elt->sess_priv_pool; sessions[CRYPTODEV_OP_TYPE_ENCRYPT] = @@ -434,6 +452,7 @@ cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx, sessions[CRYPTODEV_OP_TYPE_DECRYPT] = rte_cryptodev_sym_session_create (sess_pool); +#endif if (key->type == VNET_CRYPTO_KEY_TYPE_LINK) ret = prepare_linked_xform (xforms_enc, CRYPTODEV_OP_TYPE_ENCRYPT, key); @@ -451,6 +470,25 @@ cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx, else prepare_aead_xform (xforms_dec, CRYPTODEV_OP_TYPE_DECRYPT, key, aad_len); +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + dev_inst = vec_elt_at_index (cmt->cryptodev_inst, 0); + u32 dev_id = dev_inst->dev_id; + sessions[CRYPTODEV_OP_TYPE_ENCRYPT] = + rte_cryptodev_sym_session_create (dev_id, xforms_enc, sess_pool); + sessions[CRYPTODEV_OP_TYPE_DECRYPT] = + rte_cryptodev_sym_session_create (dev_id, xforms_dec, sess_pool); + if (!sessions[CRYPTODEV_OP_TYPE_ENCRYPT] || + !sessions[CRYPTODEV_OP_TYPE_DECRYPT]) + { + ret = -1; + goto clear_key; + } + + rte_cryptodev_sym_session_opaque_data_set ( + sessions[CRYPTODEV_OP_TYPE_ENCRYPT], aad_len); + rte_cryptodev_sym_session_opaque_data_set ( + sessions[CRYPTODEV_OP_TYPE_DECRYPT], aad_len); +#else vec_foreach (dev_inst, cmt->cryptodev_inst) { u32 dev_id = dev_inst->dev_id; @@ -475,6 +513,7 @@ cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx, sessions[CRYPTODEV_OP_TYPE_ENCRYPT]->opaque_data = aad_len; sessions[CRYPTODEV_OP_TYPE_DECRYPT]->opaque_data = aad_len; +#endif CLIB_MEMORY_STORE_BARRIER (); ckey->keys[numa_node][CRYPTODEV_OP_TYPE_ENCRYPT] = @@ -724,6 +763,15 @@ cryptodev_configure (vlib_main_t *vm, u32 cryptodev_id) rte_cryptodev_info_get (cryptodev_id, &info); + /* Starting from DPDK 22.11, VPP does not allow heterogeneous crypto devices + anymore. Only devices that have the same driver type as the first + initialized device can be initialized. + */ +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + if (cmt->drivers_cnt == 1 && cmt->driver_id != info.driver_id) + return -1; +#endif + if (!(info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) return -1; @@ -737,7 +785,9 @@ cryptodev_configure (vlib_main_t *vm, u32 cryptodev_id) struct rte_cryptodev_qp_conf qp_cfg; qp_cfg.mp_session = 0; +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) qp_cfg.mp_session_private = 0; +#endif qp_cfg.nb_descriptors = CRYPTODEV_NB_CRYPTO_OPS; ret = rte_cryptodev_queue_pair_setup (cryptodev_id, i, &qp_cfg, @@ -756,16 +806,30 @@ cryptodev_configure (vlib_main_t *vm, u32 cryptodev_id) /* start the device */ rte_cryptodev_start (cryptodev_id); +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + if (cmt->drivers_cnt == 0) + { + cmt->drivers_cnt = 1; + cmt->driver_id = info.driver_id; + cmt->sess_sz = rte_cryptodev_sym_get_private_session_size (cryptodev_id); + } +#endif + for (i = 0; i < info.max_nb_queue_pairs; i++) { cryptodev_inst_t *cdev_inst; +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + const char *dev_name = rte_dev_name (info.device); +#else + const char *dev_name = info.device->name; +#endif vec_add2(cmt->cryptodev_inst, cdev_inst, 1); - cdev_inst->desc = vec_new (char, strlen (info.device->name) + 10); + cdev_inst->desc = vec_new (char, strlen (dev_name) + 10); cdev_inst->dev_id = cryptodev_id; cdev_inst->q_id = i; - snprintf (cdev_inst->desc, strlen (info.device->name) + 9, - "%s_q%u", info.device->name, i); + snprintf (cdev_inst->desc, strlen (dev_name) + 9, "%s_q%u", + info.device->name, i); } return 0; @@ -1097,6 +1161,7 @@ cryptodev_probe (vlib_main_t *vm, u32 n_workers) return 0; } +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) static void is_drv_unique (u32 driver_id, u32 **unique_drivers) { @@ -1115,6 +1180,7 @@ is_drv_unique (u32 driver_id, u32 **unique_drivers) if (!found) vec_add1 (*unique_drivers, driver_id); } +#endif clib_error_t * dpdk_cryptodev_init (vlib_main_t * vm) @@ -1123,15 +1189,12 @@ dpdk_cryptodev_init (vlib_main_t * vm) vlib_thread_main_t *tm = vlib_get_thread_main (); cryptodev_engine_thread_t *cet; cryptodev_numa_data_t *numa_data; - cryptodev_inst_t *dev_inst; - struct rte_cryptodev_info dev_info; u32 node; u8 nodes = 0; u32 skip_master = vlib_num_workers () > 0; u32 n_workers = tm->n_vlib_mains - skip_master; u32 eidx; u32 i; - u32 *unique_drivers = 0; clib_error_t *error; cmt->iova_mode = rte_eal_iova_mode (); @@ -1152,6 +1215,10 @@ dpdk_cryptodev_init (vlib_main_t * vm) if (cryptodev_probe (vm, n_workers) < 0) return 0; +#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0) + struct rte_cryptodev_info dev_info; + cryptodev_inst_t *dev_inst; + u32 *unique_drivers = 0; vec_foreach (dev_inst, cmt->cryptodev_inst) { u32 dev_id = dev_inst->dev_id; @@ -1166,6 +1233,7 @@ dpdk_cryptodev_init (vlib_main_t * vm) cmt->drivers_cnt = vec_len (unique_drivers); vec_free (unique_drivers); +#endif clib_bitmap_vec_validate (cmt->active_cdev_inst_mask, tm->n_vlib_mains); clib_spinlock_init (&cmt->tlock); |