• françois romieu's avatar
    r8169: fix Rx index race between FIFO overflow recovery and NAPI handler. · c7c2c39b
    françois romieu authored
    Since 92fc43b4, rtl8169_tx_timeout ends up
    resetting Rx and Tx indexes and thus racing with the NAPI handler via
    -> rtl8169_hw_reset
       -> rtl_hw_reset
          -> rtl8169_init_ring_indexes
    
    What about returning to the original state ?
    
    rtl_hw_reset is only used by rtl8169_hw_reset and rtl8169_init_one.
    
    The latter does not need rtl8169_init_ring_indexes because the indexes
    still contain their original values from the newly allocated network
    device private data area (i.e. 0).
    
    rtl8169_hw_reset is used by:
    1. rtl8169_down
       Helper for rtl8169_close. rtl8169_open explicitely inits the indexes
       anyway.
    2. rtl8169_pcierr_interrupt
       Indexes are set by rtl8169_reinit_task.
    3. rtl8169_interrupt
       rtl8169_hw_reset is needed when the device goes down. See 1.
    4. rtl_shutdown
       System shutdown handler. Indexes are irrelevant.
    5. rtl8169_reset_task
       Indexes must be set before rtl_hw_start is called.
    6. rtl8169_tx_timeout
       Indexes should not be set. This is the job of rtl8169_reset_task anyway.
    
    The removal of rtl8169_hw_reset in rtl8169_tx_timeout and its move in
    rtl8169_reset_task do not change the analysis.
    Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
    Cc: hayeswang <hayeswang@realtek.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c7c2c39b
r8169.c 149 KB