net/nfp: cancel delayed LSC work in port close
The link state change interrupt handler of the NFP PMD will delay the
actual LSC work for a short period to ensure the link is stable. If the
link of the port changes state and the port is closed immediately after
the link event then a segmentation fault will occur. This happens
because the delayed LSC work eventually triggers and this logic will try
to access private port data that had been released when the port was
closed.
Fixes: 6c53f87b34
("nfp: add link status interrupt")
Cc: stable@dpdk.org
Signed-off-by: Heinrich Kuhn <heinrich.kuhn@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
This commit is contained in:
parent
7483341ae5
commit
851f03e1ea
@ -898,7 +898,7 @@ nfp_net_irq_unmask(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void
|
||||
void
|
||||
nfp_net_dev_interrupt_delayed_handler(void *param)
|
||||
{
|
||||
struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
|
||||
|
@ -376,6 +376,7 @@ void nfp_net_params_setup(struct nfp_net_hw *hw);
|
||||
void nfp_net_cfg_queue_setup(struct nfp_net_hw *hw);
|
||||
void nfp_eth_copy_mac(uint8_t *dst, const uint8_t *src);
|
||||
void nfp_net_dev_interrupt_handler(void *param);
|
||||
void nfp_net_dev_interrupt_delayed_handler(void *param);
|
||||
int nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
|
||||
int nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask);
|
||||
int nfp_net_reta_update(struct rte_eth_dev *dev,
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <rte_memzone.h>
|
||||
#include <rte_mempool.h>
|
||||
#include <rte_service_component.h>
|
||||
#include <rte_alarm.h>
|
||||
#include "eal_firmware.h"
|
||||
|
||||
#include "nfpcore/nfp_cpp.h"
|
||||
@ -307,6 +308,10 @@ nfp_net_close(struct rte_eth_dev *dev)
|
||||
nfp_net_reset_rx_queue(this_rx_q);
|
||||
}
|
||||
|
||||
/* Cancel possible impending LSC work here before releasing the port*/
|
||||
rte_eal_alarm_cancel(nfp_net_dev_interrupt_delayed_handler,
|
||||
(void *)dev);
|
||||
|
||||
/* Only free PF resources after all physical ports have been closed */
|
||||
/* Mark this port as unused and free device priv resources*/
|
||||
nn_cfg_writeb(hw, NFP_NET_CFG_LSC, 0xff);
|
||||
|
@ -13,6 +13,8 @@
|
||||
* Netronome vNIC VF DPDK Poll-Mode Driver: Main entry point
|
||||
*/
|
||||
|
||||
#include <rte_alarm.h>
|
||||
|
||||
#include "nfpcore/nfp_mip.h"
|
||||
#include "nfpcore/nfp_rtsym.h"
|
||||
|
||||
@ -230,6 +232,10 @@ nfp_netvf_close(struct rte_eth_dev *dev)
|
||||
nfp_net_dev_interrupt_handler,
|
||||
(void *)dev);
|
||||
|
||||
/* Cancel possible impending LSC work here before releasing the port*/
|
||||
rte_eal_alarm_cancel(nfp_net_dev_interrupt_delayed_handler,
|
||||
(void *)dev);
|
||||
|
||||
/*
|
||||
* The ixgbe PMD driver disables the pcie master on the
|
||||
* device. The i40e does not...
|
||||
|
Loading…
Reference in New Issue
Block a user