drivers/char/mem.c | 6 ------ include/linux/pgtable.h | 8 ++++++++ 2 files changed, 8 insertions(+), 6 deletions(-)
phys_mem_access_prot_allowed is only implemented for X86. For others, it
returns 1. Move it to header to avoid using __weak.
Fixes compilation with make LLVM=1 ARCH=mips
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/char/mem.c | 6 ------
include/linux/pgtable.h | 8 ++++++++
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 5fd421e48c04..ae8449674f46 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -239,12 +239,6 @@ static ssize_t write_mem(struct file *file, const char __user *buf,
return written;
}
-int __weak phys_mem_access_prot_allowed(struct file *file,
- unsigned long pfn, unsigned long size, pgprot_t *vma_prot)
-{
- return 1;
-}
-
#ifndef __HAVE_PHYS_MEM_ACCESS_PROT
/*
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index cdd68ed3ae1a..72a7fa388e88 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -2154,8 +2154,16 @@ static inline int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
#endif
struct file;
+#ifdef CONFIG_X86
int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
unsigned long size, pgprot_t *vma_prot);
+#else
+static inline
+int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
+ unsigned long size, pgprot_t *vma_prot) {
+ return 1;
+}
+#endif
#ifndef CONFIG_X86_ESPFIX64
static inline void init_espfix_bsp(void) { }
--
2.54.0
On Tue, May 5, 2026, at 03:01, Rosen Penev wrote:
> phys_mem_access_prot_allowed is only implemented for X86. For others, it
> returns 1. Move it to header to avoid using __weak.
>
> Fixes compilation with make LLVM=1 ARCH=mips
Can you describe what exactly goes wrong here on mips?
> @@ -239,12 +239,6 @@ static ssize_t write_mem(struct file *file, const
> char __user *buf,
> return written;
> }
>
> -int __weak phys_mem_access_prot_allowed(struct file *file,
> - unsigned long pfn, unsigned long size, pgprot_t *vma_prot)
> -{
> - return 1;
> -}
> -
Removing __weak functions is usually an improvement, but I think
we can go further here, see the discussion from last year at
https://lore.kernel.org/all/20250520152030.1499670-1-arnd@kernel.org/#t
Arnd
On Mon, May 4, 2026 at 10:54 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> On Tue, May 5, 2026, at 03:01, Rosen Penev wrote:
> > phys_mem_access_prot_allowed is only implemented for X86. For others, it
> > returns 1. Move it to header to avoid using __weak.
> >
> > Fixes compilation with make LLVM=1 ARCH=mips
>
> Can you describe what exactly goes wrong here on mips?
Cannot find symbol for section 4: .text.phys_mem_access_prot_allowed.
drivers/char/mem.o: failed
It's full of similar errors in drivers/pci/ as well. clang on MIPS
doesn't seem to like __weak.
>
> > @@ -239,12 +239,6 @@ static ssize_t write_mem(struct file *file, const
> > char __user *buf,
> > return written;
> > }
> >
> > -int __weak phys_mem_access_prot_allowed(struct file *file,
> > - unsigned long pfn, unsigned long size, pgprot_t *vma_prot)
> > -{
> > - return 1;
> > -}
> > -
>
> Removing __weak functions is usually an improvement, but I think
> we can go further here, see the discussion from last year at
>
> https://lore.kernel.org/all/20250520152030.1499670-1-arnd@kernel.org/#t
I hold no opinion on that.
>
> Arnd
© 2016 - 2026 Red Hat, Inc.