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 <behlendorf1@llnl.gov>
Signed-off-by: Coleman Kane <ckane@colemankane.org>
Closes #11085
This commit is contained in:
Coleman Kane 2020-10-18 10:36:12 -04:00 committed by Brian Behlendorf
parent 8c7d604c62
commit 838a249012
2 changed files with 30 additions and 0 deletions

View File

@ -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 <linux/percpu-refcount.h>
],[
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
])

View File

@ -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();