* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping [not found] ` <20240819195120.GA1113263@thelio-3990X> @ 2024-08-19 20:15 ` Linus Torvalds 2024-08-19 20:16 ` Linus Torvalds 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2024-08-19 20:15 UTC (permalink / raw) To: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg Cc: Michael Ellerman, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Mon, 19 Aug 2024 at 12:51, Nathan Chancellor <nathan@kernel.org> wrote: > > Yes, that appears to fix it for me. I don't have much to say about the > rest but others might :) Ok, I did a quick hack-job to remove that disgusting install_special_mapping() legacy case. With this, the old "install_special_mapping()" mess no longer exists, but I haven't even attempted to compile the result, because I don't have cross-compile environments for any of the affected architectures. Except UML. I did at least build it there, but it's not like I tested it. Adding architecture maintainers and more architecture lists to the participants. It would be good to actually get this patch tested. Context for newly added people: https://lore.kernel.org/all/CAHk-=wj9QPhG4CjiX8YLRC1wHj_Qs-T8wJi0WEhkfp0cszvB9w@mail.gmail.com/ NOTE! This patch is against my current tree, not the linux-next changes. But it should entirely remove the case that caused problems in linux-next. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-19 20:15 ` [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping Linus Torvalds @ 2024-08-19 20:16 ` Linus Torvalds 2024-08-20 1:05 ` Andrew Morton 2024-08-20 6:26 ` Michael Ellerman 0 siblings, 2 replies; 11+ messages in thread From: Linus Torvalds @ 2024-08-19 20:16 UTC (permalink / raw) To: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg Cc: Michael Ellerman, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list [-- Attachment #1: Type: text/plain, Size: 302 bytes --] On Mon, 19 Aug 2024 at 13:15, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > Ok, I did a quick hack-job to remove that disgusting > install_special_mapping() legacy case. > > With this [..] I forgot to actually attach that "this". Here it is. For real, this time. Linus [-- Attachment #2: patch.diff --] [-- Type: text/x-patch, Size: 9257 bytes --] arch/csky/kernel/vdso.c | 28 +++++++++++++++++++++------- arch/hexagon/kernel/vdso.c | 14 ++++++++++---- arch/nios2/mm/init.c | 12 ++++++++---- arch/sh/kernel/vsyscall/vsyscall.c | 14 +++++++++++--- arch/x86/um/vdso/vma.c | 12 ++++++++---- include/linux/mm.h | 4 ---- mm/mmap.c | 32 +++++--------------------------- 7 files changed, 63 insertions(+), 53 deletions(-) diff --git a/arch/csky/kernel/vdso.c b/arch/csky/kernel/vdso.c index 2ca886e4a458..1cd13a2b34eb 100644 --- a/arch/csky/kernel/vdso.c +++ b/arch/csky/kernel/vdso.c @@ -45,9 +45,16 @@ arch_initcall(vdso_init); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_len; int ret; + static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + }; + static struct vm_special_mapping vvar_mapping = { + .name = "[vvar]", + }; vdso_len = (vdso_pages + 1) << PAGE_SHIFT; @@ -65,22 +72,29 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, */ mm->context.vdso = (void *)vdso_base; - ret = - install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT, + vdso_mapping.pages = vdso_pagelist; + vma = + _install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT, (VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC), - vdso_pagelist); + &vdso_mapping); - if (unlikely(ret)) { + if (unlikely(IS_ERR(vma))) { + ret = PTR_ERR(vma); mm->context.vdso = NULL; goto end; } vdso_base += (vdso_pages << PAGE_SHIFT); - ret = install_special_mapping(mm, vdso_base, PAGE_SIZE, - (VM_READ | VM_MAYREAD), &vdso_pagelist[vdso_pages]); + vvar_mapping.pages = &vdso_pagelist[vdso_pages]; + vma = _install_special_mapping(mm, vdso_base, PAGE_SIZE, + (VM_READ | VM_MAYREAD), &vvar_mapping); - if (unlikely(ret)) + if (unlikely(IS_ERR(vma))) { + ret = PTR_ERR(vma); mm->context.vdso = NULL; + goto end; + } + ret = 0; end: mmap_write_unlock(mm); return ret; diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c index 2e4872d62124..f1eb2cd2fd29 100644 --- a/arch/hexagon/kernel/vdso.c +++ b/arch/hexagon/kernel/vdso.c @@ -51,7 +51,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { int ret; unsigned long vdso_base; + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; + static struct vm_special_mapping vdso_mapping = { + name = "[vdso]", + }; if (mmap_write_lock_killable(mm)) return -EINTR; @@ -66,16 +70,18 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) } /* MAYWRITE to allow gdb to COW and set breakpoints. */ - ret = install_special_mapping(mm, vdso_base, PAGE_SIZE, + vdso_mapping.pages = &&vdso_page; + vma = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_page); + &vdso_mapping); - if (ret) + ret = PTR_ERR(vma); + if (IS_ERR(vma)) goto up_fail; mm->context.vdso = (void *)vdso_base; - + ret = 0; up_fail: mmap_write_unlock(mm); return ret; diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c index 3459df28afee..a2278485de19 100644 --- a/arch/nios2/mm/init.c +++ b/arch/nios2/mm/init.c @@ -82,6 +82,10 @@ void __init mmu_init(void) pgd_t swapper_pg_dir[PTRS_PER_PGD] __aligned(PAGE_SIZE); pte_t invalid_pte_table[PTRS_PER_PTE] __aligned(PAGE_SIZE); static struct page *kuser_page[1]; +static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + .pages = kuser_page, +}; static int alloc_kuser_page(void) { @@ -106,18 +110,18 @@ arch_initcall(alloc_kuser_page); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; - int ret; + struct vm_area_struct *vma; mmap_write_lock(mm); /* Map kuser helpers to user space address */ - ret = install_special_mapping(mm, KUSER_BASE, KUSER_SIZE, + vma = _install_special_mapping(mm, KUSER_BASE, KUSER_SIZE, VM_READ | VM_EXEC | VM_MAYREAD | - VM_MAYEXEC, kuser_page); + VM_MAYEXEC, &vdso_mapping); mmap_write_unlock(mm); - return ret; + return IS_ERR(vma) ? PTR_ERR(vma) : 0; } const char *arch_vma_name(struct vm_area_struct *vma) diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c index 1bd85a6949c4..5e68ab7a8898 100644 --- a/arch/sh/kernel/vsyscall/vsyscall.c +++ b/arch/sh/kernel/vsyscall/vsyscall.c @@ -36,6 +36,10 @@ __setup("vdso=", vdso_setup); */ extern const char vsyscall_trapa_start, vsyscall_trapa_end; static struct page *syscall_pages[1]; +static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + .pages = syscall_pages; +}; int __init vsyscall_init(void) { @@ -58,6 +62,7 @@ int __init vsyscall_init(void) int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; unsigned long addr; int ret; @@ -70,14 +75,17 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) goto up_fail; } - ret = install_special_mapping(mm, addr, PAGE_SIZE, + vdso_mapping.pages = syscall_pages; + vma = _install_special_mapping(mm, addr, PAGE_SIZE, VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, - syscall_pages); - if (unlikely(ret)) + &vdso_mapping); + ret = PTR_ERR(vma); + if (unlikely(IS_ERR(vma))) goto up_fail; current->mm->context.vdso = (void *)addr; + ret = 0; up_fail: mmap_write_unlock(mm); diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c index 76d9f6ce7a3d..f238f7b33cdd 100644 --- a/arch/x86/um/vdso/vma.c +++ b/arch/x86/um/vdso/vma.c @@ -52,8 +52,11 @@ subsys_initcall(init_vdso); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { - int err; + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; + static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + }; if (!vdso_enabled) return 0; @@ -61,12 +64,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) if (mmap_write_lock_killable(mm)) return -EINTR; - err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE, + vdso_mapping.pages = vdsop; + vma = _install_special_mapping(mm, um_vdso_addr, PAGE_SIZE, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - vdsop); + &vdso_mapping); mmap_write_unlock(mm); - return err; + return IS_ERR(vma) ? PTR_ERR(vma) : 0; } diff --git a/include/linux/mm.h b/include/linux/mm.h index 6549d0979b28..7b7e4797c0fd 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3381,10 +3381,6 @@ extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm, unsigned long addr, unsigned long len, unsigned long flags, const struct vm_special_mapping *spec); -/* This is an obsolete alternative to _install_special_mapping. */ -extern int install_special_mapping(struct mm_struct *mm, - unsigned long addr, unsigned long len, - unsigned long flags, struct page **pages); unsigned long randomize_stack_top(unsigned long stack_top); unsigned long randomize_page(unsigned long start, unsigned long range); diff --git a/mm/mmap.c b/mm/mmap.c index d0dfc85b209b..ece92e6c3ead 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -3665,27 +3665,17 @@ static const struct vm_operations_struct special_mapping_vmops = { .may_split = special_mapping_split, }; -static const struct vm_operations_struct legacy_special_mapping_vmops = { - .close = special_mapping_close, - .fault = special_mapping_fault, -}; - static vm_fault_t special_mapping_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; pgoff_t pgoff; struct page **pages; + struct vm_special_mapping *sm = vma->vm_private_data; - if (vma->vm_ops == &legacy_special_mapping_vmops) { - pages = vma->vm_private_data; - } else { - struct vm_special_mapping *sm = vma->vm_private_data; + if (sm->fault) + return sm->fault(sm, vmf->vma, vmf); - if (sm->fault) - return sm->fault(sm, vmf->vma, vmf); - - pages = sm->pages; - } + pages = sm->pages; for (pgoff = vmf->pgoff; pgoff && *pages; ++pages) pgoff--; @@ -3740,8 +3730,7 @@ bool vma_is_special_mapping(const struct vm_area_struct *vma, const struct vm_special_mapping *sm) { return vma->vm_private_data == sm && - (vma->vm_ops == &special_mapping_vmops || - vma->vm_ops == &legacy_special_mapping_vmops); + vma->vm_ops == &special_mapping_vmops; } /* @@ -3762,17 +3751,6 @@ struct vm_area_struct *_install_special_mapping( &special_mapping_vmops); } -int install_special_mapping(struct mm_struct *mm, - unsigned long addr, unsigned long len, - unsigned long vm_flags, struct page **pages) -{ - struct vm_area_struct *vma = __install_special_mapping( - mm, addr, len, vm_flags, (void *)pages, - &legacy_special_mapping_vmops); - - return PTR_ERR_OR_ZERO(vma); -} - static DEFINE_MUTEX(mm_all_locks_mutex); static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-19 20:16 ` Linus Torvalds @ 2024-08-20 1:05 ` Andrew Morton 2024-08-20 1:11 ` Linus Torvalds 2024-08-20 6:26 ` Michael Ellerman 1 sibling, 1 reply; 11+ messages in thread From: Andrew Morton @ 2024-08-20 1:05 UTC (permalink / raw) To: Linus Torvalds Cc: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, Michael Ellerman, linux-mm, linuxppc-dev, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Mon, 19 Aug 2024 13:16:32 -0700 Linus Torvalds <torvalds@linux-foundation.org> wrote: > On Mon, 19 Aug 2024 at 13:15, Linus Torvalds > <torvalds@linux-foundation.org> wrote: > > > > Ok, I did a quick hack-job to remove that disgusting > > install_special_mapping() legacy case. > > > > With this [..] > > I forgot to actually attach that "this". Here it is. For real, this time. Thanks. Do you think your one-liner remains desirable with this fix in place? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 1:05 ` Andrew Morton @ 2024-08-20 1:11 ` Linus Torvalds 0 siblings, 0 replies; 11+ messages in thread From: Linus Torvalds @ 2024-08-20 1:11 UTC (permalink / raw) To: Andrew Morton Cc: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, Michael Ellerman, linux-mm, linuxppc-dev, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Mon, 19 Aug 2024 at 18:05, Andrew Morton <akpm@linux-foundation.org> wrote: > > > > > I forgot to actually attach that "this". Here it is. For real, this time. > > Thanks. Do you think your one-liner remains desirable with this fix in > place? That patch actually removes the whole 'legacy_special_mapping_vmops' that my one-liner then removed the '.close' field from, so no - my one-liner just becomes a non-issue. NOTE! That patch of mine *will* conflict with Michael's patch series, since my patch to remove legacy_special_mapping_vmops was done on top of my current -git tree. But it should be an obvious conflict, in that it just means that the addition of .close never happens. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-19 20:16 ` Linus Torvalds 2024-08-20 1:05 ` Andrew Morton @ 2024-08-20 6:26 ` Michael Ellerman 2024-08-20 15:31 ` Linus Torvalds 1 sibling, 1 reply; 11+ messages in thread From: Michael Ellerman @ 2024-08-20 6:26 UTC (permalink / raw) To: Linus Torvalds, Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg Cc: linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list Linus Torvalds <torvalds@linux-foundation.org> writes: > On Mon, 19 Aug 2024 at 13:15, Linus Torvalds > <torvalds@linux-foundation.org> wrote: >> >> Ok, I did a quick hack-job to remove that disgusting >> install_special_mapping() legacy case. >> >> With this [..] > > I forgot to actually attach that "this". Here it is. For real, this time. > > Linus > arch/csky/kernel/vdso.c | 28 +++++++++++++++++++++------- > arch/hexagon/kernel/vdso.c | 14 ++++++++++---- > arch/nios2/mm/init.c | 12 ++++++++---- > arch/sh/kernel/vsyscall/vsyscall.c | 14 +++++++++++--- > arch/x86/um/vdso/vma.c | 12 ++++++++---- > include/linux/mm.h | 4 ---- > mm/mmap.c | 32 +++++--------------------------- > 7 files changed, 63 insertions(+), 53 deletions(-) > ... > index 1bd85a6949c4..5e68ab7a8898 100644 > --- a/arch/sh/kernel/vsyscall/vsyscall.c > +++ b/arch/sh/kernel/vsyscall/vsyscall.c > @@ -36,6 +36,10 @@ __setup("vdso=", vdso_setup); > */ > extern const char vsyscall_trapa_start, vsyscall_trapa_end; > static struct page *syscall_pages[1]; > +static struct vm_special_mapping vdso_mapping = { > + .name = "[vdso]", > + .pages = syscall_pages; ^ should be , > +}; cheers ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 6:26 ` Michael Ellerman @ 2024-08-20 15:31 ` Linus Torvalds 2024-08-20 21:31 ` Rob Landley 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2024-08-20 15:31 UTC (permalink / raw) To: Michael Ellerman Cc: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Mon, 19 Aug 2024 at 23:26, Michael Ellerman <mpe@ellerman.id.au> wrote: > > Linus Torvalds <torvalds@linux-foundation.org> writes: > > +static struct vm_special_mapping vdso_mapping = { > > + .name = "[vdso]", > > + .pages = syscall_pages; > ^ > should be , Ack. Changed here locally. But I assume you also don't actually test sh... It would be good to get acks from the architectures that still used the legacy interface. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 15:31 ` Linus Torvalds @ 2024-08-20 21:31 ` Rob Landley 2024-08-20 21:31 ` Linus Torvalds 0 siblings, 1 reply; 11+ messages in thread From: Rob Landley @ 2024-08-20 21:31 UTC (permalink / raw) To: Linus Torvalds, Michael Ellerman Cc: Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On 8/20/24 10:31, Linus Torvalds wrote: > On Mon, 19 Aug 2024 at 23:26, Michael Ellerman <mpe@ellerman.id.au> wrote: >> >> Linus Torvalds <torvalds@linux-foundation.org> writes: >> > +static struct vm_special_mapping vdso_mapping = { >> > + .name = "[vdso]", >> > + .pages = syscall_pages; >> ^ >> should be , > > Ack. Changed here locally. Hexagon also has &&vdso_page which I don't understand (but have a toolchain for somewhere to at least smoketest...) > But I assume you also don't actually test sh... But I do. Aside: arch/sh smoketests easily under qemu, here's a relocatable binary toolchain: wget https://landley.net/bin/toolchains/latest/sh4-linux-musl-cross.tar.xz tar xvf sh4-linux-musl-cross-tar.xz CROSS_COMPILE=$PWD/sh4-linux-musl-cross/bin/sh4-linux-musl- And https://landley.net/bin/mkroot/latest/sh4.tgz is a tiny qemu-system-sh4 system with kernel + initramfs.cpio.gz + run-qemu.sh with the config used to build it under docs/ and as the first three lines of docs/linux-miniconfig record, the kernel is arch/sh/boot/zImage. You can keep the initramfs.cpio.gz and run-qemu.sh and swap out the kernel for a quick boot to shell prompt under qemu. Serial console is qemu's stdin/stdout, "exit" to shut down the emulator. The build script, if you care, is 400 lines of bash: https://github.com/landley/toybox/blob/master/mkroot/mkroot.sh > It would be good to get acks from the architectures that still used > the legacy interface. I'll give arch/sh a whirl. Can somebody answer my above hexagon question? > Linus Rob ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 21:31 ` Rob Landley @ 2024-08-20 21:31 ` Linus Torvalds 2024-08-20 22:10 ` Rob Landley 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2024-08-20 21:31 UTC (permalink / raw) To: Rob Landley Cc: Michael Ellerman, Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Tue, 20 Aug 2024 at 14:17, Rob Landley <rob@landley.net> wrote: > > Hexagon also has &&vdso_page which I don't understand (but have a toolchain for > somewhere to at least smoketest...) The '&&' is just a typo. It should obviously be just a single '&'. As mentioned, the only testing that patch got was a x86-64 UML build test. Fixed locally. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 21:31 ` Linus Torvalds @ 2024-08-20 22:10 ` Rob Landley 2024-08-20 23:14 ` Linus Torvalds 0 siblings, 1 reply; 11+ messages in thread From: Rob Landley @ 2024-08-20 22:10 UTC (permalink / raw) To: Linus Torvalds Cc: Michael Ellerman, Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, akpm, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On 8/20/24 16:31, Linus Torvalds wrote: > On Tue, 20 Aug 2024 at 14:17, Rob Landley <rob@landley.net> wrote: >> >> Hexagon also has &&vdso_page which I don't understand (but have a toolchain for >> somewhere to at least smoketest...) > > The '&&' is just a typo. It should obviously be just a single '&'. As > mentioned, the only testing that patch got was a x86-64 UML build > test. > > Fixed locally. I deleted the extra ; and arch/sh4 built and qemu-system-sh4 booted to shell prompt: Freeing initrd memory: 556K Freeing unused kernel image (initmem) memory: 132K This architecture does not have kernel memory protection. Run /init as init process 8139cp 0000:00:02.0 eth0: link up, 100Mbps, full-duplex, lpa 0x05E1 Type exit when done. # cat /proc/version Linux version 6.11.0-rc4 (landley@driftwood) (sh4-linux-musl-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.33.1) #1 Tue Aug 20 16:45:25 CDT 2024 # head -n 3 /proc/cpuinfo machine : RTS7751R2D processor : 0 cpu family : sh4 Tested-by: Rob Landley <rob@landley.net> Rob ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 22:10 ` Rob Landley @ 2024-08-20 23:14 ` Linus Torvalds 2024-08-21 1:18 ` Andrew Morton 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2024-08-20 23:14 UTC (permalink / raw) To: Rob Landley, Andrew Morton Cc: Michael Ellerman, Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list [-- Attachment #1: Type: text/plain, Size: 480 bytes --] On Tue, 20 Aug 2024 at 14:56, Rob Landley <rob@landley.net> wrote: > > Tested-by: Rob Landley <rob@landley.net> Ok, here's the patch with the fixes for problems that were pointed out, and with the beginnings of a commit message. I'm going to be traveling for the next ~10 days, and while I'll have my laptop and internet, I'm unlikely to work on this any more. Andrew - I think this is good, but there may be other issues lurking. Do with it as you see fit, Linus [-- Attachment #2: 0001-mm-remove-legacy-install_special_mapping-code.patch --] [-- Type: text/x-patch, Size: 10456 bytes --] From ef4e84d69c3d669e606b5d386625267a3b9c9573 Mon Sep 17 00:00:00 2001 From: Linus Torvalds <torvalds@linux-foundation.org> Date: Tue, 20 Aug 2024 15:14:47 -0700 Subject: [PATCH] mm: remove legacy install_special_mapping() code All relevant architectures had already been converted to the new interface (which just has an underscore in front of the name - not very imaginative naming), this just force-converts the stragglers. The modern interface is almost identical to the old one, except instead of the page pointer it takes a "struct vm_special_mapping" that describes the mapping (and contains the page pointer as one member), and it returns the resulting 'vma' instead of just the error code. Getting rid of the old interface also gets rid of some special casing, which had caused problems with the mremap extensions to "struct vm_special_mapping". Tested-by: Rob Landley <rob@landley.net> # arch/sh/ Link: https://lore.kernel.org/all/20240819195120.GA1113263@thelio-3990X/ Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> --- arch/csky/kernel/vdso.c | 28 +++++++++++++++++++------- arch/hexagon/kernel/vdso.c | 14 +++++++++---- arch/nios2/mm/init.c | 12 +++++++---- arch/sh/kernel/vsyscall/vsyscall.c | 14 ++++++++++--- arch/x86/um/vdso/vma.c | 12 +++++++---- include/linux/mm.h | 4 ---- mm/mmap.c | 32 +++++------------------------- 7 files changed, 63 insertions(+), 53 deletions(-) diff --git a/arch/csky/kernel/vdso.c b/arch/csky/kernel/vdso.c index 2ca886e4a458..1cd13a2b34eb 100644 --- a/arch/csky/kernel/vdso.c +++ b/arch/csky/kernel/vdso.c @@ -45,9 +45,16 @@ arch_initcall(vdso_init); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_len; int ret; + static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + }; + static struct vm_special_mapping vvar_mapping = { + .name = "[vvar]", + }; vdso_len = (vdso_pages + 1) << PAGE_SHIFT; @@ -65,22 +72,29 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, */ mm->context.vdso = (void *)vdso_base; - ret = - install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT, + vdso_mapping.pages = vdso_pagelist; + vma = + _install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT, (VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC), - vdso_pagelist); + &vdso_mapping); - if (unlikely(ret)) { + if (unlikely(IS_ERR(vma))) { + ret = PTR_ERR(vma); mm->context.vdso = NULL; goto end; } vdso_base += (vdso_pages << PAGE_SHIFT); - ret = install_special_mapping(mm, vdso_base, PAGE_SIZE, - (VM_READ | VM_MAYREAD), &vdso_pagelist[vdso_pages]); + vvar_mapping.pages = &vdso_pagelist[vdso_pages]; + vma = _install_special_mapping(mm, vdso_base, PAGE_SIZE, + (VM_READ | VM_MAYREAD), &vvar_mapping); - if (unlikely(ret)) + if (unlikely(IS_ERR(vma))) { + ret = PTR_ERR(vma); mm->context.vdso = NULL; + goto end; + } + ret = 0; end: mmap_write_unlock(mm); return ret; diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c index 2e4872d62124..6fd27ff1df73 100644 --- a/arch/hexagon/kernel/vdso.c +++ b/arch/hexagon/kernel/vdso.c @@ -51,7 +51,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { int ret; unsigned long vdso_base; + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; + static struct vm_special_mapping vdso_mapping = { + name = "[vdso]", + }; if (mmap_write_lock_killable(mm)) return -EINTR; @@ -66,16 +70,18 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) } /* MAYWRITE to allow gdb to COW and set breakpoints. */ - ret = install_special_mapping(mm, vdso_base, PAGE_SIZE, + vdso_mapping.pages = &vdso_page; + vma = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_page); + &vdso_mapping); - if (ret) + ret = PTR_ERR(vma); + if (IS_ERR(vma)) goto up_fail; mm->context.vdso = (void *)vdso_base; - + ret = 0; up_fail: mmap_write_unlock(mm); return ret; diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c index 3459df28afee..a2278485de19 100644 --- a/arch/nios2/mm/init.c +++ b/arch/nios2/mm/init.c @@ -82,6 +82,10 @@ void __init mmu_init(void) pgd_t swapper_pg_dir[PTRS_PER_PGD] __aligned(PAGE_SIZE); pte_t invalid_pte_table[PTRS_PER_PTE] __aligned(PAGE_SIZE); static struct page *kuser_page[1]; +static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + .pages = kuser_page, +}; static int alloc_kuser_page(void) { @@ -106,18 +110,18 @@ arch_initcall(alloc_kuser_page); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; - int ret; + struct vm_area_struct *vma; mmap_write_lock(mm); /* Map kuser helpers to user space address */ - ret = install_special_mapping(mm, KUSER_BASE, KUSER_SIZE, + vma = _install_special_mapping(mm, KUSER_BASE, KUSER_SIZE, VM_READ | VM_EXEC | VM_MAYREAD | - VM_MAYEXEC, kuser_page); + VM_MAYEXEC, &vdso_mapping); mmap_write_unlock(mm); - return ret; + return IS_ERR(vma) ? PTR_ERR(vma) : 0; } const char *arch_vma_name(struct vm_area_struct *vma) diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c index 1bd85a6949c4..e2db291d87ca 100644 --- a/arch/sh/kernel/vsyscall/vsyscall.c +++ b/arch/sh/kernel/vsyscall/vsyscall.c @@ -36,6 +36,10 @@ __setup("vdso=", vdso_setup); */ extern const char vsyscall_trapa_start, vsyscall_trapa_end; static struct page *syscall_pages[1]; +static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + .pages = syscall_pages, +}; int __init vsyscall_init(void) { @@ -58,6 +62,7 @@ int __init vsyscall_init(void) int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; unsigned long addr; int ret; @@ -70,14 +75,17 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) goto up_fail; } - ret = install_special_mapping(mm, addr, PAGE_SIZE, + vdso_mapping.pages = syscall_pages; + vma = _install_special_mapping(mm, addr, PAGE_SIZE, VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, - syscall_pages); - if (unlikely(ret)) + &vdso_mapping); + ret = PTR_ERR(vma); + if (unlikely(IS_ERR(vma))) goto up_fail; current->mm->context.vdso = (void *)addr; + ret = 0; up_fail: mmap_write_unlock(mm); diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c index 76d9f6ce7a3d..f238f7b33cdd 100644 --- a/arch/x86/um/vdso/vma.c +++ b/arch/x86/um/vdso/vma.c @@ -52,8 +52,11 @@ subsys_initcall(init_vdso); int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { - int err; + struct vm_area_struct *vma; struct mm_struct *mm = current->mm; + static struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + }; if (!vdso_enabled) return 0; @@ -61,12 +64,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) if (mmap_write_lock_killable(mm)) return -EINTR; - err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE, + vdso_mapping.pages = vdsop; + vma = _install_special_mapping(mm, um_vdso_addr, PAGE_SIZE, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - vdsop); + &vdso_mapping); mmap_write_unlock(mm); - return err; + return IS_ERR(vma) ? PTR_ERR(vma) : 0; } diff --git a/include/linux/mm.h b/include/linux/mm.h index 6549d0979b28..7b7e4797c0fd 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3381,10 +3381,6 @@ extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm, unsigned long addr, unsigned long len, unsigned long flags, const struct vm_special_mapping *spec); -/* This is an obsolete alternative to _install_special_mapping. */ -extern int install_special_mapping(struct mm_struct *mm, - unsigned long addr, unsigned long len, - unsigned long flags, struct page **pages); unsigned long randomize_stack_top(unsigned long stack_top); unsigned long randomize_page(unsigned long start, unsigned long range); diff --git a/mm/mmap.c b/mm/mmap.c index d0dfc85b209b..ece92e6c3ead 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -3665,27 +3665,17 @@ static const struct vm_operations_struct special_mapping_vmops = { .may_split = special_mapping_split, }; -static const struct vm_operations_struct legacy_special_mapping_vmops = { - .close = special_mapping_close, - .fault = special_mapping_fault, -}; - static vm_fault_t special_mapping_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; pgoff_t pgoff; struct page **pages; + struct vm_special_mapping *sm = vma->vm_private_data; - if (vma->vm_ops == &legacy_special_mapping_vmops) { - pages = vma->vm_private_data; - } else { - struct vm_special_mapping *sm = vma->vm_private_data; + if (sm->fault) + return sm->fault(sm, vmf->vma, vmf); - if (sm->fault) - return sm->fault(sm, vmf->vma, vmf); - - pages = sm->pages; - } + pages = sm->pages; for (pgoff = vmf->pgoff; pgoff && *pages; ++pages) pgoff--; @@ -3740,8 +3730,7 @@ bool vma_is_special_mapping(const struct vm_area_struct *vma, const struct vm_special_mapping *sm) { return vma->vm_private_data == sm && - (vma->vm_ops == &special_mapping_vmops || - vma->vm_ops == &legacy_special_mapping_vmops); + vma->vm_ops == &special_mapping_vmops; } /* @@ -3762,17 +3751,6 @@ struct vm_area_struct *_install_special_mapping( &special_mapping_vmops); } -int install_special_mapping(struct mm_struct *mm, - unsigned long addr, unsigned long len, - unsigned long vm_flags, struct page **pages) -{ - struct vm_area_struct *vma = __install_special_mapping( - mm, addr, len, vm_flags, (void *)pages, - &legacy_special_mapping_vmops); - - return PTR_ERR_OR_ZERO(vma); -} - static DEFINE_MUTEX(mm_all_locks_mutex); static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma) -- 2.43.0.493.gbc7ee2e5e1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping 2024-08-20 23:14 ` Linus Torvalds @ 2024-08-21 1:18 ` Andrew Morton 0 siblings, 0 replies; 11+ messages in thread From: Andrew Morton @ 2024-08-21 1:18 UTC (permalink / raw) To: Linus Torvalds Cc: Rob Landley, Michael Ellerman, Nathan Chancellor, Guo Ren, Brian Cain, Dinh Nguyen, Yoshinori Sato, Rich Felker, John Paul Adrian Glaubitz, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-mm, linuxppc-dev, christophe.leroy, jeffxu, Liam.Howlett, linux-kernel, npiggin, oliver.sang, pedro.falcato, linux-um, linux-csky, linux-hexagon, Linux-sh list On Tue, 20 Aug 2024 16:14:29 -0700 Linus Torvalds <torvalds@linux-foundation.org> wrote: > Andrew - I think this is good, but there may be other issues lurking. > Do with it as you see fit, Hey you know me, I'll merge any old thing if I think it'll help nurture newbies. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-08-21 1:18 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20240812082605.743814-1-mpe@ellerman.id.au>
[not found] ` <20240819185253.GA2333884@thelio-3990X>
[not found] ` <CAHk-=wj9QPhG4CjiX8YLRC1wHj_Qs-T8wJi0WEhkfp0cszvB9w@mail.gmail.com>
[not found] ` <20240819195120.GA1113263@thelio-3990X>
2024-08-19 20:15 ` [PATCH v2 1/4] mm: Add optional close() to struct vm_special_mapping Linus Torvalds
2024-08-19 20:16 ` Linus Torvalds
2024-08-20 1:05 ` Andrew Morton
2024-08-20 1:11 ` Linus Torvalds
2024-08-20 6:26 ` Michael Ellerman
2024-08-20 15:31 ` Linus Torvalds
2024-08-20 21:31 ` Rob Landley
2024-08-20 21:31 ` Linus Torvalds
2024-08-20 22:10 ` Rob Landley
2024-08-20 23:14 ` Linus Torvalds
2024-08-21 1:18 ` Andrew Morton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).