Re: [PATCH 04/10] net/macb: Fix a race in macb_start_xmit()

From: David Miller
Date: Wed Sep 05 2012 - 17:30:59 EST


From: Nicolas Ferre <nicolas.ferre@xxxxxxxxx>
Date: Wed, 5 Sep 2012 10:19:11 +0200

> From: Havard Skinnemoen <havard@xxxxxxxxxxxxxx>
>
> Fix a race in macb_start_xmit() where we unconditionally set the TSTART bit.
> If an underrun just happened (we do this with interrupts disabled, so it might
> not have been handled yet), the controller starts transmitting from the first
> entry in the ring, which is usually wrong.
> Restart the controller after error handling.
>
> Signed-off-by: Havard Skinnemoen <havard@xxxxxxxxxxxxxx>
> [nicolas.ferre@xxxxxxxxx: split patch in topics]
> Signed-off-by: Nicolas Ferre <nicolas.ferre@xxxxxxxxx>

Accumulating special case code and checks into the hot path of TX packet
processing is extremely unwise.

Instead, when you handle the TX error conditions and reset the chip you
should first ensure that there are no flows of control in the transmit
function of your driver by using the appropriate locking et al. facilities.

For example, you can quiesce the transmit path by handling the chip error
interrupt as follows:

1) Disable chip interrupt generation.

2) Schedule a workqueue so you can process the reset outside of hard
interrupt context.

3) In the workqueue function, disable NAPI and perform a
netif_tx_disable() to guarentee there are no threads of
execution trying to queue up packets for TX into the driver.

4) Perform your chip reset and whatever else is necessary.

5) Re-enable NAPI and TX.

Then you don't need any special checks in your xmit method at all.


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/