/* * CDDL HEADER START * * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. * * CDDL HEADER END */ /* * 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. */ #ifndef _SYS_WMSUM_H #define _SYS_WMSUM_H #include #ifdef __cplusplus extern "C" { #endif typedef struct percpu_counter wmsum_t; static inline void wmsum_init(wmsum_t *ws, uint64_t value) { #ifdef HAVE_PERCPU_COUNTER_INIT_WITH_GFP percpu_counter_init(ws, value, GFP_KERNEL); #else percpu_counter_init(ws, value); #endif } static inline void wmsum_fini(wmsum_t *ws) { percpu_counter_destroy(ws); } static inline uint64_t wmsum_value(wmsum_t *ws) { return (percpu_counter_sum(ws)); } static inline void wmsum_add(wmsum_t *ws, int64_t delta) { #ifdef HAVE_PERCPU_COUNTER_ADD_BATCH percpu_counter_add_batch(ws, delta, INT_MAX / 2); #else __percpu_counter_add(ws, delta, INT_MAX / 2); #endif } #ifdef __cplusplus } #endif #endif /* _SYS_WMSUM_H */