Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5fb7dc37 authored by Fenghua Yu's avatar Fenghua Yu Committed by Linus Torvalds
Browse files

define new percpu interface for shared data



per cpu data section contains two types of data.  One set which is
exclusively accessed by the local cpu and the other set which is per cpu,
but also shared by remote cpus.  In the current kernel, these two sets are
not clearely separated out.  This can potentially cause the same data
cacheline shared between the two sets of data, which will result in
unnecessary bouncing of the cacheline between cpus.

One way to fix the problem is to cacheline align the remotely accessed per
cpu data, both at the beginning and at the end.  Because of the padding at
both ends, this will likely cause some memory wastage and also the
interface to achieve this is not clean.

This patch:

Moves the remotely accessed per cpu data (which is currently marked
as ____cacheline_aligned_in_smp) into a different section, where all the data
elements are cacheline aligned. And as such, this differentiates the local
only data and remotely accessed data cleanly.

Signed-off-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Acked-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: <linux-arch@vger.kernel.org>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3d7e3382
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -69,10 +69,7 @@ SECTIONS
  . = ALIGN(8);
  SECURITY_INIT

  . = ALIGN(8192);
  __per_cpu_start = .;
  .data.percpu : { *(.data.percpu) }
  __per_cpu_end = .;
  PERCPU(8192)

  . = ALIGN(2*8192);
  __init_end = .;
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ SECTIONS
		. = ALIGN(4096);
		__per_cpu_start = .;
			*(.data.percpu)
			*(.data.percpu.shared_aligned)
		__per_cpu_end = .;
#ifndef CONFIG_XIP_KERNEL
		__init_begin = _stext;
+1 −4
Original line number Diff line number Diff line
@@ -91,10 +91,7 @@ SECTIONS
	}
	SECURITY_INIT

	. =  ALIGN (8192);
	__per_cpu_start = .;
	.data.percpu  : { *(.data.percpu) }
	__per_cpu_end = .;
	PERCPU(8192)

#ifdef CONFIG_BLK_DEV_INITRD
	.init.ramfs : {
+1 −4
Original line number Diff line number Diff line
@@ -57,10 +57,7 @@ SECTIONS
  __alt_instructions_end = .;
 .altinstr_replacement : { *(.altinstr_replacement) }

  . = ALIGN(4096);
  __per_cpu_start = .;
  .data.percpu  : { *(.data.percpu) }
  __per_cpu_end = .;
  PERCPU(4096)

#ifdef CONFIG_BLK_DEV_INITRD
  . = ALIGN(4096);
+1 −0
Original line number Diff line number Diff line
@@ -181,6 +181,7 @@ SECTIONS
  .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
	__per_cpu_start = .;
	*(.data.percpu)
	*(.data.percpu.shared_aligned)
	__per_cpu_end = .;
  }
  . = ALIGN(4096);
Loading