mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-11 00:04:33 +08:00
r8169: remove member irq_enabled from struct rtl8169_private
After making use of the gro_flush_timeout attribute I once got a tx timeout due to an interrupt that wasn't handled. Seems using irq_enabled can be racy, and it's not needed any longer anyway, so remove it. I've never seen a report about such a race before, therefore treat the change as an improvement. There's just one small drawback: If a legacy PCI interrupt is used, and if this interrupt is shared with a device with high interrupt rate, then we may handle interrupts even if NAPI disabled them, and we may see a certain performance decrease under high network load. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
52dbe8465e
commit
9e89d71911
@ -617,7 +617,6 @@ struct rtl8169_private {
|
|||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
} wk;
|
} wk;
|
||||||
|
|
||||||
unsigned irq_enabled:1;
|
|
||||||
unsigned supports_gmii:1;
|
unsigned supports_gmii:1;
|
||||||
unsigned aspm_manageable:1;
|
unsigned aspm_manageable:1;
|
||||||
dma_addr_t counters_phys_addr;
|
dma_addr_t counters_phys_addr;
|
||||||
@ -1280,12 +1279,10 @@ static void rtl_irq_disable(struct rtl8169_private *tp)
|
|||||||
RTL_W32(tp, IntrMask_8125, 0);
|
RTL_W32(tp, IntrMask_8125, 0);
|
||||||
else
|
else
|
||||||
RTL_W16(tp, IntrMask, 0);
|
RTL_W16(tp, IntrMask, 0);
|
||||||
tp->irq_enabled = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl_irq_enable(struct rtl8169_private *tp)
|
static void rtl_irq_enable(struct rtl8169_private *tp)
|
||||||
{
|
{
|
||||||
tp->irq_enabled = 1;
|
|
||||||
if (rtl_is_8125(tp))
|
if (rtl_is_8125(tp))
|
||||||
RTL_W32(tp, IntrMask_8125, tp->irq_mask);
|
RTL_W32(tp, IntrMask_8125, tp->irq_mask);
|
||||||
else
|
else
|
||||||
@ -4541,8 +4538,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||||||
struct rtl8169_private *tp = dev_instance;
|
struct rtl8169_private *tp = dev_instance;
|
||||||
u32 status = rtl_get_events(tp);
|
u32 status = rtl_get_events(tp);
|
||||||
|
|
||||||
if (!tp->irq_enabled || (status & 0xffff) == 0xffff ||
|
if ((status & 0xffff) == 0xffff || !(status & tp->irq_mask))
|
||||||
!(status & tp->irq_mask))
|
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
if (unlikely(status & SYSErr)) {
|
if (unlikely(status & SYSErr)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user