compact: workaround for GPL-only symbols on riscv from Linux 6.2
Since Linux 6.2, the implementation of flush_dcache_page on riscv references GPL-only symbol `PageHuge`, breaking the build of zfs. This patch uses existing mechanism to override flush_dcache_page, removing the call to `PageHuge`. According to comments in kernel, it is only used to do some check against HugeTLB pages, which only exist in userspace. ZFS uses flush_dcache_page only on kernel pages, thus this patch will not introduce any behaviour change. See also: torvalds/linux@d33deda, openzfs/zfs@589f59b Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Shengqi Chen <harry-chen@outlook.com> Closes #14974 Closes #15627
This commit is contained in:
parent
687e4d7f9c
commit
86239a5b9c
|
@ -1,7 +1,8 @@
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Starting from Linux 5.13, flush_dcache_page() becomes an inline
|
dnl # Starting from Linux 5.13, flush_dcache_page() becomes an inline
|
||||||
dnl # function and may indirectly referencing GPL-only cpu_feature_keys on
|
dnl # function and may indirectly referencing GPL-only symbols:
|
||||||
dnl # powerpc
|
dnl # on powerpc: cpu_feature_keys
|
||||||
|
dnl # on riscv: PageHuge (added from 6.2)
|
||||||
dnl #
|
dnl #
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
|
|
|
@ -168,6 +168,9 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||||
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||||
ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
|
ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
|
||||||
;;
|
;;
|
||||||
|
riscv*)
|
||||||
|
ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AC_MSG_CHECKING([for available kernel interfaces])
|
AC_MSG_CHECKING([for available kernel interfaces])
|
||||||
|
@ -310,6 +313,9 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||||
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||||
ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
|
ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
|
||||||
;;
|
;;
|
||||||
|
riscv*)
|
||||||
|
ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
/*
|
/*
|
||||||
* Starting from Linux 5.13, flush_dcache_page() becomes an inline function
|
* Starting from Linux 5.13, flush_dcache_page() becomes an inline function
|
||||||
* and under some configurations, may indirectly referencing GPL-only
|
* and under some configurations, may indirectly referencing GPL-only
|
||||||
* cpu_feature_keys on powerpc. Override this function when it is detected
|
* symbols, e.g., cpu_feature_keys on powerpc and PageHuge on riscv.
|
||||||
* being GPL-only.
|
* Override this function when it is detected being GPL-only.
|
||||||
*/
|
*/
|
||||||
#if defined __powerpc__ && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY
|
#if defined __powerpc__ && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY
|
||||||
#include <linux/simd_powerpc.h>
|
#include <linux/simd_powerpc.h>
|
||||||
|
@ -53,6 +53,17 @@
|
||||||
clear_bit(PG_dcache_clean, &(page)->flags); \
|
clear_bit(PG_dcache_clean, &(page)->flags); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
|
* For riscv implementation, the use of PageHuge can be safely removed.
|
||||||
|
* Because it handles pages allocated by HugeTLB, while flush_dcache_page
|
||||||
|
* in zfs module is only called on kernel pages.
|
||||||
|
*/
|
||||||
|
#if defined __riscv && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY
|
||||||
|
#define flush_dcache_page(page) do { \
|
||||||
|
if (test_bit(PG_dcache_clean, &(page)->flags)) \
|
||||||
|
clear_bit(PG_dcache_clean, &(page)->flags); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2.6.30 API change,
|
* 2.6.30 API change,
|
||||||
|
|
Loading…
Reference in New Issue