2 * Define default pcounter functions
3 * Note that often used pcounters use dedicated functions to get a speed increase.
4 * (see DEFINE_PCOUNTER/REF_PCOUNTER_MEMBER)
7 #include <linux/module.h>
8 #include <linux/pcounter.h>
10 #include <linux/cpumask.h>
12 static void pcounter_dyn_add(struct pcounter
*self
, int inc
)
14 per_cpu_ptr(self
->per_cpu_values
, smp_processor_id())[0] += inc
;
17 static int pcounter_dyn_getval(const struct pcounter
*self
, int cpu
)
19 return per_cpu_ptr(self
->per_cpu_values
, cpu
)[0];
22 int pcounter_getval(const struct pcounter
*self
)
26 for_each_possible_cpu(cpu
)
27 res
+= self
->getval(self
, cpu
);
31 EXPORT_SYMBOL_GPL(pcounter_getval
);
33 int pcounter_alloc(struct pcounter
*self
)
36 if (self
->add
== NULL
) {
37 self
->per_cpu_values
= alloc_percpu(int);
38 if (self
->per_cpu_values
!= NULL
) {
39 self
->add
= pcounter_dyn_add
;
40 self
->getval
= pcounter_dyn_getval
;
46 EXPORT_SYMBOL_GPL(pcounter_alloc
);
48 void pcounter_free(struct pcounter
*self
)
50 if (self
->per_cpu_values
!= NULL
) {
51 free_percpu(self
->per_cpu_values
);
52 self
->per_cpu_values
= NULL
;
57 EXPORT_SYMBOL_GPL(pcounter_free
);