Fix for TX and RX descriptor queue lockup
On admin up/down changes the TX and RX queues were getting locked up for VNET_DPDK_PMD_VMXNET3 interfaces. The fix is to ensure the interface is in admin down before touching the hardware. Change-Id: Ia264d95355a860607bff7ada00d2be48f91e6dd9 Signed-off-by: Todd Foggoa (tfoggoa) <tfoggoa@cisco.com>
This commit is contained in:
Georgi Savov
committed by
Gerrit Code Review
parent
679ea79515
commit
3a03598aab
@ -930,6 +930,17 @@ dpdk_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* DAW-FIXME: VMXNET3 device stop/start doesn't work,
|
||||
* therefore fake the stop in the dpdk driver by
|
||||
* silently dropping all of the incoming pkts instead of
|
||||
* stopping the driver / hardware.
|
||||
*/
|
||||
if (xd->pmd != VNET_DPDK_PMD_VMXNET3)
|
||||
xd->admin_up = 0;
|
||||
else
|
||||
xd->admin_up = ~0;
|
||||
|
||||
rte_eth_allmulticast_disable (xd->device_index);
|
||||
vnet_hw_interface_set_flags (vnm, xd->vlib_hw_if_index, 0);
|
||||
|
||||
@ -940,12 +951,7 @@ dpdk_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
|
||||
* stopping the driver / hardware.
|
||||
*/
|
||||
if (xd->pmd != VNET_DPDK_PMD_VMXNET3)
|
||||
{
|
||||
rte_eth_dev_stop (xd->device_index);
|
||||
xd->admin_up = 0;
|
||||
}
|
||||
else
|
||||
xd->admin_up = ~0;
|
||||
}
|
||||
|
||||
if (rv < 0)
|
||||
|
@ -325,6 +325,7 @@ vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index, u32 flag
|
||||
u32 mask;
|
||||
clib_error_t * error = 0;
|
||||
u32 is_create = (helper_flags & VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE) != 0;
|
||||
u32 old_flags;
|
||||
|
||||
mask = VNET_SW_INTERFACE_FLAG_ADMIN_UP | VNET_SW_INTERFACE_FLAG_PUNT;
|
||||
flags &= mask;
|
||||
@ -397,13 +398,32 @@ vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index, u32 flag
|
||||
vnet_hw_interface_class_t * hw_class = vnet_get_hw_interface_class (vnm, hi->hw_class_index);
|
||||
vnet_device_class_t * dev_class = vnet_get_device_class (vnm, hi->dev_class_index);
|
||||
|
||||
if (dev_class->admin_up_down_function
|
||||
&& (error = dev_class->admin_up_down_function (vnm, si->hw_if_index, flags)))
|
||||
goto done;
|
||||
/* save the si admin up flag */
|
||||
old_flags = si->flags;
|
||||
|
||||
if (hw_class->admin_up_down_function
|
||||
&& (error = hw_class->admin_up_down_function (vnm, si->hw_if_index, flags)))
|
||||
goto done;
|
||||
/* update si admin up flag in advance if we are going admin down */
|
||||
if (!(flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP))
|
||||
si->flags &= ~VNET_SW_INTERFACE_FLAG_ADMIN_UP;
|
||||
|
||||
if (dev_class->admin_up_down_function
|
||||
&& (error = dev_class->admin_up_down_function(vnm,
|
||||
si->hw_if_index,
|
||||
flags)))
|
||||
{
|
||||
/* restore si admin up flag to it's original state on errors */
|
||||
si->flags = old_flags;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (hw_class->admin_up_down_function
|
||||
&& (error = hw_class->admin_up_down_function(vnm,
|
||||
si->hw_if_index,
|
||||
flags)))
|
||||
{
|
||||
/* restore si admin up flag to it's original state on errors */
|
||||
si->flags = old_flags;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Admin down implies link down. */
|
||||
if (! (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
|
||||
|
Reference in New Issue
Block a user