]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
um: remove copy_from_kernel_nofault_allowed
authorBenjamin Berg <benjamin.berg@intel.com>
Mon, 10 Feb 2025 16:09:26 +0000 (17:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:37:34 +0000 (14:37 +0200)
[ Upstream commit 84a6fc378471fbeaf48f8604566a5a33a3d63c18 ]

There is no need to override the default version of this function
anymore as UML now has proper _nofault memory access functions.

Doing this also fixes the fact that the implementation was incorrect as
using mincore() will incorrectly flag pages as inaccessible if they were
swapped out by the host.

Fixes: f75b1b1bedfb ("um: Implement probe_kernel_read()")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20250210160926.420133-3-benjamin@sipsolutions.net
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/um/include/shared/os.h
arch/um/kernel/Makefile
arch/um/kernel/maccess.c [deleted file]
arch/um/os-Linux/process.c

index 0df646c6651ea00c99bdbdeab8f02aa53f19524b..3b382da2996f01b590ee7102e155ee811a541c29 100644 (file)
@@ -211,7 +211,6 @@ extern int os_protect_memory(void *addr, unsigned long len,
 extern int os_unmap_memory(void *addr, int len);
 extern int os_drop_memory(void *addr, int length);
 extern int can_drop_memory(void);
-extern int os_mincore(void *addr, unsigned long len);
 
 /* execvp.c */
 extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
index 811188be954cad1e2317df9fb21137f9dddfa95e..321250f3f5703545f217efe36920b0c4765394c0 100644 (file)
@@ -17,7 +17,7 @@ extra-y := vmlinux.lds
 obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
        physmem.o process.o ptrace.o reboot.o sigio.o \
        signal.o sysrq.o time.o tlb.o trap.o \
-       um_arch.o umid.o maccess.o kmsg_dump.o capflags.o skas/
+       um_arch.o umid.o kmsg_dump.o capflags.o skas/
 obj-y += load_file.o
 
 obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
diff --git a/arch/um/kernel/maccess.c b/arch/um/kernel/maccess.c
deleted file mode 100644 (file)
index 8ccd568..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (C) 2013 Richard Weinberger <richrd@nod.at>
- */
-
-#include <linux/uaccess.h>
-#include <linux/kernel.h>
-#include <os.h>
-
-bool copy_from_kernel_nofault_allowed(const void *src, size_t size)
-{
-       void *psrc = (void *)rounddown((unsigned long)src, PAGE_SIZE);
-
-       if ((unsigned long)src < PAGE_SIZE || size <= 0)
-               return false;
-       if (os_mincore(psrc, size + src - psrc) <= 0)
-               return false;
-       return true;
-}
index e52dd37ddadccc5f07eebea20705db23d6f65ada..2686120ab2325a65b15ff54c032709c0799e475e 100644 (file)
@@ -223,57 +223,6 @@ out:
        return ok;
 }
 
-static int os_page_mincore(void *addr)
-{
-       char vec[2];
-       int ret;
-
-       ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
-       if (ret < 0) {
-               if (errno == ENOMEM || errno == EINVAL)
-                       return 0;
-               else
-                       return -errno;
-       }
-
-       return vec[0] & 1;
-}
-
-int os_mincore(void *addr, unsigned long len)
-{
-       char *vec;
-       int ret, i;
-
-       if (len <= UM_KERN_PAGE_SIZE)
-               return os_page_mincore(addr);
-
-       vec = calloc(1, (len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE);
-       if (!vec)
-               return -ENOMEM;
-
-       ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
-       if (ret < 0) {
-               if (errno == ENOMEM || errno == EINVAL)
-                       ret = 0;
-               else
-                       ret = -errno;
-
-               goto out;
-       }
-
-       for (i = 0; i < ((len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE); i++) {
-               if (!(vec[i] & 1)) {
-                       ret = 0;
-                       goto out;
-               }
-       }
-
-       ret = 1;
-out:
-       free(vec);
-       return ret;
-}
-
 void init_new_thread_signals(void)
 {
        set_handler(SIGSEGV);