86706441a8
wmsum counters are a reduced version of aggsum counters, optimized for write-mostly scenarios. They do not provide optimized read functions, but instead allow much cheaper add function. The primary usage is infrequently read statistic counters, not requiring exact precision. The Linux implementation is directly mapped into percpu_counter KPI. The FreeBSD implementation is directly mapped into counter(9) KPI. In user-space due to lack of better implementation mapped to aggsum. Unfortunately neither Linux percpu_counter nor FreeBSD counter(9) provide sufficient functionality to completelly replace aggsum, so it still remains to be used for several hot counters. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored-By: iXsystems, Inc. Closes #12114
88 lines
2.2 KiB
Plaintext
88 lines
2.2 KiB
Plaintext
dnl #
|
|
dnl # 3.18 API change,
|
|
dnl # The function percpu_counter_init now must be passed a GFP mask.
|
|
dnl #
|
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_PERCPU_COUNTER_INIT], [
|
|
ZFS_LINUX_TEST_SRC([percpu_counter_init_with_gfp], [
|
|
#include <linux/gfp.h>
|
|
#include <linux/percpu_counter.h>
|
|
],[
|
|
struct percpu_counter counter;
|
|
int error;
|
|
|
|
error = percpu_counter_init(&counter, 0, GFP_KERNEL);
|
|
])
|
|
])
|
|
|
|
AC_DEFUN([ZFS_AC_KERNEL_PERCPU_COUNTER_INIT], [
|
|
AC_MSG_CHECKING([whether percpu_counter_init() wants gfp_t])
|
|
ZFS_LINUX_TEST_RESULT([percpu_counter_init_with_gfp], [
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_PERCPU_COUNTER_INIT_WITH_GFP, 1,
|
|
[percpu_counter_init() wants gfp_t])
|
|
],[
|
|
AC_MSG_RESULT(no)
|
|
])
|
|
])
|
|
|
|
dnl #
|
|
dnl # 4.13 API change,
|
|
dnl # __percpu_counter_add() was renamed to percpu_counter_add_batch().
|
|
dnl #
|
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_PERCPU_COUNTER_ADD_BATCH], [
|
|
ZFS_LINUX_TEST_SRC([percpu_counter_add_batch], [
|
|
#include <linux/percpu_counter.h>
|
|
],[
|
|
struct percpu_counter counter;
|
|
|
|
percpu_counter_add_batch(&counter, 1, 1);
|
|
])
|
|
])
|
|
|
|
AC_DEFUN([ZFS_AC_KERNEL_PERCPU_COUNTER_ADD_BATCH], [
|
|
AC_MSG_CHECKING([whether percpu_counter_add_batch() is defined])
|
|
ZFS_LINUX_TEST_RESULT([percpu_counter_add_batch], [
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_PERCPU_COUNTER_ADD_BATCH, 1,
|
|
[percpu_counter_add_batch() is defined])
|
|
],[
|
|
AC_MSG_RESULT(no)
|
|
])
|
|
])
|
|
|
|
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_COUNTER_ADD_BATCH
|
|
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_COUNTER_ADD_BATCH
|
|
ZFS_AC_KERNEL_PERCPU_REF_COUNT_IN_DATA
|
|
])
|