Re: [PATCH 7/9] Input: n64joy - Fix DMA buffer alignment.
From: Jonathan Cameron <jic23@kernel.org>
Date: 2022-11-27 17:48:51
On Sun, 27 Nov 2022 18:48:44 +0200 Lauri Kasanen [off-list ref] wrote:
On Sun, 27 Nov 2022 14:41:14 +0000 Jonathan Cameron [off-list ref] wrote:quoted
From: Jonathan Cameron <Jonathan.Cameron@huawei.com> The use of ____cacheline_aligned to ensure a buffer is DMA safe only enforces the start of the buffer alignment. In this case, sufficient alignment is already ensured by the use of kzalloc(). ____cacheline_aligned does not ensure that no other members of the structure are placed in the same cacheline after the end of the buffer marked. Thus to ensure a DMA safe buffer it must be at the end of the structure.This move is unnecessary, because the cacheline is 16 bytes and the buffer is 64 bytes.
Ah. That particular option hadn't occurred to me (and I'd failed to notice how big the buffer is :( ). The marking isn't needed at all then as the allocation is already guaranteed to be sufficiently aligned. However, maybe that is a bit subtle and having some sort of marking is useful. Curious question though, why is the buffer so big? Each struct joydata is 8 bytes I think, but the driver only accesses 4 of them. Is the hardware putting garbage into the remaining 2 cachelines or is there something subtle going on? Or given my earlier success, maybe I'm misreading the code entirely. Jonathan
quoted
Whilst here switch from ____cacheline_aligned to __aligned(ARCH_KMALLOC_MINALIGN) as on some architectures, with variable sized cacheline lines across their cache hierarchy, require this greater alignment guarantee for DMA safety. Make this change throughout the driver as it reduces need for a reader to know about the particular architecture.This change looks ok. - Lauri