dpdk: refactor device setup

Type: improvement
Change-Id: I9772088bca176fd0fdb162677ec55c59aa8f3adf
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2022-01-13 00:28:14 +01:00
parent f8dd9d8af1
commit 549838c81b
7 changed files with 334 additions and 546 deletions

View File

@@ -134,6 +134,7 @@ add_vpp_plugin(dpdk
device/cli.c
device/common.c
device/device.c
device/driver.c
device/flow.c
device/format.c
device/init.c

View File

@@ -547,7 +547,7 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
xd->num_subifs--;
/* currently we program VLANS only for IXGBE VF */
if (xd->pmd != VNET_DPDK_PMD_IXGBEVF)
if (xd->driver->program_vlans == 0)
goto done;
if (t->sub.eth.flags.no_tags == 1)

View File

@@ -45,79 +45,6 @@ extern vnet_device_class_t dpdk_device_class;
extern vlib_node_registration_t dpdk_input_node;
extern vlib_node_registration_t admin_up_down_process_node;
#if RTE_VERSION < RTE_VERSION_NUM(20, 8, 0, 0)
#define DPDK_MLX5_PMD_NAME "net_mlx5"
#else
#define DPDK_MLX5_PMD_NAME "mlx5_pci"
#endif
#define foreach_dpdk_pmd \
_ ("net_thunderx", THUNDERX) \
_ ("net_e1000_em", E1000EM) \
_ ("net_e1000_igb", IGB) \
_ ("net_e1000_igb_vf", IGBVF) \
_ ("net_ixgbe", IXGBE) \
_ ("net_ixgbe_vf", IXGBEVF) \
_ ("net_i40e", I40E) \
_ ("net_i40e_vf", I40EVF) \
_ ("net_ice", ICE) \
_ ("net_iavf", IAVF) \
_ ("net_igc", IGC) \
_ ("net_virtio", VIRTIO) \
_ ("net_enic", ENIC) \
_ ("net_vmxnet3", VMXNET3) \
_ ("AF_PACKET PMD", AF_PACKET) \
_ ("net_fm10k", FM10K) \
_ ("net_cxgbe", CXGBE) \
_ ("net_mlx4", MLX4) \
_ (DPDK_MLX5_PMD_NAME, MLX5) \
_ ("net_dpaa2", DPAA2) \
_ ("net_virtio_user", VIRTIO_USER) \
_ ("net_vhost", VHOST_ETHER) \
_ ("net_ena", ENA) \
_ ("net_failsafe", FAILSAFE) \
_ ("net_liovf", LIOVF_ETHER) \
_ ("net_qede", QEDE) \
_ ("net_netvsc", NETVSC) \
_ ("net_bnxt", BNXT)
typedef enum
{
VNET_DPDK_PMD_NONE,
#define _(s,f) VNET_DPDK_PMD_##f,
foreach_dpdk_pmd
#undef _
VNET_DPDK_PMD_UNKNOWN, /* must be last */
} dpdk_pmd_t;
#define forach_dpdk_port_type \
_ (ETH_1G, "GigabitEthernet") \
_ (ETH_2_5G, "Two_FiveGigabitEthernet") \
_ (ETH_5G, "FiveGigabitEthernet") \
_ (ETH_10G, "TenGigabitEthernet") \
_ (ETH_20G, "TwentyGigabitEthernet") \
_ (ETH_25G, "TwentyFiveGigabitEthernet") \
_ (ETH_40G, "FortyGigabitEthernet") \
_ (ETH_50G, "FiftyGigabitEthernet") \
_ (ETH_56G, "FiftySixGigabitEthernet") \
_ (ETH_100G, "HundredGigabitEthernet") \
_ (ETH_200G, "TwoHundredGigabitEthernet") \
_ (ETH_SWITCH, "EthernetSwitch") \
_ (ETH_VF, "VirtualFunctionEthernet") \
_ (AF_PACKET, "af_packet") \
_ (VIRTIO_USER, "VirtioUser") \
_ (VHOST_ETHER, "VhostEthernet") \
_ (FAILSAFE, "FailsafeEthernet") \
_ (NETVSC, "NetVSC")
typedef enum
{
VNET_DPDK_PORT_TYPE_UNKNOWN = 0,
#define _(n, s) VNET_DPDK_PORT_TYPE_##n,
forach_dpdk_port_type
#undef _
} dpdk_port_type_t;
typedef uint16_t dpdk_portid_t;
#define foreach_dpdk_device_flags \
@@ -133,12 +60,12 @@ typedef uint16_t dpdk_portid_t;
_ (13, INT_SUPPORTED, "int-supported") \
_ (14, INT_UNMASKABLE, "int-unmaskable")
enum
typedef enum
{
#define _(a, b, c) DPDK_DEVICE_FLAG_##b = (1 << a),
foreach_dpdk_device_flags
#undef _
};
} dpdk_device_flag_t;
typedef struct
{
@@ -169,6 +96,31 @@ typedef struct
clib_spinlock_t lock;
} dpdk_tx_queue_t;
typedef struct
{
const char *name;
const char *desc;
} dpdk_driver_name_t;
typedef struct
{
dpdk_driver_name_t *drivers;
const char *interface_name_prefix;
u16 n_rx_desc;
u16 n_tx_desc;
u32 supported_flow_actions;
i32 enable_lsc_int : 1;
i32 enable_rxq_int : 1;
i32 disable_rx_scatter : 1;
i32 program_vlans : 1;
i32 mq_mode_none : 1;
i32 interface_number_from_port_id : 1;
i32 use_intel_phdr_cksum : 1;
i32 int_unmaskable : 1;
} dpdk_driver_t;
dpdk_driver_t *dpdk_driver_find (const char *name, const char **desc);
typedef union
{
struct
@@ -216,15 +168,15 @@ typedef struct
/* DPDK device port number */
dpdk_portid_t port_id;
dpdk_pmd_t pmd:8;
i8 cpu_socket;
CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
u64 enabled_tx_off;
u64 enabled_rx_off;
dpdk_driver_t *driver;
u8 *name;
u8 *interface_name_suffix;
const char *if_desc;
/* number of sub-interfaces */
u16 num_subifs;
@@ -244,7 +196,6 @@ typedef struct
struct rte_eth_stats last_stats;
struct rte_eth_xstat *xstats;
f64 time_last_stats_update;
dpdk_port_type_t port_type;
/* mac address */
u8 *default_mac_address;

View File

@@ -16,8 +16,6 @@
#define DPDK_NB_RX_DESC_DEFAULT 1024
#define DPDK_NB_TX_DESC_DEFAULT 1024
#define DPDK_MAX_LRO_SIZE_DEFAULT 65536
#define DPDK_NB_RX_DESC_VIRTIO 256
#define DPDK_NB_TX_DESC_VIRTIO 256
/* These args appear by themselves */
#define foreach_eal_double_hyphen_predicate_arg \

View File

@@ -0,0 +1,145 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright(c) 2021 Cisco Systems, Inc.
*/
#include <vlib/vlib.h>
#include <dpdk/device/dpdk.h>
static const u32 supported_flow_actions_intel =
(VNET_FLOW_ACTION_MARK | VNET_FLOW_ACTION_REDIRECT_TO_NODE |
VNET_FLOW_ACTION_REDIRECT_TO_QUEUE | VNET_FLOW_ACTION_BUFFER_ADVANCE |
VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP | VNET_FLOW_ACTION_RSS);
#define DPDK_DRIVERS(...) \
(dpdk_driver_name_t[]) \
{ \
__VA_ARGS__, {} \
}
static dpdk_driver_t dpdk_drivers[] = {
{
.drivers = DPDK_DRIVERS ({ "net_ice", "Intel E810 Family" },
{ "net_igc", "Intel I225 2.5G Family" },
{ "net_e1000_igb", "Intel e1000" },
{ "net_e1000_em", "Intel 82540EM (e1000)" }),
.enable_rxq_int = 1,
.supported_flow_actions = supported_flow_actions_intel,
.use_intel_phdr_cksum = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_ixgbe", "Intel 82599" }),
.enable_rxq_int = 1,
.program_vlans = 1,
.supported_flow_actions = supported_flow_actions_intel,
.use_intel_phdr_cksum = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_i40e", "Intel X710/XL710 Family" }),
.enable_rxq_int = 1,
.supported_flow_actions = supported_flow_actions_intel,
.use_intel_phdr_cksum = 1,
.int_unmaskable = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_liovf", "Cavium Lio VF" },
{ "net_thunderx", "Cavium ThunderX" }),
.interface_name_prefix = "VirtualFunctionEthernet",
},
{
.drivers = DPDK_DRIVERS ({ "net_iavf", "Intel iAVF" },
{ "net_i40e_vf", "Intel X710/XL710 Family VF" }),
.interface_name_prefix = "VirtualFunctionEthernet",
.supported_flow_actions = supported_flow_actions_intel,
.use_intel_phdr_cksum = 1,
.int_unmaskable = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_e1000_igb_vf", "Intel e1000 VF" },
{ "net_ixgbe_vf", "Intel 82599 VF" }),
.interface_name_prefix = "VirtualFunctionEthernet",
.use_intel_phdr_cksum = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_dpaa2", "NXP DPAA2 Mac" }),
.interface_name_prefix = "TenGigabitEthernet",
},
{
.drivers =
DPDK_DRIVERS ({ "net_fm10k", "Intel FM10000 Family Ethernet Switch" }),
.interface_name_prefix = "EthernetSwitch",
},
{
.drivers = DPDK_DRIVERS ({ "net_cxgbe", "Chelsio T4/T5" }),
.interface_number_from_port_id = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_mlx4", "Mellanox ConnectX-3 Family" },
{ "net_qede", "Cavium QLogic FastLinQ QL4xxxx" },
{ "net_bnxt", "Broadcom NetXtreme E/S-Series" }),
},
{
.drivers = DPDK_DRIVERS ({ "net_virtio_user", "Virtio User" }),
.interface_name_prefix = "VirtioUser",
},
{
.drivers = DPDK_DRIVERS ({ "net_vhost", "VhostEthernet" }),
.interface_name_prefix = "VhostEthernet",
},
{
.drivers = DPDK_DRIVERS ({ "mlx5_pci", "Mellanox ConnectX-4 Family" },
{ "net_enic", "Cisco VIC" }),
.use_intel_phdr_cksum = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_failsafe", "FailsafeEthernet" }),
.interface_name_prefix = "FailsafeEthernet",
.enable_lsc_int = 1,
},
{
.drivers = DPDK_DRIVERS ({ "AF_PACKET PMD", "af_packet" }),
.interface_name_prefix = "af_packet",
},
{
.drivers = DPDK_DRIVERS ({ "net_netvsc", "Microsoft Hyper-V Netvsc" }),
.interface_name_prefix = "NetVSC",
},
{
.drivers = DPDK_DRIVERS ({ "net_ena", "AWS ENA VF" }),
.interface_name_prefix = "VirtualFunctionEthernet",
.enable_rxq_int = 1,
.disable_rx_scatter = 1,
},
{
.drivers = DPDK_DRIVERS ({ "net_vmxnet3", "VMware VMXNET3" }),
.interface_name_prefix = "GigabitEthernet",
},
{
.drivers = DPDK_DRIVERS ({ "net_virtio", "Red Hat Virtio" }),
.interface_name_prefix = "GigabitEthernet",
.n_rx_desc = 256,
.n_tx_desc = 256,
.mq_mode_none = 1,
}
};
dpdk_driver_t *
dpdk_driver_find (const char *name, const char **desc)
{
for (int i = 0; i < ARRAY_LEN (dpdk_drivers); i++)
{
dpdk_driver_t *dr = dpdk_drivers + i;
dpdk_driver_name_t *dn = dr->drivers;
while (dn->name)
{
if (name && !strcmp (name, dn->name))
{
*desc = dn->desc;
return dr;
}
dn++;
}
}
return 0;
}

View File

@@ -147,49 +147,14 @@
#define foreach_dpdk_pkt_dyn_rx_offload_flag \
_ (RX_TIMESTAMP, 0, "Timestamp field is valid")
static char *device_name_by_port_type[] = {
#define _(n, s) [VNET_DPDK_PORT_TYPE_##n] = (s),
forach_dpdk_port_type
#undef _
};
u8 *
format_dpdk_device_name (u8 * s, va_list * args)
{
dpdk_main_t *dm = &dpdk_main;
char *devname_format;
char *device_name = 0;
u32 i = va_arg (*args, u32);
dpdk_device_t *xd = vec_elt_at_index (dm->devices, i);
struct rte_eth_dev_info dev_info;
struct rte_pci_device *pci_dev;
u8 *ret;
if (xd->name)
return format (s, "%s", xd->name);
if (dm->conf->interface_name_format_decimal)
devname_format = "%s%d/%d/%d";
else
devname_format = "%s%x/%x/%x";
if (xd->port_type < ARRAY_LEN (device_name_by_port_type))
device_name = device_name_by_port_type[xd->port_type];
device_name = device_name ? device_name : "UnknownEthernet";
rte_eth_dev_info_get (xd->port_id, &dev_info);
pci_dev = dpdk_get_pci_device (&dev_info);
if (pci_dev && xd->port_type != VNET_DPDK_PORT_TYPE_FAILSAFE)
ret = format (s, devname_format, device_name, pci_dev->addr.bus,
pci_dev->addr.devid, pci_dev->addr.function);
else
ret = format (s, "%s%d", device_name, xd->port_id);
if (xd->interface_name_suffix)
return format (ret, "/%s", xd->interface_name_suffix);
return ret;
return format (s, "%v", xd->name);
}
u8 *
@@ -211,126 +176,12 @@ static u8 *
format_dpdk_device_type (u8 * s, va_list * args)
{
dpdk_main_t *dm = &dpdk_main;
char *dev_type;
u32 i = va_arg (*args, u32);
switch (dm->devices[i].pmd)
{
case VNET_DPDK_PMD_E1000EM:
dev_type = "Intel 82540EM (e1000)";
break;
case VNET_DPDK_PMD_IGB:
dev_type = "Intel e1000";
break;
case VNET_DPDK_PMD_I40E:
dev_type = "Intel X710/XL710 Family";
break;
case VNET_DPDK_PMD_I40EVF:
dev_type = "Intel X710/XL710 Family VF";
break;
case VNET_DPDK_PMD_ICE:
dev_type = "Intel E810 Family";
break;
case VNET_DPDK_PMD_IAVF:
dev_type = "Intel iAVF";
break;
case VNET_DPDK_PMD_FM10K:
dev_type = "Intel FM10000 Family Ethernet Switch";
break;
case VNET_DPDK_PMD_IGBVF:
dev_type = "Intel e1000 VF";
break;
case VNET_DPDK_PMD_VIRTIO:
dev_type = "Red Hat Virtio";
break;
case VNET_DPDK_PMD_IXGBEVF:
dev_type = "Intel 82599 VF";
break;
case VNET_DPDK_PMD_IXGBE:
dev_type = "Intel 82599";
break;
case VNET_DPDK_PMD_ENIC:
dev_type = "Cisco VIC";
break;
case VNET_DPDK_PMD_CXGBE:
dev_type = "Chelsio T4/T5";
break;
case VNET_DPDK_PMD_MLX4:
dev_type = "Mellanox ConnectX-3 Family";
break;
case VNET_DPDK_PMD_MLX5:
dev_type = "Mellanox ConnectX-4 Family";
break;
case VNET_DPDK_PMD_VMXNET3:
dev_type = "VMware VMXNET3";
break;
case VNET_DPDK_PMD_AF_PACKET:
dev_type = "af_packet";
break;
case VNET_DPDK_PMD_DPAA2:
dev_type = "NXP DPAA2 Mac";
break;
case VNET_DPDK_PMD_VIRTIO_USER:
dev_type = "Virtio User";
break;
case VNET_DPDK_PMD_THUNDERX:
dev_type = "Cavium ThunderX";
break;
case VNET_DPDK_PMD_VHOST_ETHER:
dev_type = "VhostEthernet";
break;
case VNET_DPDK_PMD_ENA:
dev_type = "AWS ENA VF";
break;
case VNET_DPDK_PMD_FAILSAFE:
dev_type = "FailsafeEthernet";
break;
case VNET_DPDK_PMD_LIOVF_ETHER:
dev_type = "Cavium Lio VF";
break;
case VNET_DPDK_PMD_QEDE:
dev_type = "Cavium QLogic FastLinQ QL4xxxx";
break;
case VNET_DPDK_PMD_NETVSC:
dev_type = "Microsoft Hyper-V Netvsc";
break;
case VNET_DPDK_PMD_BNXT:
dev_type = "Broadcom NetXtreme E/S-Series";
break;
default:
case VNET_DPDK_PMD_UNKNOWN:
dev_type = "### UNKNOWN ###";
break;
}
return format (s, dev_type);
if (dm->devices[i].if_desc)
return format (s, dm->devices[i].if_desc);
else
return format (s, "### UNKNOWN ###");
}
static u8 *

File diff suppressed because it is too large Load Diff