Re: [PATCH net] net: stmmac: Stop using a single dma_map() for multiple descriptors

From: Andrew Lunn
Date: Tue Sep 10 2024 - 12:04:35 EST


> On Mon, Sep 02, 2024 at 03:24:36PM GMT, Suraj Jaiswal wrote:
> > Currently same page address is shared
> > between multiple buffer addresses and causing smmu fault for other
> > descriptor if address hold by one descriptor got cleaned.
> > Allocate separate buffer address for each descriptor for TSO path so
> > that if one descriptor cleared it should not clean other descriptor
> > address.
>
> I think maybe you mean something like:
>
> Currently in the TSO case a page is mapped with dma_map_single(), and then
> the resulting dma address is referenced (and offset) by multiple
> descriptors until the whole region is programmed into the descriptors.
>
> This makes it possible for stmmac_tx_clean() to dma_unmap() the first of the
> already processed descriptors, while the rest are still being processed
> by the DMA engine. This leads to an iommu fault due to the DMA engine using
> unmapped memory as seen below:
>
> <insert splat>
>
> You can reproduce this easily by <reproduction steps>.
>
> To fix this, let's map each descriptor's memory reference individually.
> This way there's no risk of unmapping a region that's still being
> referenced by the DMA engine in a later descriptor.
>
> That's a bit nitpicky wording wise, but your first sentence is hard for me to follow (buffer addresses seems to mean descriptor?). I think showing a splat and mentioning how to reproduce is always a bonus as well.

What might also be interesting is some benchmark
numbers. dma_map_single() is not always cheap, since it has to flush
the cache. I've no idea if only the first call is expensive, and all
the subsequent calls are cheap? Depending on how expensive it is, some
sort of refcounting might be cheaper?

Andrew