From: Sui Jingfeng <sui.jingfeng@linux.dev>
To: Lucas Stach <l.stach@pengutronix.de>,
stable@vger.kernel.org, stable-commits@vger.kernel.org
Cc: Russell King <linux+etnaviv@armlinux.org.uk>,
Christian Gmeiner <christian.gmeiner@gmail.com>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
Subject: Re: Patch "drm/etnaviv: Drop the offset in page manipulation" has been added to the 6.12-stable tree
Date: Mon, 3 Feb 2025 18:53:17 +0800 [thread overview]
Message-ID: <2dfb1991-3030-4143-890b-83508d1b77e0@linux.dev> (raw)
In-Reply-To: <d8b6c3b4eda513277f19640c8f792c6d70b03f06.camel@pengutronix.de>
Hi,
On 2025/2/3 16:59, Lucas Stach wrote:
> Hi Sasha,
>
> Am Samstag, dem 01.02.2025 um 23:33 -0500 schrieb Sasha Levin:
>> This is a note to let you know that I've just added the patch titled
>>
>> drm/etnaviv: Drop the offset in page manipulation
>>
>> to the 6.12-stable tree which can be found at:
>> http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
>>
>> The filename of the patch is:
>> drm-etnaviv-drop-the-offset-in-page-manipulation.patch
>> and it can be found in the queue-6.12 subdirectory.
>>
>> If you, or anyone else, feels it should not be added to the stable tree,
>> please let <stable@vger.kernel.org> know about it.
>>
> please drop this patch and all its dependencies from all stable queues.
>
> While the code makes certain assumptions that are corrected in this
> patch, those assumptions are always true in all use-cases today.
Those patches are harmless even we apply them, and after apply my pitch,
it requires less CPU computation, right?
> I don't see a reason
I think, if 'sg->offset != 0' could happen or not is really matters here.
My argument was that the real data is stored at 'sg_dma_address(sg)', NOT
the 'sg_dma_address(sg) - sg->offset'.
As we can create a test that we store some kind of data at the middle of
a BO by the CPU, then map this BO with the MMU and ask the GPU fetch the
data. Do we really have a way tell the GPU to skip the leading garbage
data?
> to introduce this kind of churn to the stable trees
If I'm wrong or miss something, we can get them back, possibly with new
features, additional description, and comments for use-cases. My argument
just that we don't have good reasons to take the'sg->offset' into account
for now.
> to fix a theoretical issue.
The start PA of a buffer segment has been altered, but the corresponding
VA is not.
Maybe a approach has to guarantee correct in the theory first.
> Regards,
> Lucas
>
>>
>> commit cc5b6c4868e20f34d46e359930f0ca45a1cab9e3
>> Author: Sui Jingfeng <sui.jingfeng@linux.dev>
>> Date: Fri Nov 15 20:32:44 2024 +0800
>>
>> drm/etnaviv: Drop the offset in page manipulation
>>
>> [ Upstream commit 9aad03e7f5db7944d5ee96cd5c595c54be2236e6 ]
>>
>> The etnaviv driver, both kernel space and user space, assumes that GPU page
>> size is 4KiB. Its IOMMU map/unmap 4KiB physical address range once a time.
>> If 'sg->offset != 0' is true, then the current implementation will map the
>> IOVA to a wrong area, which may lead to coherency problem. Picture 0 and 1
>> give the illustration, see below.
>>
>> PA start drifted
>> |
>> |<--- 'sg_dma_address(sg) - sg->offset'
>> | .------ sg_dma_address(sg)
>> | | .---- sg_dma_len(sg)
>> |<-sg->offset->| |
>> V |<-->| Another one cpu page
>> +----+----+----+----+ +----+----+----+----+
>> |xxxx| |||||| |||||||||||||||||||||
>> +----+----+----+----+ +----+----+----+----+
>> ^ ^ ^ ^
>> |<--- da_len --->| | |
>> | | | |
>> | .--------------' | |
>> | | .----------------' |
>> | | | .----------------'
>> | | | |
>> | | +----+----+----+----+
>> | | |||||||||||||||||||||
>> | | +----+----+----+----+
>> | |
>> | '--------------. da_len = sg_dma_len(sg) + sg->offset, using
>> | | 'sg_dma_len(sg) + sg->offset' will lead to GPUVA
>> +----+ ~~~~~~~~~~~~~+ collision, but min_t(unsigned int, da_len, va_len)
>> |xxxx| | will clamp it to correct size. But the IOVA will
>> +----+ ~~~~~~~~~~~~~+ be redirect to wrong area.
>> ^
>> | Picture 0: Possibly wrong implementation.
>> GPUVA (IOVA)
>>
>> --------------------------------------------------------------------------
>>
>> .------- sg_dma_address(sg)
>> | .---- sg_dma_len(sg)
>> |<-sg->offset->| |
>> | |<-->| another one cpu page
>> +----+----+----+----+ +----+----+----+----+
>> | |||||| |||||||||||||||||||||
>> +----+----+----+----+ +----+----+----+----+
>> ^ ^ ^ ^
>> | | | |
>> .--------------' | | |
>> | | | |
>> | .--------------' | |
>> | | .----------------' |
>> | | | .----------------'
>> | | | |
>> +----+ +----+----+----+----+
>> |||||| ||||||||||||||||||||| The first one is SZ_4K, the second is SZ_16K
>> +----+ +----+----+----+----+
>> ^
>> | Picture 1: Perfectly correct implementation.
>> GPUVA (IOVA)
>>
>> If sg->offset != 0 is true, IOVA will be mapped to wrong physical address.
>> Either because there doesn't contain the data or there contains wrong data.
>> Strictly speaking, the memory area that before sg_dma_address(sg) doesn't
>> belong to us, and it's likely that the area is being used by other process.
>>
>> Because we don't want to introduce confusions about which part is visible
>> to the GPU, we assumes that the size of GPUVA is always 4KiB aligned. This
>> is very relaxed requirement, since we already made the decision that GPU
>> page size is 4KiB (as a canonical decision). And softpin feature is landed,
>> Mesa's util_vma_heap_alloc() will certainly report correct length of GPUVA
>> to kernel with desired alignment ensured.
>>
>> With above statements agreed, drop the "offset in page" manipulation will
>> return us a correct implementation at any case.
>>
>> Fixes: a8c21a5451d8 ("drm/etnaviv: add initial etnaviv DRM driver")
>> Signed-off-by: Sui Jingfeng <sui.jingfeng@linux.dev>
>> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
>> Signed-off-by: Sasha Levin <sashal@kernel.org>
>>
>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
>> index a382920ae2be0..b7c09fc86a2cc 100644
>> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
>> @@ -82,8 +82,8 @@ static int etnaviv_iommu_map(struct etnaviv_iommu_context *context,
>> return -EINVAL;
>>
>> for_each_sgtable_dma_sg(sgt, sg, i) {
>> - phys_addr_t pa = sg_dma_address(sg) - sg->offset;
>> - unsigned int da_len = sg_dma_len(sg) + sg->offset;
>> + phys_addr_t pa = sg_dma_address(sg);
>> + unsigned int da_len = sg_dma_len(sg);
>> unsigned int bytes = min_t(unsigned int, da_len, va_len);
>>
>> VERB("map[%d]: %08x %pap(%x)", i, iova, &pa, bytes);
--
Best regards,
Sui
next prev parent reply other threads:[~2025-02-03 10:53 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250202043355.1913248-1-sashal@kernel.org>
2025-02-03 8:59 ` Patch "drm/etnaviv: Drop the offset in page manipulation" has been added to the 6.12-stable tree Lucas Stach
2025-02-03 9:29 ` Greg KH
2025-02-03 9:38 ` Lucas Stach
2025-02-04 17:48 ` Greg KH
2025-02-03 10:53 ` Sui Jingfeng [this message]
2025-02-03 11:14 ` Lucas Stach
2025-02-03 15:32 ` Sui Jingfeng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2dfb1991-3030-4143-890b-83508d1b77e0@linux.dev \
--to=sui.jingfeng@linux.dev \
--cc=airlied@gmail.com \
--cc=christian.gmeiner@gmail.com \
--cc=l.stach@pengutronix.de \
--cc=linux+etnaviv@armlinux.org.uk \
--cc=simona@ffwll.ch \
--cc=stable-commits@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox