From 838a2490123a596ac7771894311f17269f47024c Mon Sep 17 00:00:00 2001 From: Coleman Kane Date: Sun, 18 Oct 2020 10:36:12 -0400 Subject: [PATCH] Linux 5.10 compat: percpu_ref added data member Kernel commit 2b0d3d3e4fcfb brought in some changes to the struct percpu_ref structure that moves most of its fields into a member struct named "data" of type struct percpu_ref_data. This includes the "count" member which is updated by vdev_blkg_tryget(), so update this function to chase the API change, and detect it via configure. Reviewed-by: Brian Behlendorf Signed-off-by: Coleman Kane Closes #11085 --- config/kernel-percpu.m4 | 26 ++++++++++++++++++++++++++ module/os/linux/zfs/vdev_disk.c | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/config/kernel-percpu.m4 b/config/kernel-percpu.m4 index e9654a69ee..700d97a258 100644 --- a/config/kernel-percpu.m4 +++ b/config/kernel-percpu.m4 @@ -25,10 +25,36 @@ AC_DEFUN([ZFS_AC_KERNEL_PERCPU_COUNTER_INIT], [ ]) ]) +dnl # +dnl # 5.10 API change, +dnl # The "count" was moved into ref->data, from ref +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_PERCPU_REF_COUNT_IN_DATA], [ + ZFS_LINUX_TEST_SRC([percpu_ref_count_in_data], [ + #include + ],[ + struct percpu_ref_data d; + + atomic_long_set(&d.count, 1L); + ]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_PERCPU_REF_COUNT_IN_DATA], [ + AC_MSG_CHECKING([whether is inside percpu_ref.data]) + ZFS_LINUX_TEST_RESULT([percpu_ref_count_in_data], [ + AC_MSG_RESULT(yes) + AC_DEFINE(ZFS_PERCPU_REF_COUNT_IN_DATA, 1, + [count is located in percpu_ref.data]) + ],[ + AC_MSG_RESULT(no) + ]) +]) AC_DEFUN([ZFS_AC_KERNEL_SRC_PERCPU], [ ZFS_AC_KERNEL_SRC_PERCPU_COUNTER_INIT + ZFS_AC_KERNEL_SRC_PERCPU_REF_COUNT_IN_DATA ]) AC_DEFUN([ZFS_AC_KERNEL_PERCPU], [ ZFS_AC_KERNEL_PERCPU_COUNTER_INIT + ZFS_AC_KERNEL_PERCPU_REF_COUNT_IN_DATA ]) diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c index a54961c768..858edc63bf 100644 --- a/module/os/linux/zfs/vdev_disk.c +++ b/module/os/linux/zfs/vdev_disk.c @@ -468,7 +468,11 @@ vdev_blkg_tryget(struct blkcg_gq *blkg) this_cpu_inc(*count); rc = true; } else { +#ifdef ZFS_PERCPU_REF_COUNT_IN_DATA + rc = atomic_long_inc_not_zero(&ref->data->count); +#else rc = atomic_long_inc_not_zero(&ref->count); +#endif } rcu_read_unlock_sched();