net: macb: Fix race caused by flushing unwanted descriptors
authorYaron Micher <yaronm@hailo.ai>
Thu, 10 Nov 2022 17:31:34 +0000 (19:31 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 28 Nov 2022 18:06:40 +0000 (13:06 -0500)
commitd1559435d7f03517c7306e1c43e2ef497479f34b
tree6f82c3650790b832de8f918ad25a0c2ee40424b2
parentd6abc7e2e027956eb0b5e73bb2be5cf995b15ae6
net: macb: Fix race caused by flushing unwanted descriptors

The rx descriptor list is in cached memory, and there may be multiple
descriptors per cache-line. After reclaim_rx_buffers marks a descriptor
as unused it does a cache flush, which causes the entire cache-line to
be written to memory, which may override other descriptors in the same
cache-line that the controller may have written to.

The fix skips freeing descriptors that are not the last in a cache-line,
and if the freed descriptor is the last one in a cache-line, it marks
all the descriptors in the cache-line as unused.
This is similarly to what is done in drivers/net/fec_mxc.c

In my case this bug caused tftpboot to fail some times when other
packets are sent to u-boot in addition to the ongoing tftp (e.g. ping).
The driver would stop receiving new packets because it is waiting
on a descriptor that is marked unused, when in reality the descriptor
contains a new unprocessed packet but while freeing the previous buffer
descriptor & flushing the cache, the driver accidentally marked the
descriptor as unused.

Signed-off-by: Yaron Micher <yaronm@hailo.ai>
drivers/net/macb.c