public inbox for linux-s390@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/2] mm/gup: pgtable entry acccessors cleanup
@ 2026-04-20 12:13 Alexander Gordeev
  2026-04-20 12:13 ` [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions Alexander Gordeev
  2026-04-20 12:13 ` [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation Alexander Gordeev
  0 siblings, 2 replies; 5+ messages in thread
From: Alexander Gordeev @ 2026-04-20 12:13 UTC (permalink / raw)
  To: Kevin Brodsky, David Hildenbrand, Ryan Roberts, Andrew Morton
  Cc: linux-s390, linux-mm, linux-kernel, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik

Hi All,

This rework is necessary to allow a KASAN PTE access sanitizer
(so far s390-only) that hits on direct PTE entries dereferences,
like pte = *ptep as opposed to pte = ptep_get(ptep).

I am not posting the sanitizer itself (yet), since it does not
fly without the suggested patches, but I am not sure whether
these changes make sense for the generic case.

Thus, sending it as a RFC.

Thanks!

Alexander Gordeev (2):
  mm/gup: add missing pXdp_get() conversions
  mm/gup: add lockless access semantics on entries validation

 mm/gup.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

-- 
2.51.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions
  2026-04-20 12:13 [RFC PATCH 0/2] mm/gup: pgtable entry acccessors cleanup Alexander Gordeev
@ 2026-04-20 12:13 ` Alexander Gordeev
  2026-04-20 19:28   ` David Hildenbrand (Arm)
  2026-04-20 12:13 ` [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation Alexander Gordeev
  1 sibling, 1 reply; 5+ messages in thread
From: Alexander Gordeev @ 2026-04-20 12:13 UTC (permalink / raw)
  To: Kevin Brodsky, David Hildenbrand, Ryan Roberts, Andrew Morton
  Cc: linux-s390, linux-mm, linux-kernel, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik

PMD and PUD entries revalidation has the same semantics as
PTE entry revalidation. Convert the remaining direct entry
dereferences to the corresponding pXdp_get() accessors.

Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
---
 mm/gup.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/mm/gup.c b/mm/gup.c
index 8e7dc2c6ee73..d149a4b0df71 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2865,7 +2865,7 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		if (!folio)
 			goto pte_unmap;
 
-		if (unlikely(pmd_val(pmd) != pmd_val(*pmdp)) ||
+		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get(pmdp))) ||
 		    unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) {
 			gup_put_folio(folio, 1, flags);
 			goto pte_unmap;
@@ -2942,7 +2942,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (!folio)
 		return 0;
 
-	if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
+	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get(pmdp)))) {
 		gup_put_folio(folio, refs, flags);
 		return 0;
 	}
@@ -2985,7 +2985,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	if (!folio)
 		return 0;
 
-	if (unlikely(pud_val(orig) != pud_val(*pudp))) {
+	if (unlikely(pud_val(orig) != pud_val(pudp_get(pudp)))) {
 		gup_put_folio(folio, refs, flags);
 		return 0;
 	}
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation
  2026-04-20 12:13 [RFC PATCH 0/2] mm/gup: pgtable entry acccessors cleanup Alexander Gordeev
  2026-04-20 12:13 ` [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions Alexander Gordeev
@ 2026-04-20 12:13 ` Alexander Gordeev
  2026-04-20 19:29   ` David Hildenbrand (Arm)
  1 sibling, 1 reply; 5+ messages in thread
From: Alexander Gordeev @ 2026-04-20 12:13 UTC (permalink / raw)
  To: Kevin Brodsky, David Hildenbrand, Ryan Roberts, Andrew Morton
  Cc: linux-s390, linux-mm, linux-kernel, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik

The PTE validation in gup_fast_pte_range() is inconsistent with the
prior value acquisition in the sense that it drops the lockless
access semantics.

Although this is highly unlikely, prevent a future scenario in which
a semantically mismatching ptep_get() incorrectly yields the same
result as the preceding ptep_get_lockless(), while ptep_get_lockless()
would otherwise return a different value.

Likewise the PMD validation is inconsistent with the prior value
acquisition in gup_fast_pmd_range().

Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
---
 mm/gup.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/mm/gup.c b/mm/gup.c
index d149a4b0df71..236450feea9a 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2865,8 +2865,8 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		if (!folio)
 			goto pte_unmap;
 
-		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get(pmdp))) ||
-		    unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) {
+		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get_lockless(pmdp))) ||
+		    unlikely(pte_val(pte) != pte_val(ptep_get_lockless(ptep)))) {
 			gup_put_folio(folio, 1, flags);
 			goto pte_unmap;
 		}
@@ -2942,7 +2942,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (!folio)
 		return 0;
 
-	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get(pmdp)))) {
+	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get_lockless(pmdp)))) {
 		gup_put_folio(folio, refs, flags);
 		return 0;
 	}
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions
  2026-04-20 12:13 ` [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions Alexander Gordeev
@ 2026-04-20 19:28   ` David Hildenbrand (Arm)
  0 siblings, 0 replies; 5+ messages in thread
From: David Hildenbrand (Arm) @ 2026-04-20 19:28 UTC (permalink / raw)
  To: Alexander Gordeev, Kevin Brodsky, Ryan Roberts, Andrew Morton
  Cc: linux-s390, linux-mm, linux-kernel, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik

On 4/20/26 14:13, Alexander Gordeev wrote:
> PMD and PUD entries revalidation has the same semantics as
> PTE entry revalidation. Convert the remaining direct entry
> dereferences to the corresponding pXdp_get() accessors.
> 
> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
> ---
>  mm/gup.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/gup.c b/mm/gup.c
> index 8e7dc2c6ee73..d149a4b0df71 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -2865,7 +2865,7 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
>  		if (!folio)
>  			goto pte_unmap;
>  
> -		if (unlikely(pmd_val(pmd) != pmd_val(*pmdp)) ||
> +		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get(pmdp))) ||
>  		    unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) {
>  			gup_put_folio(folio, 1, flags);
>  			goto pte_unmap;
> @@ -2942,7 +2942,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
>  	if (!folio)
>  		return 0;
>  
> -	if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
> +	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get(pmdp)))) {
>  		gup_put_folio(folio, refs, flags);
>  		return 0;
>  	}
> @@ -2985,7 +2985,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
>  	if (!folio)
>  		return 0;
>  
> -	if (unlikely(pud_val(orig) != pud_val(*pudp))) {
> +	if (unlikely(pud_val(orig) != pud_val(pudp_get(pudp)))) {
>  		gup_put_folio(folio, refs, flags);
>  		return 0;
>  	}

These are all on lockless code paths. Shouldn't we be using the lockless
pte/pmd variants?

(not a matter of correctness, rather a matter of semantics)

-- 
Cheers,

David

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation
  2026-04-20 12:13 ` [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation Alexander Gordeev
@ 2026-04-20 19:29   ` David Hildenbrand (Arm)
  0 siblings, 0 replies; 5+ messages in thread
From: David Hildenbrand (Arm) @ 2026-04-20 19:29 UTC (permalink / raw)
  To: Alexander Gordeev, Kevin Brodsky, Ryan Roberts, Andrew Morton
  Cc: linux-s390, linux-mm, linux-kernel, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik

On 4/20/26 14:13, Alexander Gordeev wrote:
> The PTE validation in gup_fast_pte_range() is inconsistent with the
> prior value acquisition in the sense that it drops the lockless
> access semantics.
> 
> Although this is highly unlikely, prevent a future scenario in which
> a semantically mismatching ptep_get() incorrectly yields the same
> result as the preceding ptep_get_lockless(), while ptep_get_lockless()
> would otherwise return a different value.
> 
> Likewise the PMD validation is inconsistent with the prior value
> acquisition in gup_fast_pmd_range().
> 
> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
> ---
>  mm/gup.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/gup.c b/mm/gup.c
> index d149a4b0df71..236450feea9a 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -2865,8 +2865,8 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
>  		if (!folio)
>  			goto pte_unmap;
>  
> -		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get(pmdp))) ||
> -		    unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) {
> +		if (unlikely(pmd_val(pmd) != pmd_val(pmdp_get_lockless(pmdp))) ||
> +		    unlikely(pte_val(pte) != pte_val(ptep_get_lockless(ptep)))) {
>  			gup_put_folio(folio, 1, flags);
>  			goto pte_unmap;
>  		}
> @@ -2942,7 +2942,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
>  	if (!folio)
>  		return 0;
>  
> -	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get(pmdp)))) {
> +	if (unlikely(pmd_val(orig) != pmd_val(pmdp_get_lockless(pmdp)))) {
>  		gup_put_folio(folio, refs, flags);
>  		return 0;
>  	}

Oh, that should be squashed into #1 :)

-- 
Cheers,

David

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-04-20 19:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-20 12:13 [RFC PATCH 0/2] mm/gup: pgtable entry acccessors cleanup Alexander Gordeev
2026-04-20 12:13 ` [RFC PATCH 1/2] mm/gup: add missing pXdp_get() conversions Alexander Gordeev
2026-04-20 19:28   ` David Hildenbrand (Arm)
2026-04-20 12:13 ` [RFC PATCH 2/2] mm/gup: add lockless access semantics on entries validation Alexander Gordeev
2026-04-20 19:29   ` David Hildenbrand (Arm)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox