LCOV - code coverage report
Current view: top level - include/asm-generic - percpu.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1 100.0 %
Date: 2017-01-25 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef _ASM_GENERIC_PERCPU_H_
       2             : #define _ASM_GENERIC_PERCPU_H_
       3             : 
       4             : #include <linux/compiler.h>
       5             : #include <linux/threads.h>
       6             : #include <linux/percpu-defs.h>
       7             : 
       8             : #ifdef CONFIG_SMP
       9             : 
      10             : /*
      11             :  * per_cpu_offset() is the offset that has to be added to a
      12             :  * percpu variable to get to the instance for a certain processor.
      13             :  *
      14             :  * Most arches use the __per_cpu_offset array for those offsets but
      15             :  * some arches have their own ways of determining the offset (x86_64, s390).
      16             :  */
      17             : #ifndef __per_cpu_offset
      18           1 : extern unsigned long __per_cpu_offset[NR_CPUS];
      19             : 
      20             : #define per_cpu_offset(x) (__per_cpu_offset[x])
      21             : #endif
      22             : 
      23             : /*
      24             :  * Determine the offset for the currently active processor.
      25             :  * An arch may define __my_cpu_offset to provide a more effective
      26             :  * means of obtaining the offset to the per cpu variables of the
      27             :  * current processor.
      28             :  */
      29             : #ifndef __my_cpu_offset
      30             : #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
      31             : #endif
      32             : #ifdef CONFIG_DEBUG_PREEMPT
      33             : #define my_cpu_offset per_cpu_offset(smp_processor_id())
      34             : #else
      35             : #define my_cpu_offset __my_cpu_offset
      36             : #endif
      37             : 
      38             : /*
      39             :  * Add a offset to a pointer but keep the pointer as is.
      40             :  *
      41             :  * Only S390 provides its own means of moving the pointer.
      42             :  */
      43             : #ifndef SHIFT_PERCPU_PTR
      44             : #define SHIFT_PERCPU_PTR(__p, __offset) RELOC_HIDE((__p), (__offset))
      45             : #endif
      46             : 
      47             : /*
      48             :  * A percpu variable may point to a discarded regions. The following are
      49             :  * established ways to produce a usable pointer from the percpu variable
      50             :  * offset.
      51             :  */
      52             : #define per_cpu(var, cpu) \
      53             :         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu)))
      54             : #define __get_cpu_var(var) \
      55             :         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), my_cpu_offset))
      56             : #define __raw_get_cpu_var(var) \
      57             :         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), __my_cpu_offset))
      58             : 
      59             : #define this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, my_cpu_offset)
      60             : #define __this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
      61             : 
      62             : 
      63             : #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
      64             : extern void setup_per_cpu_areas(void);
      65             : #endif
      66             : 
      67             : #else /* ! SMP */
      68             : 
      69             : #define per_cpu(var, cpu)                       (*((void)(cpu), &per_cpu_var(var)))
      70             : #define __get_cpu_var(var)                      per_cpu_var(var)
      71             : #define __raw_get_cpu_var(var)                  per_cpu_var(var)
      72             : #define this_cpu_ptr(ptr) per_cpu_ptr(ptr, 0)
      73             : #define __this_cpu_ptr(ptr) this_cpu_ptr(ptr)
      74             : 
      75             : #endif  /* SMP */
      76             : 
      77             : #ifndef PER_CPU_BASE_SECTION
      78             : #ifdef CONFIG_SMP
      79             : #define PER_CPU_BASE_SECTION ".data.percpu"
      80             : #else
      81             : #define PER_CPU_BASE_SECTION ".data"
      82             : #endif
      83             : #endif
      84             : 
      85             : #ifdef CONFIG_SMP
      86             : 
      87             : #ifdef MODULE
      88             : #define PER_CPU_SHARED_ALIGNED_SECTION ""
      89             : #define PER_CPU_ALIGNED_SECTION ""
      90             : #else
      91             : #define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned"
      92             : #define PER_CPU_ALIGNED_SECTION ".shared_aligned"
      93             : #endif
      94             : #define PER_CPU_FIRST_SECTION ".first"
      95             : 
      96             : #else
      97             : 
      98             : #define PER_CPU_SHARED_ALIGNED_SECTION ""
      99             : #define PER_CPU_ALIGNED_SECTION ".shared_aligned"
     100             : #define PER_CPU_FIRST_SECTION ""
     101             : 
     102             : #endif
     103             : 
     104             : #ifndef PER_CPU_ATTRIBUTES
     105             : #define PER_CPU_ATTRIBUTES
     106             : #endif
     107             : 
     108             : #ifndef PER_CPU_DEF_ATTRIBUTES
     109             : #define PER_CPU_DEF_ATTRIBUTES
     110             : #endif
     111             : 
     112             : #endif /* _ASM_GENERIC_PERCPU_H_ */

Generated by: LCOV version 1.10