summaryrefslogtreecommitdiffstats
path: root/src/plugins/dpdk/device/init.c
diff options
context:
space:
mode:
authorRui Cai <rucai@microsoft.com>2018-05-11 22:55:33 +0000
committerDamjan Marion <dmarion@me.com>2018-05-31 22:01:15 +0000
commita059a000f81a7251ffed2821f69dd96cfd94c8c7 (patch)
treed3674736007fbd45b61dc79de030ce5c53cf49a1 /src/plugins/dpdk/device/init.c
parentcb91e603bc82083fc762206edfe4530f993a6c36 (diff)
dpdk: Decoupling the meaning of xd->device_index in dpdk_plugin
Prior to the change, dpdk plugin assumes xd->device_index is used both as index for internal dpdk_main->devices array and DPDK port index to call into DPDK APIs. However, when running on top of Failsafe PMDs, DPDK port index range may no longer be contiguous (as noted: http://dpdk.org/ml/archives/dev/2018-March/092375.html for related changes in DPDK). Because this, dpdk plugin can no longer iterate through all available DPDK ports with a for 0->rte_eth_dev_count() loop and the assumption of device_index no longer holds. This is part of initial effort to enable vpp running over dpdk on failsafe PMD in Microsoft Azure(3/4). Change-Id: I416fd80f2d40e12e139f8f3492814da98343eae7 Signed-off-by: Rui Cai <rucai@microsoft.com>
Diffstat (limited to 'src/plugins/dpdk/device/init.c')
-rw-r--r--src/plugins/dpdk/device/init.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c
index d7c369a9c80..b5a8e3bcd4b 100644
--- a/src/plugins/dpdk/device/init.c
+++ b/src/plugins/dpdk/device/init.c
@@ -107,9 +107,9 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
{
if (xd->flags & DPDK_DEVICE_FLAG_PROMISC)
- rte_eth_promiscuous_enable (xd->device_index);
+ rte_eth_promiscuous_enable (xd->port_id);
else
- rte_eth_promiscuous_disable (xd->device_index);
+ rte_eth_promiscuous_disable (xd->port_id);
}
}
else if (ETHERNET_INTERFACE_FLAG_CONFIG_MTU (flags))
@@ -254,7 +254,8 @@ dpdk_lib_init (dpdk_main_t * dm)
vnet_buffer (&ptd->buffer_template)->sw_if_index[VLIB_TX] = (u32) ~ 0;
}
- for (i = 0; i < nports; i++)
+ /* *INDENT-OFF* */
+ RTE_ETH_FOREACH_DEV(i)
{
u8 addr[6];
u8 vlan_strip = 0;
@@ -507,8 +508,8 @@ dpdk_lib_init (dpdk_main_t * dm)
if (xd->tx_q_used < tm->n_vlib_mains)
dpdk_device_lock_init (xd);
+ xd->port_id = i;
xd->device_index = xd - dm->devices;
- ASSERT (i == xd->device_index);
xd->per_interface_next_index = ~0;
/* assign interface to input thread */
@@ -621,12 +622,10 @@ dpdk_lib_init (dpdk_main_t * dm)
{
int i;
q = 0;
- /* *INDENT-OFF* */
clib_bitmap_foreach (i, devconf->workers, ({
vnet_hw_interface_assign_rx_thread (dm->vnet_main, xd->hw_if_index, q++,
vdm->first_worker_thread_index + i);
}));
- /* *INDENT-ON* */
}
else
for (q = 0; q < xd->rx_q_used; q++)
@@ -684,10 +683,10 @@ dpdk_lib_init (dpdk_main_t * dm)
if (vlan_strip)
{
int vlan_off;
- vlan_off = rte_eth_dev_get_vlan_offload (xd->device_index);
+ vlan_off = rte_eth_dev_get_vlan_offload (xd->port_id);
vlan_off |= ETH_VLAN_STRIP_OFFLOAD;
xd->port_conf.rxmode.hw_vlan_strip = vlan_off;
- if (rte_eth_dev_set_vlan_offload (xd->device_index, vlan_off) == 0)
+ if (rte_eth_dev_set_vlan_offload (xd->port_id, vlan_off) == 0)
dpdk_log_info ("VLAN strip enabled for interface\n");
else
dpdk_log_warn ("VLAN strip cannot be supported by interface\n");
@@ -702,8 +701,9 @@ dpdk_lib_init (dpdk_main_t * dm)
if (dm->conf->no_multi_seg)
mtu = mtu > ETHER_MAX_LEN ? ETHER_MAX_LEN : mtu;
- rte_eth_dev_set_mtu (xd->device_index, mtu);
+ rte_eth_dev_set_mtu (xd->port_id, mtu);
}
+ /* *INDENT-ON* */
if (nb_desc > dm->conf->num_mbufs)
dpdk_log_err ("%d mbufs allocated but total rx/tx ring size is %d\n",
@@ -1377,7 +1377,7 @@ dpdk_update_link_state (dpdk_device_t * xd, f64 now)
xd->time_last_link_update = now ? now : xd->time_last_link_update;
memset (&xd->link, 0, sizeof (xd->link));
- rte_eth_link_get_nowait (xd->device_index, &xd->link);
+ rte_eth_link_get_nowait (xd->port_id, &xd->link);
if (LINK_STATE_ELOGS)
{
@@ -1509,6 +1509,7 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
dpdk_device_t *xd;
vlib_thread_main_t *tm = vlib_get_thread_main ();
int i;
+ int j;
error = dpdk_lib_init (dm);
@@ -1535,10 +1536,19 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
int nports = rte_eth_dev_count ();
if (nports > 0)
{
- for (i = 0; i < nports; i++)
+ /* *INDENT-OFF* */
+ RTE_ETH_FOREACH_DEV(i)
{
- xd = &dm->devices[i];
- ASSERT (i == xd->device_index);
+ xd = NULL;
+ for (j = 0; j < nports; j++)
+ {
+ if (dm->devices[j].port_id == i)
+ {
+ xd = &dm->devices[j];
+ }
+ }
+ ASSERT (xd != NULL);
+
if (xd->pmd == VNET_DPDK_PMD_BOND)
{
u8 addr[6];
@@ -1625,6 +1635,7 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
}
}
}
+ /* *INDENT-ON* */
}
}