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>
Sat, 14 Jan 2023 09:23:27 +0000 (10:23 +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/syscalls/syscall.tbl
tools/arch/parisc/include/uapi/asm/mman.h
tools/perf/bench/bench.h

index 9e3c010..5f1f3ee 100644 (file)
 #define MADV_DONTFORK  10              /* don't inherit across fork */
 #define MADV_DOFORK    11              /* do inherit across fork */
 
-#define MADV_COLD      20              /* deactivate these pages */
-#define MADV_PAGEOUT   21              /* reclaim these pages */
+#define MADV_MERGEABLE   12            /* KSM may merge identical pages */
+#define MADV_UNMERGEABLE 13            /* KSM may not merge identical pages */
 
-#define MADV_POPULATE_READ     22      /* populate (prefault) page tables readable */
-#define MADV_POPULATE_WRITE    23      /* populate (prefault) page tables writable */
+#define MADV_HUGEPAGE  14              /* Worth backing with hugepages */
+#define MADV_NOHUGEPAGE 15             /* Not worth backing with hugepages */
 
-#define MADV_MERGEABLE   65            /* KSM may merge identical pages */
-#define MADV_UNMERGEABLE 66            /* KSM may not merge identical pages */
+#define MADV_DONTDUMP   16             /* Explicity exclude from the core dump,
+                                          overrides the coredump filter bits */
+#define MADV_DODUMP    17              /* Clear the MADV_NODUMP flag */
 
-#define MADV_HUGEPAGE  67              /* Worth backing with hugepages */
-#define MADV_NOHUGEPAGE        68              /* Not worth backing with hugepages */
+#define MADV_WIPEONFORK 18             /* Zero memory on fork, child only */
+#define MADV_KEEPONFORK 19             /* Undo MADV_WIPEONFORK */
 
-#define MADV_DONTDUMP   69             /* Explicity exclude from the core dump,
-                                          overrides the coredump filter bits */
-#define MADV_DODUMP    70              /* Clear the MADV_NODUMP flag */
+#define MADV_COLD      20              /* deactivate these pages */
+#define MADV_PAGEOUT   21              /* reclaim these pages */
 
-#define MADV_WIPEONFORK 71             /* Zero memory on fork, child only */
-#define MADV_KEEPONFORK 72             /* Undo MADV_WIPEONFORK */
+#define MADV_POPULATE_READ     22      /* populate (prefault) page tables readable */
+#define MADV_POPULATE_WRITE    23      /* populate (prefault) page tables writable */
 
 #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 5f12537..3195088 100644 (file)
@@ -463,3 +463,30 @@ asmlinkage long parisc_inotify_init1(int flags)
        flags = FIX_O_NONBLOCK(flags);
        return sys_inotify_init1(flags);
 }
+
+/*
+ * 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 c23f4fa..50c759f 100644 (file)
 116    common  sysinfo                 sys_sysinfo                     compat_sys_sysinfo
 117    common  shutdown                sys_shutdown
 118    common  fsync                   sys_fsync
-119    common  madvise                 sys_madvise
+119    common  madvise                 parisc_madvise
 120    common  clone                   sys_clone_wrapper
 121    common  setdomainname           sys_setdomainname
 122    common  sendfile                sys_sendfile                    compat_sys_sendfile
index 506c06a..4cc88a6 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 b3480bc..baa7c63 100644 (file)
@@ -10,25 +10,13 @@ extern struct timeval bench__start, bench__end, bench__runtime;
  * 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);