All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ankur Arora <ankur.a.arora@oracle.com>
To: Lance Yang <ioworker0@gmail.com>
Cc: david@kernel.org, akpm@linux-foundation.org,
	ankur.a.arora@oracle.com, boris.ostrovsky@oracle.com,
	bp@alien8.de, chleroy@kernel.org, dave.hansen@linux.intel.com,
	hpa@zytor.com, konrad.wilk@oracle.com,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	luto@kernel.org, mingo@redhat.com, mjguzik@gmail.com,
	peterz@infradead.org, raghavendra.kt@amd.com, tglx@linutronix.de,
	willy@infradead.org, x86@kernel.org,
	Lance Yang <lance.yang@linux.dev>
Subject: Re: [PATCH v9 2/7] mm: introduce clear_pages() and clear_user_pages()
Date: Fri, 28 Nov 2025 13:59:08 -0800	[thread overview]
Message-ID: <87ms456cpf.fsf@oracle.com> (raw)
In-Reply-To: <20251128101329.86934-1-ioworker0@gmail.com>


Lance Yang <ioworker0@gmail.com> writes:

> From: Lance Yang <lance.yang@linux.dev>
>
>
> On Mon, 24 Nov 2025 11:26:56 +0100, David Hildenbrand (Red Hat) wrote:
>> Replying here while I am already at it.
>>
>> >> +#ifndef clear_pages
>> >> +/**
>> >> + * clear_pages() - clear a page range for kernel-internal use.
>> >> + * @addr: start address
>> >> + * @npages: number of pages
>> >> + *
>> >> + * Use clear_user_pages() instead when clearing a page range to be
>> >> + * mapped to user space.
>> >> + *
>> >> + * Does absolutely no exception handling.
>> >> + */
>> >> +static inline void clear_pages(void *addr, unsigned int npages)
>> >> +{
>> >> +	do {
>> >> +		clear_page(addr);
>> >> +		addr += PAGE_SIZE;
>> >> +	} while (--npages);
>> >
>> > Why a 'do while' instead of a 'while' ?
>>
>> More efficient when we know that npages > 0.
>>
>> >
>> > Are you certain that this function will never ever be called with a nul
>> > npages ?
>>
>> That is the expectation here, yes. We should probably document that
>> expectation.
>>
>> >
>> >> +}
>> >> +#endif
>> >> +
>> >>    #ifndef clear_user_page
>> >>    /**
>> >>     * clear_user_page() - clear a page to be mapped to user space
>> >> @@ -3901,6 +3921,27 @@ static inline void clear_user_page(void *addr, unsigned long vaddr, struct page
>> >>    }
>> >>    #endif
>> >>
>> >> +/**
>> >> + * clear_user_pages() - clear a page range to be mapped to user space
>> >> + * @addr: start address
>> >> + * @vaddr: start address of the user mapping
>> >> + * @page: start page
>> >> + * @npages: number of pages
>> >> + *
>> >> + * Assumes that the region (@addr, +@npages) has been validated
>> >> + * already so this does no exception handling.
>> >> + */
>> >> +#ifdef clear_user_pages
>> >> +void clear_user_pages(void *addr, unsigned long vaddr,
>> >> +		struct page *page, unsigned int npages);
>> >
>> > By doing this you forbid architectures to define it as a static inline,
>> > is that wanted ?
>>
>> Note that this is not the intention. The intention is to either use a
>> direct mapping to clear_pages(), or fallback to the variant in mm/util.c.
>>
>> The architecture is currently never expected to provide clear_user_pages().
>>
>> Wondering if we can make that cleaner.
>>
>> I'm wondering if the dependency on highmem.h here in mm.h is rather the
>> problem.
>>
>> How I hate this macro crap with arch overrides.
>>
>> >
>> >> +#else
>> >> +static inline void clear_user_pages(void *addr, unsigned long vaddr,
>> >> +		struct page *page, unsigned int npages)
>> >> +{
>> >> +	clear_pages(addr, npages);
>> >> +}
>> >> +#endif
>> >> +
>> >>    #ifdef __HAVE_ARCH_GATE_AREA
>> >>    extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
>> >>    extern int in_gate_area_no_mm(unsigned long addr);
>> >> diff --git a/mm/util.c b/mm/util.c
>> >> index 8989d5767528..3c6cd44db1bd 100644
>> >> --- a/mm/util.c
>> >> +++ b/mm/util.c
>> >> @@ -1344,3 +1344,16 @@ bool page_range_contiguous(const struct page *page, unsigned long nr_pages)
>> >>    }
>> >>    EXPORT_SYMBOL(page_range_contiguous);
>> >>    #endif
>> >> +
>> >> +#ifdef clear_user_page
>> >> +void clear_user_pages(void *addr,
>> >
>> > What happens if clear_user_page is defined but not clear_user_pages ? In
>> > that case it seems like the definition in linux/mm.h will conflict.
>>
>> The generic mm.h variant will not set clear_user_page() and consequently
>> we map directly to clear_pages().
>
> Hmm, I suspect there might be a subtle issue with the build flow on SPARC ...
>
> Inside include/linux/mm.h, the guard checks for clear_user_pages (plural).
> Since SPARC doesn't define that, the header provides the static inline
> fallback.
>
> However, mm/util.c includes that header. And since SPARC does define
> clear_user_page (singular), the .c file proceeds to compile the non-static
> definition as well.
>
> Wouldn't that result in the compiler seeing both a static inline and a
> non-static definition in the same translation unit? It seems like this
> would trigger a redefinition error ...

Yeah it would.

I had only posted the linux/highmem.h header bits for brevity but the
full patch removes the mm/util.c bits.

Sorry about the confusion.

--
ankur


  reply	other threads:[~2025-11-28 21:59 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-21 20:23 [PATCH v9 0/7] mm: folio_zero_user: clear contiguous pages Ankur Arora
2025-11-21 20:23 ` [PATCH v9 1/7] treewide: provide a generic clear_user_page() variant Ankur Arora
2025-11-23 11:53   ` Christophe Leroy (CS GROUP)
2025-11-24 10:17     ` David Hildenbrand (Red Hat)
2025-11-24 14:02       ` David Hildenbrand (Red Hat)
2025-11-25  7:52       ` Ankur Arora
2025-11-27 23:57         ` Ankur Arora
2025-11-28  7:39           ` Christophe Leroy (CS GROUP)
2025-11-28 22:19             ` Ankur Arora
2025-11-21 20:23 ` [PATCH v9 2/7] mm: introduce clear_pages() and clear_user_pages() Ankur Arora
2025-11-21 22:48   ` kernel test robot
2025-11-23 13:17   ` Christophe Leroy (CS GROUP)
2025-11-24 10:26     ` David Hildenbrand (Red Hat)
2025-11-28 10:13       ` Lance Yang
2025-11-28 21:59         ` Ankur Arora [this message]
2025-11-21 20:23 ` [PATCH v9 3/7] mm/highmem: introduce clear_user_highpages() Ankur Arora
2025-11-21 20:23 ` [PATCH v9 4/7] x86/mm: Simplify clear_page_* Ankur Arora
2025-11-25 13:47   ` Borislav Petkov
2025-11-25 19:01     ` Ankur Arora
2025-11-26 10:01   ` Mateusz Guzik
2025-11-27  5:28     ` Ankur Arora
2025-11-21 20:23 ` [PATCH v9 5/7] x86/clear_page: Introduce clear_pages() Ankur Arora
2025-11-21 20:23 ` [PATCH v9 6/7] mm, folio_zero_user: support clearing page ranges Ankur Arora
2025-11-21 20:23 ` [PATCH v9 7/7] mm: folio_zero_user: cache neighbouring pages Ankur Arora

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=87ms456cpf.fsf@oracle.com \
    --to=ankur.a.arora@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=chleroy@kernel.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=hpa@zytor.com \
    --cc=ioworker0@gmail.com \
    --cc=konrad.wilk@oracle.com \
    --cc=lance.yang@linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=mjguzik@gmail.com \
    --cc=peterz@infradead.org \
    --cc=raghavendra.kt@amd.com \
    --cc=tglx@linutronix.de \
    --cc=willy@infradead.org \
    --cc=x86@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.