浏览代码

linker script: define __per_cpu_load on all SMP capable archs

Impact: __per_cpu_load available on all SMP capable archs

Percpu now requires three symbols to be defined - __per_cpu_load,
__per_cpu_start and __per_cpu_end.  There were three archs which
didn't have it.  Update them as follows.

* powerpc: can use generic PERCPU() macro.  Compile tested for
  powerpc32, compile/boot tested for powerpc64.

* ia64: can use generic PERCPU_VADDR() macro.  __phys_per_cpu_start is
  identical to __per_cpu_load.  Compile tested and symbol table looks
  identical after the change except for the additional __per_cpu_load.

* arm: added explicit __per_cpu_load definition.  Currently uses
  unified .init output section so can't use the generic macro.  Dunno
  whether the unified .init ouput section is required by arch
  peculiarity so I left it alone.  Please break it up and use PERCPU()
  if possible.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Pat Gefre <pfg@sgi.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Tejun Heo 16 年之前
父节点
当前提交
19390c4d03
共有 3 个文件被更改,包括 4 次插入18 次删除
  1. 1 0
      arch/arm/kernel/vmlinux.lds.S
  2. 2 10
      arch/ia64/kernel/vmlinux.lds.S
  3. 1 8
      arch/powerpc/kernel/vmlinux.lds.S

+ 1 - 0
arch/arm/kernel/vmlinux.lds.S

@@ -64,6 +64,7 @@ SECTIONS
 		__initramfs_end = .;
 		__initramfs_end = .;
 #endif
 #endif
 		. = ALIGN(4096);
 		. = ALIGN(4096);
+		__per_cpu_load = .;
 		__per_cpu_start = .;
 		__per_cpu_start = .;
 			*(.data.percpu.page_aligned)
 			*(.data.percpu.page_aligned)
 			*(.data.percpu)
 			*(.data.percpu)

+ 2 - 10
arch/ia64/kernel/vmlinux.lds.S

@@ -213,17 +213,9 @@ SECTIONS
         { *(.data.cacheline_aligned) }
         { *(.data.cacheline_aligned) }
 
 
   /* Per-cpu data: */
   /* Per-cpu data: */
-  percpu : { } :percpu
   . = ALIGN(PERCPU_PAGE_SIZE);
   . = ALIGN(PERCPU_PAGE_SIZE);
-  __phys_per_cpu_start = .;
-  .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET)
-	{
-		__per_cpu_start = .;
-		*(.data.percpu.page_aligned)
-		*(.data.percpu)
-		*(.data.percpu.shared_aligned)
-		__per_cpu_end = .;
-	}
+  PERCPU_VADDR(PERCPU_ADDR, :percpu)
+  __phys_per_cpu_start = __per_cpu_load;
   . = __phys_per_cpu_start + PERCPU_PAGE_SIZE;	/* ensure percpu data fits
   . = __phys_per_cpu_start + PERCPU_PAGE_SIZE;	/* ensure percpu data fits
   						 * into percpu page size
   						 * into percpu page size
 						 */
 						 */

+ 1 - 8
arch/powerpc/kernel/vmlinux.lds.S

@@ -181,14 +181,7 @@ SECTIONS
 		__initramfs_end = .;
 		__initramfs_end = .;
 	}
 	}
 #endif
 #endif
-	. = ALIGN(PAGE_SIZE);
-	.data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
-		__per_cpu_start = .;
-		*(.data.percpu.page_aligned)
-		*(.data.percpu)
-		*(.data.percpu.shared_aligned)
-		__per_cpu_end = .;
-	}
+	PERCPU(PAGE_SIZE)
 
 
 	. = ALIGN(8);
 	. = ALIGN(8);
 	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
 	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {