From de3e0b914b28deaf9034656d8f6e0bdf9ccd7c7f Mon Sep 17 00:00:00 2001 From: Tomohiro Kusumi Date: Sun, 5 May 2019 08:40:48 +0900 Subject: [PATCH] Linux 5.0 compat: Use totalhigh_pages() Linux kernel commit ca79b0c211af63fa3276f0e3fd7dd9ada2439839 "mm: convert totalram_pages and totalhigh_pages variables to atomic" replaced `totalhigh_pages` with an inline function `totalhigh_pages()`. This broke compilation on IA32, etc, as ZoL uses `totalhigh_pages` on archs with highmem. Confirmed on Fedora 30 (5.0.9-301.fc30.i686). Reviewed-by: Brian Behlendorf Signed-off-by: Tomohiro Kusumi Closes #8677 Closes #8701 --- config/kernel-totalhigh_pages.m4 | 19 +++++++++++++++++++ config/kernel.m4 | 1 + include/spl/sys/vmsystm.h | 6 ++++++ module/zfs/arc.c | 2 +- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 config/kernel-totalhigh_pages.m4 diff --git a/config/kernel-totalhigh_pages.m4 b/config/kernel-totalhigh_pages.m4 new file mode 100644 index 0000000000..b22e86d4db --- /dev/null +++ b/config/kernel-totalhigh_pages.m4 @@ -0,0 +1,19 @@ +dnl # +dnl # 5.0 API change +dnl # +dnl # ca79b0c211af mm: convert totalram_pages and totalhigh_pages variables to atomic +dnl # +AC_DEFUN([ZFS_AC_KERNEL_TOTALHIGH_PAGES], [ + AC_MSG_CHECKING([whether totalhigh_pages() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include + ],[ + unsigned long pages __attribute__ ((unused)); + pages = totalhigh_pages(); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_TOTALHIGH_PAGES, 1, [totalhigh_pages() exists]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index f7d657e0ca..026a5258f9 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -164,6 +164,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_IN_COMPAT_SYSCALL ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64 ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC + ZFS_AC_KERNEL_TOTALHIGH_PAGES ZFS_AC_KERNEL_BLK_QUEUE_DISCARD ZFS_AC_KERNEL_BLK_QUEUE_SECURE_ERASE diff --git a/include/spl/sys/vmsystm.h b/include/spl/sys/vmsystm.h index 6bdfc852ac..5807d960ad 100644 --- a/include/spl/sys/vmsystm.h +++ b/include/spl/sys/vmsystm.h @@ -39,6 +39,12 @@ #define zfs_totalram_pages totalram_pages #endif +#ifdef HAVE_TOTALHIGH_PAGES +#define zfs_totalhigh_pages totalhigh_pages() +#else +#define zfs_totalhigh_pages totalhigh_pages +#endif + #define membar_producer() smp_wmb() #define physmem zfs_totalram_pages #define freemem (nr_free_pages() + \ diff --git a/module/zfs/arc.c b/module/zfs/arc.c index c724878948..9b500352a4 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -4828,7 +4828,7 @@ arc_all_memory(void) { #ifdef _KERNEL #ifdef CONFIG_HIGHMEM - return (ptob(zfs_totalram_pages - totalhigh_pages)); + return (ptob(zfs_totalram_pages - zfs_totalhigh_pages)); #else return (ptob(zfs_totalram_pages)); #endif /* CONFIG_HIGHMEM */