parisc: Align parisc MADV_XXX constants with all other architectures
authorHelge Deller <deller@gmx.de>
Sun, 11 Dec 2022 18:50:20 +0000 (19:50 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 08:26:42 +0000 (09:26 +0100)
commit 71bdea6f798b425bc0003780b13e3fdecb16a010 upstream.

Adjust some MADV_XXX constants to be in sync what their values are on
all other platforms. There is currently no reason to have an own
numbering on parisc, but it requires workarounds in many userspace
sources (e.g. glibc, qemu, ...) - which are often forgotten and thus
introduce bugs and different behaviour on parisc.

A wrapper avoids an ABI breakage for existing userspace applications by
translating any old values to the new ones, so this change allows us to
move over all programs to the new ABI over time.

Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/parisc/include/uapi/asm/mman.h
arch/parisc/kernel/sys_parisc.c
arch/parisc/kernel/syscall_table.S
tools/arch/parisc/include/uapi/asm/mman.h
tools/perf/bench/bench.h

index d1af0d74a188411ff787baea73011a687da0bf1b..62f2a34f94385774c86f1472b5c58417244779c4 100644 (file)
 #define MADV_DONTFORK  10              /* don't inherit across fork */
 #define MADV_DOFORK    11              /* do inherit across fork */
 
-#define MADV_MERGEABLE   65            /* KSM may merge identical pages */
-#define MADV_UNMERGEABLE 66            /* KSM may not merge identical pages */
+#define MADV_MERGEABLE   12            /* KSM may merge identical pages */
+#define MADV_UNMERGEABLE 13            /* KSM may not merge identical pages */
 
-#define MADV_HUGEPAGE  67              /* Worth backing with hugepages */
-#define MADV_NOHUGEPAGE        68              /* Not worth backing with hugepages */
+#define MADV_HUGEPAGE  14              /* Worth backing with hugepages */
+#define MADV_NOHUGEPAGE 15             /* Not worth backing with hugepages */
 
-#define MADV_DONTDUMP   69             /* Explicity exclude from the core dump,
+#define MADV_DONTDUMP   16             /* Explicity exclude from the core dump,
                                           overrides the coredump filter bits */
-#define MADV_DODUMP    70              /* Clear the MADV_NODUMP flag */
+#define MADV_DODUMP    17              /* Clear the MADV_NODUMP flag */
 
-#define MADV_WIPEONFORK 71             /* Zero memory on fork, child only */
-#define MADV_KEEPONFORK 72             /* Undo MADV_WIPEONFORK */
+#define MADV_WIPEONFORK 18             /* Zero memory on fork, child only */
+#define MADV_KEEPONFORK 19             /* Undo MADV_WIPEONFORK */
 
 #define MADV_HWPOISON     100          /* poison a page for testing */
 #define MADV_SOFT_OFFLINE 101          /* soft offline page for testing */
 
 /* compatibility flags */
 #define MAP_FILE       0
-#define MAP_VARIABLE   0
 
 #define PKEY_DISABLE_ACCESS    0x1
 #define PKEY_DISABLE_WRITE     0x2
index 378a754ca1867fb17d48625150a707dd95675b87..3b7ffa91c6a067844f31a6e096ec58a3b123f0af 100644 (file)
@@ -385,3 +385,30 @@ long parisc_personality(unsigned long personality)
 
        return err;
 }
+
+/*
+ * madvise() wrapper
+ *
+ * Up to kernel v6.1 parisc has different values than all other
+ * platforms for the MADV_xxx flags listed below.
+ * To keep binary compatibility with existing userspace programs
+ * translate the former values to the new values.
+ *
+ * XXX: Remove this wrapper in year 2025 (or later)
+ */
+
+asmlinkage notrace long parisc_madvise(unsigned long start, size_t len_in, int behavior)
+{
+       switch (behavior) {
+       case 65: behavior = MADV_MERGEABLE;     break;
+       case 66: behavior = MADV_UNMERGEABLE;   break;
+       case 67: behavior = MADV_HUGEPAGE;      break;
+       case 68: behavior = MADV_NOHUGEPAGE;    break;
+       case 69: behavior = MADV_DONTDUMP;      break;
+       case 70: behavior = MADV_DODUMP;        break;
+       case 71: behavior = MADV_WIPEONFORK;    break;
+       case 72: behavior = MADV_KEEPONFORK;    break;
+       }
+
+       return sys_madvise(start, len_in, behavior);
+}
index 6308749359e4b7d6ee348062d584f7b747f1a115..41d68e70c87f812768f86ba0411943c5699e5f0c 100644 (file)
        ENTRY_COMP(sysinfo)
        ENTRY_SAME(shutdown)
        ENTRY_SAME(fsync)
-       ENTRY_SAME(madvise)
+       ENTRY_OURS(madvise)
        ENTRY_SAME(clone_wrapper)       /* 120 */
        ENTRY_SAME(setdomainname)
        ENTRY_COMP(sendfile)
index 1bd78758bde9815b067d705fdec7157ca3860b34..5d789369aeef816666d39c1602752ec8b9e76df2 100644 (file)
@@ -1,20 +1,20 @@
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 #ifndef TOOLS_ARCH_PARISC_UAPI_ASM_MMAN_FIX_H
 #define TOOLS_ARCH_PARISC_UAPI_ASM_MMAN_FIX_H
-#define MADV_DODUMP    70
+#define MADV_DODUMP    17
 #define MADV_DOFORK    11
-#define MADV_DONTDUMP   69
+#define MADV_DONTDUMP   16
 #define MADV_DONTFORK  10
 #define MADV_DONTNEED   4
 #define MADV_FREE      8
-#define MADV_HUGEPAGE  67
-#define MADV_MERGEABLE   65
-#define MADV_NOHUGEPAGE        68
+#define MADV_HUGEPAGE  14
+#define MADV_MERGEABLE  12
+#define MADV_NOHUGEPAGE 15
 #define MADV_NORMAL     0
 #define MADV_RANDOM     1
 #define MADV_REMOVE    9
 #define MADV_SEQUENTIAL 2
-#define MADV_UNMERGEABLE 66
+#define MADV_UNMERGEABLE 13
 #define MADV_WILLNEED   3
 #define MAP_ANONYMOUS  0x10
 #define MAP_DENYWRITE  0x0800
index 6c9fcd757f31061d59a94d052c74a6b7aa9a6f0e..80208ac077715c0cbdbd4f3b82e6ae5f37f9a5a8 100644 (file)
@@ -6,25 +6,13 @@
  * The madvise transparent hugepage constants were added in glibc
  * 2.13. For compatibility with older versions of glibc, define these
  * tokens if they are not already defined.
- *
- * PA-RISC uses different madvise values from other architectures and
- * needs to be special-cased.
  */
-#ifdef __hppa__
-# ifndef MADV_HUGEPAGE
-#  define MADV_HUGEPAGE                67
-# endif
-# ifndef MADV_NOHUGEPAGE
-#  define MADV_NOHUGEPAGE      68
-# endif
-#else
 # ifndef MADV_HUGEPAGE
 #  define MADV_HUGEPAGE                14
 # endif
 # ifndef MADV_NOHUGEPAGE
 #  define MADV_NOHUGEPAGE      15
 # endif
-#endif
 
 int bench_numa(int argc, const char **argv);
 int bench_sched_messaging(int argc, const char **argv);