aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShaohua Li <shaohua.li@intel.com>2010-10-19 23:07:02 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2010-10-20 17:33:58 -0400
commitc957ef2c59e952803766ddc22e89981ab534606f (patch)
tree3add0b22291af02c8675206861327f8314638bb9
parentf01f7c56a1425b9749a99af821e1de334fb64d7e (diff)
percpu: Introduce a read-mostly percpu API
Add a new readmostly percpu section and API. This can be used to avoid dirtying data lines which are generally not written to, which is especially important for data which may be accessed by processors other than the one for which the percpu area belongs to. [ hpa: moved it *after* the page-aligned section, for obvious reasons. ] Signed-off-by: Shaohua Li <shaohua.li@intel.com> LKML-Reference: <1287544022.4571.7.camel@sli10-conroe.sh.intel.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--include/asm-generic/vmlinux.lds.h4
-rw-r--r--include/linux/percpu-defs.h9
2 files changed, 13 insertions, 0 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 8a92a170fb7d..d7e7b21511b1 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -677,7 +677,9 @@
677 - LOAD_OFFSET) { \ 677 - LOAD_OFFSET) { \
678 VMLINUX_SYMBOL(__per_cpu_start) = .; \ 678 VMLINUX_SYMBOL(__per_cpu_start) = .; \
679 *(.data..percpu..first) \ 679 *(.data..percpu..first) \
680 . = ALIGN(PAGE_SIZE); \
680 *(.data..percpu..page_aligned) \ 681 *(.data..percpu..page_aligned) \
682 *(.data..percpu..readmostly) \
681 *(.data..percpu) \ 683 *(.data..percpu) \
682 *(.data..percpu..shared_aligned) \ 684 *(.data..percpu..shared_aligned) \
683 VMLINUX_SYMBOL(__per_cpu_end) = .; \ 685 VMLINUX_SYMBOL(__per_cpu_end) = .; \
@@ -703,6 +705,8 @@
703 VMLINUX_SYMBOL(__per_cpu_load) = .; \ 705 VMLINUX_SYMBOL(__per_cpu_load) = .; \
704 VMLINUX_SYMBOL(__per_cpu_start) = .; \ 706 VMLINUX_SYMBOL(__per_cpu_start) = .; \
705 *(.data..percpu..first) \ 707 *(.data..percpu..first) \
708 . = ALIGN(PAGE_SIZE); \
709 *(.data..percpu..readmostly) \
706 *(.data..percpu..page_aligned) \ 710 *(.data..percpu..page_aligned) \
707 *(.data..percpu) \ 711 *(.data..percpu) \
708 *(.data..percpu..shared_aligned) \ 712 *(.data..percpu..shared_aligned) \
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h
index ce2dc655cd1d..27ef6b190ea6 100644
--- a/include/linux/percpu-defs.h
+++ b/include/linux/percpu-defs.h
@@ -139,6 +139,15 @@
139 __aligned(PAGE_SIZE) 139 __aligned(PAGE_SIZE)
140 140
141/* 141/*
142 * Declaration/definition used for per-CPU variables that must be read mostly.
143 */
144#define DECLARE_PER_CPU_READ_MOSTLY(type, name) \
145 DECLARE_PER_CPU_SECTION(type, name, "..readmostly")
146
147#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
148 DEFINE_PER_CPU_SECTION(type, name, "..readmostly")
149
150/*
142 * Intermodule exports for per-CPU variables. sparse forgets about 151 * Intermodule exports for per-CPU variables. sparse forgets about
143 * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to 152 * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
144 * noop if __CHECKER__. 153 * noop if __CHECKER__.