diff options
author | Sudarsana Reddy Kalluru <skalluru@marvell.com> | 2019-02-06 14:43:45 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-06 16:53:33 -0800 |
commit | 0aa4febb420d91df5b56b1864a2465765da85f4b (patch) | |
tree | b50f69ac73d7040e6c08bfb15f65e92ac4bebd59 /drivers/net/ethernet/qlogic/qede/qede_fp.c | |
parent | fb1faab74ddef9ec2d841d54e5d0912a097b3abe (diff) | |
download | linux-0aa4febb420d91df5b56b1864a2465765da85f4b.tar.gz linux-0aa4febb420d91df5b56b1864a2465765da85f4b.tar.bz2 linux-0aa4febb420d91df5b56b1864a2465765da85f4b.zip |
qede: Fix system crash on configuring channels.
Under heavy traffic load, when changing number of channels via
ethtool (ethtool -L) which will cause interface to be reloaded,
it was observed that some packets gets transmitted on old TX
channel/queue id which doesn't really exist after the channel
configuration leads to system crash.
Add a safeguard in the driver by validating queue id through
ndo_select_queue() which is called before the ndo_start_xmit().
Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
Signed-off-by: Ariel Elior <aelior@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qede/qede_fp.c')
-rw-r--r-- | drivers/net/ethernet/qlogic/qede/qede_fp.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c index bdf816fe5a16..31b046e24565 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_fp.c +++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c @@ -1695,6 +1695,19 @@ netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev) return NETDEV_TX_OK; } +u16 qede_select_queue(struct net_device *dev, struct sk_buff *skb, + struct net_device *sb_dev, + select_queue_fallback_t fallback) +{ + struct qede_dev *edev = netdev_priv(dev); + int total_txq; + + total_txq = QEDE_TSS_COUNT(edev) * edev->dev_info.num_tc; + + return QEDE_TSS_COUNT(edev) ? + fallback(dev, skb, NULL) % total_txq : 0; +} + /* 8B udp header + 8B base tunnel header + 32B option length */ #define QEDE_MAX_TUN_HDR_LEN 48 |