• John Fastabend's avatar
    net: decreasing real_num_tx_queues needs to flush qdisc · f0796d5c
    John Fastabend authored
    Reducing real_num_queues needs to flush the qdisc otherwise
    skbs with queue_mappings greater then real_num_tx_queues can
    be sent to the underlying driver.
    
    The flow for this is,
    
    dev_queue_xmit()
    	dev_pick_tx()
    		skb_tx_hash()  => hash using real_num_tx_queues
    		skb_set_queue_mapping()
    	...
    	qdisc_enqueue_root() => enqueue skb on txq from hash
    ...
    dev->real_num_tx_queues -= n
    ...
    sch_direct_xmit()
    	dev_hard_start_xmit()
    		ndo_start_xmit(skb,dev) => skb queue set with old hash
    
    skbs are enqueued on the qdisc with skb->queue_mapping set
    0 < queue_mappings < real_num_tx_queues.  When the driver
    decreases real_num_tx_queues skb's may be dequeued from the
    qdisc with a queue_mapping greater then real_num_tx_queues.
    
    This fixes a case in ixgbe where this was occurring with DCB
    and FCoE. Because the driver is using queue_mapping to map
    skbs to tx descriptor rings we can potentially map skbs to
    rings that no longer exist.
    Signed-off-by: default avatarJohn Fastabend <john.r.fastabend@intel.com>
    Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f0796d5c
ixgbe_main.c 203 KB