[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <s6fek3k3zsgf74yuppzckhcnud67pgfitz66n6uwkky7gvjcpc@rp4pxvie2dpb>
Date: Mon, 14 Apr 2025 23:47:19 +0530
From: Naveen N Rao <naveen@...nel.org>
To: Dan Williams <dan.j.williams@...el.com>
Cc: dave.hansen@...ux.intel.com, Ingo Molnar <mingo@...nel.org>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 1/3] x86/devmem: Remove duplicate range_is_allowed()
definition
On Thu, Apr 10, 2025 at 06:22:23PM -0700, Dan Williams wrote:
> It looks like x86 has a local re-implementation of range_is_allowed()
> just to add a pat_enabled() check for the strong symbol override of
> phys_mem_access_prot_allowed() from drivers/char/mem.c.
>
> In preparation for updating range_is_allowed() logic, arrange for there
> to be only one shared instance of "range_is_allowed()" in the kernel by
> moving a common helper to include/linux/io.h.
>
> Cc: Dave Hansen <dave.hansen@...ux.intel.com>
> Cc: Ingo Molnar <mingo@...nel.org>
> Signed-off-by: Dan Williams <dan.j.williams@...el.com>
> ---
> arch/x86/mm/pat/memtype.c | 31 ++++---------------------------
> drivers/char/mem.c | 18 ------------------
> include/linux/io.h | 21 +++++++++++++++++++++
> 3 files changed, 25 insertions(+), 45 deletions(-)
>
> diff --git a/arch/x86/mm/pat/memtype.c b/arch/x86/mm/pat/memtype.c
> index 72d8cbc61158..c97b6598f187 100644
> --- a/arch/x86/mm/pat/memtype.c
> +++ b/arch/x86/mm/pat/memtype.c
> @@ -38,6 +38,7 @@
> #include <linux/kernel.h>
> #include <linux/pfn_t.h>
> #include <linux/slab.h>
> +#include <linux/io.h>
> #include <linux/mm.h>
> #include <linux/highmem.h>
> #include <linux/fs.h>
> @@ -773,38 +774,14 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
> return vma_prot;
> }
>
> -#ifdef CONFIG_STRICT_DEVMEM
> -/* This check is done in drivers/char/mem.c in case of STRICT_DEVMEM */
> -static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> -{
> - return 1;
> -}
It looks like no checks were done here if CONFIG_STRICT_DEVMEM was set,
so this patch changes that.
> -#else
> -/* This check is needed to avoid cache aliasing when PAT is enabled */
> -static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> -{
> - u64 from = ((u64)pfn) << PAGE_SHIFT;
> - u64 to = from + size;
> - u64 cursor = from;
> -
> - if (!pat_enabled())
> - return 1;
> -
> - while (cursor < to) {
> - if (!devmem_is_allowed(pfn))
> - return 0;
> - cursor += PAGE_SIZE;
> - pfn++;
> - }
> - return 1;
> -}
> -#endif /* CONFIG_STRICT_DEVMEM */
> -
> int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
> unsigned long size, pgprot_t *vma_prot)
> {
> enum page_cache_mode pcm = _PAGE_CACHE_MODE_WB;
>
> + if (!pat_enabled())
> + return 1;
> +
Shouldn't this test for pat_enabled() (perhaps only if
CONFIG_STRICT_DEVMEM is set) and continue with the rest of the function
otherwise?
- Naveen
> if (!range_is_allowed(pfn, size))
> return 0;
>
> diff --git a/drivers/char/mem.c b/drivers/char/mem.c
> index 169eed162a7f..48839958b0b1 100644
> --- a/drivers/char/mem.c
> +++ b/drivers/char/mem.c
> @@ -61,29 +61,11 @@ static inline int page_is_allowed(unsigned long pfn)
> {
> return devmem_is_allowed(pfn);
> }
> -static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> -{
> - u64 from = ((u64)pfn) << PAGE_SHIFT;
> - u64 to = from + size;
> - u64 cursor = from;
> -
> - while (cursor < to) {
> - if (!devmem_is_allowed(pfn))
> - return 0;
> - cursor += PAGE_SIZE;
> - pfn++;
> - }
> - return 1;
> -}
> #else
> static inline int page_is_allowed(unsigned long pfn)
> {
> return 1;
> }
> -static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> -{
> - return 1;
> -}
> #endif
>
> static inline bool should_stop_iteration(void)
> diff --git a/include/linux/io.h b/include/linux/io.h
> index 6a6bc4d46d0a..0642c7ee41db 100644
> --- a/include/linux/io.h
> +++ b/include/linux/io.h
> @@ -183,4 +183,25 @@ static inline void arch_io_free_memtype_wc(resource_size_t base,
> int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start,
> resource_size_t size);
>
> +#ifdef CONFIG_STRICT_DEVMEM
> +static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> +{
> + u64 from = ((u64)pfn) << PAGE_SHIFT;
> + u64 to = from + size;
> + u64 cursor = from;
> +
> + while (cursor < to) {
> + if (!devmem_is_allowed(pfn))
> + return 0;
> + cursor += PAGE_SIZE;
> + pfn++;
> + }
> + return 1;
> +}
> +#else
> +static inline int range_is_allowed(unsigned long pfn, unsigned long size)
> +{
> + return 1;
> +}
> +#endif
> #endif /* _LINUX_IO_H */
>
Powered by blists - more mailing lists