]> www.infradead.org Git - users/jedix/linux-maple.git/commit
r8169: fix Rx index race between FIFO overflow recovery and NAPI handler.
authorfrançois romieu <romieu@fr.zoreil.com>
Sun, 4 Dec 2011 20:30:52 +0000 (20:30 +0000)
committerJoe Jin <joe.jin@oracle.com>
Fri, 18 May 2012 03:14:48 +0000 (11:14 +0800)
commit9df72878311cd13dcc85ea2ab66f89213b21e7ee
tree7c226875e79af5d36f249e028b30295182411709
parent7edd6c800e8c386238b0ef9d3a77dc8fd154111d
r8169: fix Rx index race between FIFO overflow recovery and NAPI handler.

Since 92fc43b4159b518f5baae57301f26d770b0834c9, 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.

(cherry picked from commit c7c2c39be8ed4e503e987151f4599455060e219a)
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: hayeswang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/r8169.c