lkml.org 
[lkml]   [2021]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 19/35] net: watchdog: hold device global xmit lock during tx disable
    Date
    From: Edwin Peer <edwin.peer@broadcom.com>

    commit 3aa6bce9af0e25b735c9c1263739a5639a336ae8 upstream.

    Prevent netif_tx_disable() running concurrently with dev_watchdog() by
    taking the device global xmit lock. Otherwise, the recommended:

    netif_carrier_off(dev);
    netif_tx_disable(dev);

    driver shutdown sequence can happen after the watchdog has already
    checked carrier, resulting in possible false alarms. This is because
    netif_tx_lock() only sets the frozen bit without maintaining the locks
    on the individual queues.

    Fixes: c3f26a269c24 ("netdev: Fix lockdep warnings in multiqueue configurations.")
    Signed-off-by: Edwin Peer <edwin.peer@broadcom.com>
    Reviewed-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/linux/netdevice.h | 2 ++
    1 file changed, 2 insertions(+)

    --- a/include/linux/netdevice.h
    +++ b/include/linux/netdevice.h
    @@ -3428,6 +3428,7 @@ static inline void netif_tx_disable(stru

    local_bh_disable();
    cpu = smp_processor_id();
    + spin_lock(&dev->tx_global_lock);
    for (i = 0; i < dev->num_tx_queues; i++) {
    struct netdev_queue *txq = netdev_get_tx_queue(dev, i);

    @@ -3435,6 +3436,7 @@ static inline void netif_tx_disable(stru
    netif_tx_stop_queue(txq);
    __netif_tx_unlock(txq);
    }
    + spin_unlock(&dev->tx_global_lock);
    local_bh_enable();
    }


    \
     
     \ /
      Last update: 2021-02-22 14:36    [W:4.797 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site