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
This commit is contained in:
Xinyao Cai
2023-04-12 18:35:23 +08:00
committed by Damjan Marion
parent 140ca0fa95
commit efad24a84d
10 changed files with 201 additions and 34 deletions

View File

@ -0,0 +1,54 @@
From baa172f1a9e370a0549a31840c3cd148046d1d84 Mon Sep 17 00:00:00 2001
From: Xinyao Cai <xinyao.cai@intel.com>
Date: Tue, 18 Apr 2023 16:37:17 +0800
Subject: [PATCH] allow the use of -a and -b flag the same time in EAL
parameters.
---
lib/eal/common/eal_common_options.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index 0305933698..0d8f9c5a38 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -1623,24 +1623,15 @@ int
eal_parse_common_option(int opt, const char *optarg,
struct internal_config *conf)
{
- static int b_used;
- static int a_used;
-
switch (opt) {
case 'b':
- if (a_used)
- goto ba_conflict;
if (eal_option_device_add(RTE_DEVTYPE_BLOCKED, optarg) < 0)
return -1;
- b_used = 1;
break;
case 'a':
- if (b_used)
- goto ba_conflict;
if (eal_option_device_add(RTE_DEVTYPE_ALLOWED, optarg) < 0)
return -1;
- a_used = 1;
break;
/* coremask */
case 'c': {
@@ -1929,11 +1920,6 @@ eal_parse_common_option(int opt, const char *optarg,
}
return 0;
-
-ba_conflict:
- RTE_LOG(ERR, EAL,
- "Options allow (-a) and block (-b) can't be used at the same time\n");
- return -1;
}
static void
--
2.34.1

View File

@ -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);

View File

@ -81,10 +81,16 @@ typedef enum
CRYPTODEV_N_OP_TYPES,
} cryptodev_op_type_t;
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
typedef void cryptodev_session_t;
#else
typedef struct rte_cryptodev_sym_session cryptodev_session_t;
#endif
/* Cryptodev session data, one data per direction per numa */
typedef struct
{
struct rte_cryptodev_sym_session ***keys;
cryptodev_session_t ***keys;
} cryptodev_key_t;
/* Replicate DPDK rte_cryptodev_sym_capability structure with key size ranges
@ -125,7 +131,9 @@ typedef struct
typedef struct
{
struct rte_mempool *sess_pool;
#if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0)
struct rte_mempool *sess_priv_pool;
#endif
} cryptodev_session_pool_t;
typedef struct
@ -163,7 +171,7 @@ typedef struct
u16 aad_index;
u8 *aad_buf;
u64 aad_phy_addr;
struct rte_cryptodev_sym_session *reset_sess;
cryptodev_session_t *reset_sess;
};
};
u16 cryptodev_id;
@ -184,6 +192,9 @@ typedef struct
u32 sess_sz;
u32 drivers_cnt;
u8 is_raw_api;
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
u8 driver_id;
#endif
} cryptodev_main_t;
extern cryptodev_main_t cryptodev_main;

View File

@ -127,7 +127,7 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
clib_pmalloc_main_t *pm = vm->physmem_main.pmalloc_main;
cryptodev_engine_thread_t *cet = cmt->per_thread_data + vm->thread_index;
vnet_crypto_async_frame_elt_t *fe;
struct rte_cryptodev_sym_session *sess = 0;
cryptodev_session_t *sess = 0;
cryptodev_op_t **cop;
u32 *bi;
u32 n_enqueue, n_elts;
@ -246,7 +246,7 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
clib_pmalloc_main_t *pm = vm->physmem_main.pmalloc_main;
cryptodev_engine_thread_t *cet = cmt->per_thread_data + vm->thread_index;
vnet_crypto_async_frame_elt_t *fe;
struct rte_cryptodev_sym_session *sess = 0;
cryptodev_session_t *sess = 0;
cryptodev_op_t **cop;
u32 *bi;
u32 n_enqueue = 0, n_elts;
@ -306,8 +306,13 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
}
}
else if (PREDICT_FALSE (
key->keys[vm->numa_node][op_type]->opaque_data !=
aad_len))
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
rte_cryptodev_sym_session_opaque_data_get (
key->keys[vm->numa_node][op_type]) != (u64) aad_len
#else
key->keys[vm->numa_node][op_type]->opaque_data != aad_len
#endif
))
{
cryptodev_sess_handler (vm, VNET_CRYPTO_KEY_OP_DEL,
fe->key_index, aad_len);

View File

@ -292,8 +292,13 @@ cryptodev_raw_aead_enqueue (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
}
if (PREDICT_FALSE (
(u8) key->keys[vm->numa_node][op_type]->opaque_data !=
aad_len))
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
rte_cryptodev_sym_session_opaque_data_get (
key->keys[vm->numa_node][op_type]) != (u64) aad_len
#else
(u8) key->keys[vm->numa_node][op_type]->opaque_data != aad_len
#endif
))
{
cryptodev_sess_handler (vm, VNET_CRYPTO_KEY_OP_DEL,
fe->key_index, aad_len);

View File

@ -134,11 +134,6 @@ dpdk_device_setup (dpdk_device_t * xd)
dpdk_log_debug ("[%u] Configured TX offloads: %U", xd->port_id,
format_dpdk_tx_offload_caps, txo);
/* Enable flow director when flows exist */
if (xd->supported_flow_actions &&
(xd->flags & DPDK_DEVICE_FLAG_RX_FLOW_OFFLOAD) != 0)
conf.fdir_conf.mode = RTE_FDIR_MODE_PERFECT;
/* finalize configuration */
conf.rxmode.offloads = rxo;
conf.txmode.offloads = txo;
@ -487,7 +482,11 @@ dpdk_get_pci_device (const struct rte_eth_dev_info *info)
const struct rte_bus *bus;
bus = rte_bus_find_by_device (info->device);
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
if (bus && !strcmp (rte_bus_name (bus), "pci"))
#else
if (bus && !strcmp (bus->name, "pci"))
#endif
return RTE_DEV_TO_PCI (info->device);
else
return NULL;
@ -500,7 +499,11 @@ dpdk_get_vmbus_device (const struct rte_eth_dev_info *info)
const struct rte_bus *bus;
bus = rte_bus_find_by_device (info->device);
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
if (bus && !strcmp (rte_bus_name (bus), "vmbus"))
#else
if (bus && !strcmp (bus->name, "vmbus"))
#endif
return container_of (info->device, struct rte_vmbus_device, device);
else
return NULL;

View File

@ -28,6 +28,15 @@
#include <rte_ethdev.h>
#include <rte_version.h>
#include <rte_net.h>
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
#include <rte_bus.h>
#include <rte_pci.h>
#include <ctype.h>
#include <bus_driver.h>
#include <bus_pci_driver.h>
#include <bus_vmbus_driver.h>
#endif
#include <vnet/devices/devices.h>

View File

@ -36,6 +36,7 @@ _(proc-type) \
_(file-prefix) \
_(vdev) \
_(log-level) \
_(block) \
_(iova-mode) \
_(base-virtaddr)
/* clang-format on */

View File

@ -384,6 +384,16 @@ format_dpdk_rte_device (u8 *s, va_list *args)
if (!d)
return format (s, "not available");
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
s =
format (s, "name: %s, numa: %d", rte_dev_name (d), rte_dev_numa_node (d));
if (rte_dev_driver (d))
s = format (s, ", driver: %s", rte_driver_name (rte_dev_driver (d)));
if (rte_dev_bus (d))
s = format (s, ", bus: %s", rte_bus_name (rte_dev_bus (d)));
#else
s = format (s, "name: %s, numa: %d", d->name, d->numa_node);
if (d->driver)
@ -391,6 +401,7 @@ format_dpdk_rte_device (u8 *s, va_list *args)
if (d->bus)
s = format (s, ", bus: %s", d->bus->name);
#endif
return s;
}
@ -421,9 +432,15 @@ format_dpdk_device (u8 * s, va_list * args)
format_white_space, indent + 2, format_dpdk_link_status, xd);
s = format (s, "%Uflags: %U\n",
format_white_space, indent + 2, format_dpdk_device_flags, xd);
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
if (rte_dev_devargs (di.device) && rte_dev_devargs (di.device)->args)
s = format (s, "%UDevargs: %s\n", format_white_space, indent + 2,
rte_dev_devargs (di.device)->args);
#else
if (di.device->devargs && di.device->devargs->args)
s = format (s, "%UDevargs: %s\n",
format_white_space, indent + 2, di.device->devargs->args);
#endif
s = format (s,
"%Urx: queues %d (max %d), desc %d "
"(min %d max %d align %d)\n",

View File

@ -205,8 +205,12 @@ dpdk_find_startup_config (struct rte_eth_dev_info *di)
if ((vmbus_dev = dpdk_get_vmbus_device (di)))
{
unformat_input_t input_vmbus;
unformat_init_string (&input_vmbus, di->device->name,
strlen (di->device->name));
#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
const char *dev_name = rte_dev_name (di->device);
#else
const char *dev_name = di->device->name;
#endif
unformat_init_string (&input_vmbus, dev_name, strlen (dev_name));
if (unformat (&input_vmbus, "%U", unformat_vlib_vmbus_addr, &vmbus_addr))
p = mhash_get (&dm->conf->device_config_index_by_vmbus_addr,
&vmbus_addr);
@ -997,7 +1001,6 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
int eal_no_hugetlb = 0;
u8 no_pci = 0;
u8 no_vmbus = 0;
u8 no_dsa = 0;
u8 file_prefix = 0;
u8 *socket_mem = 0;
u8 *huge_dir_path = 0;
@ -1108,8 +1111,6 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
tmp = format (0, "--no-pci%c", 0);
vec_add1 (conf->eal_init_args, tmp);
}
else if (unformat (input, "no-dsa"))
no_dsa = 1;
else if (unformat (input, "blacklist %U", unformat_vlib_vmbus_addr,
&vmbus_addr))
{
@ -1319,13 +1320,6 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
vm = vlib_get_main ();
if (no_dsa)
{
struct rte_bus *bus;
bus = rte_bus_find_by_name ("dsa");
if (bus)
rte_bus_unregister (bus);
}
/* make copy of args as rte_eal_init tends to mess up with arg array */
for (i = 1; i < vec_len (conf->eal_init_args); i++)
conf->eal_init_args_str = format (conf->eal_init_args_str, "%s ",