diff options
author | françois romieu <romieu@fr.zoreil.com> | 2011-12-04 20:30:52 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-05 18:31:42 -0500 |
commit | c7c2c39be8ed4e503e987151f4599455060e219a (patch) | |
tree | 19104da1775a78e824ff50bda26495797af77553 /drivers/net/xen-netback/netback.c | |
parent | 811fd3010cf512f2e23e6c4c912aad54516dc706 (diff) | |
download | op-kernel-dev-c7c2c39be8ed4e503e987151f4599455060e219a.zip op-kernel-dev-c7c2c39be8ed4e503e987151f4599455060e219a.tar.gz |
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.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: hayeswang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
0 files changed, 0 insertions, 0 deletions