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

Commit cc571658 authored by Vivek Goyal's avatar Vivek Goyal Committed by Linus Torvalds
Browse files

[PATCH] kdump: dynamic per cpu allocation of memory for saving cpu registers



- In case of system crash, current state of cpu registers is saved in memory
  in elf note format.  So far memory for storing elf notes was being allocated
  statically for NR_CPUS.

- This patch introduces dynamic allocation of memory for storing elf notes.
  It uses alloc_percpu() interface.  This should lead to better memory usage.

- Introduced based on Andi Kleen's and Eric W. Biederman's suggestions.

- This patch also moves memory allocation for elf notes from architecture
  dependent portion to architecture independent portion.  Now crash_notes is
  architecture independent.  The whole idea is that size of memory to be
  allocated per cpu (MAX_NOTE_BYTES) can be architecture dependent and
  allocation of this memory can be architecture independent.

Signed-off-by: default avatarVivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 82409411
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@
#include <mach_ipi.h>


note_buf_t crash_notes[NR_CPUS];
/* This keeps a track of which one is crashing cpu. */
static int crashing_cpu;

@@ -72,7 +71,9 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu)
	 * squirrelled away.  ELF notes happen to provide
	 * all of that that no need to invent something new.
	 */
	buf = &crash_notes[cpu][0];
	buf = (u32*)per_cpu_ptr(crash_notes, cpu);
	if (!buf)
		return;
	memset(&prstatus, 0, sizeof(prstatus));
	prstatus.pr_pid = current->pid;
	elf_core_copy_regs(&prstatus.pr_reg, regs);
+0 −6
Original line number Diff line number Diff line
@@ -28,12 +28,6 @@ typedef NORET_TYPE void (*relocate_new_kernel_t)(
const extern unsigned char relocate_new_kernel[];
const extern unsigned int relocate_new_kernel_size;

/*
 * Provide a dummy crash_notes definition while crash dump arrives to ppc.
 * This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
 */
note_buf_t crash_notes[NR_CPUS];

void machine_shutdown(void)
{
	if (ppc_md.machine_shutdown)
+0 −2
Original line number Diff line number Diff line
@@ -10,8 +10,6 @@
#include <linux/threads.h>
#include <linux/kexec.h>

note_buf_t crash_notes[NR_CPUS];

void machine_crash_shutdown(struct pt_regs *regs)
{
}
+0 −2
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@
#include <asm/nmi.h>
#include <asm/hw_irq.h>

note_buf_t crash_notes[NR_CPUS];

void machine_crash_shutdown(struct pt_regs *regs)
{
	/* This function is only called after the system
+0 −3
Original line number Diff line number Diff line
@@ -26,8 +26,5 @@
#define KEXEC_ARCH KEXEC_ARCH_386

#define MAX_NOTE_BYTES 1024
typedef u32 note_buf_t[MAX_NOTE_BYTES/4];

extern note_buf_t crash_notes[];

#endif /* _I386_KEXEC_H */
Loading