The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/pcounter.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    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)
    5  */
    6 
    7 #include <linux/module.h>
    8 #include <linux/pcounter.h>
    9 #include <linux/smp.h>
   10 #include <linux/cpumask.h>
   11 
   12 static void pcounter_dyn_add(struct pcounter *self, int inc)
   13 {
   14         per_cpu_ptr(self->per_cpu_values, smp_processor_id())[0] += inc;
   15 }
   16 
   17 static int pcounter_dyn_getval(const struct pcounter *self, int cpu)
   18 {
   19         return per_cpu_ptr(self->per_cpu_values, cpu)[0];
   20 }
   21 
   22 int pcounter_getval(const struct pcounter *self)
   23 {
   24         int res = 0, cpu;
   25 
   26         for_each_possible_cpu(cpu)
   27                 res += self->getval(self, cpu);
   28 
   29         return res;
   30 }
   31 EXPORT_SYMBOL_GPL(pcounter_getval);
   32 
   33 int pcounter_alloc(struct pcounter *self)
   34 {
   35         int rc = 0;
   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;
   41                 } else
   42                         rc = 1;
   43         }
   44         return rc;
   45 }
   46 EXPORT_SYMBOL_GPL(pcounter_alloc);
   47 
   48 void pcounter_free(struct pcounter *self)
   49 {
   50         if (self->per_cpu_values != NULL) {
   51                 free_percpu(self->per_cpu_values);
   52                 self->per_cpu_values = NULL;
   53                 self->getval = NULL;
   54                 self->add = NULL;
   55         }
   56 }
   57 EXPORT_SYMBOL_GPL(pcounter_free);
   58 

Cache object: 82ae749698efc5b20fec3bafe3c5f72a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.