diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2013-07-01 02:48:27 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2013-07-01 02:48:27 +0000 |
commit | 70a7dd5d5b8e44d71d8c558de14b3de9676e2c75 (patch) | |
tree | deb434fb43078d707abe17000dc24dc135613d7e /sys/amd64/include/counter.h | |
parent | 7476f6973c109455d465deddb705dc8e9f040335 (diff) | |
download | src-test2-70a7dd5d5b8e44d71d8c558de14b3de9676e2c75.tar.gz src-test2-70a7dd5d5b8e44d71d8c558de14b3de9676e2c75.zip |
Notes
Diffstat (limited to 'sys/amd64/include/counter.h')
-rw-r--r-- | sys/amd64/include/counter.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/sys/amd64/include/counter.h b/sys/amd64/include/counter.h index b37a4b836a79..b571e70769a9 100644 --- a/sys/amd64/include/counter.h +++ b/sys/amd64/include/counter.h @@ -36,6 +36,44 @@ extern struct pcpu __pcpu[1]; #define counter_enter() do {} while (0) #define counter_exit() do {} while (0) +#ifdef IN_SUBR_COUNTER_C +static inline uint64_t +counter_u64_read_one(uint64_t *p, int cpu) +{ + + return (*(uint64_t *)((char *)p + sizeof(struct pcpu) * cpu)); +} + +static inline uint64_t +counter_u64_fetch_inline(uint64_t *p) +{ + uint64_t r; + int i; + + r = 0; + for (i = 0; i < mp_ncpus; i++) + r += counter_u64_read_one((uint64_t *)p, i); + + return (r); +} + +static void +counter_u64_zero_one_cpu(void *arg) +{ + + *((uint64_t *)((char *)arg + sizeof(struct pcpu) * + PCPU_GET(cpuid))) = 0; +} + +static inline void +counter_u64_zero_inline(counter_u64_t c) +{ + + smp_rendezvous(smp_no_rendevous_barrier, counter_u64_zero_one_cpu, + smp_no_rendevous_barrier, c); +} +#endif + #define counter_u64_add_protected(c, i) counter_u64_add(c, i) static inline void |