On 2/23/20 3:00 AM, Antti Seppälä wrote:
Hi Guenter,
On Wed, 19 Feb 2020 at 23:11, Guenter Roeck <linux@xxxxxxxxxxxx> wrote:
Yes, those patches didn't address the core problem. Can you test with the
attached two patches ?
Thanks,
Guenter
I took a look at your patch (usb: dwc2: Simplify DMA alignment code)
and I don't believe it is correct.
The patch re-introduces the dma_aligned_buffer struct and takes some
care to align the beginning of the struct to dma cache lines. However
we should be aligning the data[0] pointer inside the struct instead.
With the code in the patch data[0] gets pushed to be at an offset from
the alignment by kmalloc_ptr and old_xfer_buffer pointers. In other
words data[0] is now not aligned to dma cache boundaries.
I thought so too initially. However,
temp = PTR_ALIGN(kmalloc_ptr + 1, TEGRA_USB_DMA_ALIGN) - 1;
aligns the structure pointer such that its _end_ is DMA-aligned,
which is ->data[0].
Just to be sure, I'll add some debug code warning me if data[0] is
not DMA aligned.
Reviewing the code got me thinking that what if we stopped playing
with the alignment hacks altogether and hit the issue with a heavier
hammer instead? Attached you can find a new patch that introduces a
list to keep track of the allocations. The code then looks up the
entry from the list when it is time to restore the original pointer.
This way the allocations for the aligned dma area and the original
pointer are separate and no corruptions should occur.
Thoughts, comments? I should note that the patch has received only
light testing and not very thorough thinking. I can prepare a proper
patch to be sent inline if the idea seems worth exploring further.