diff options
-rw-r--r-- | drivers/base/cpu.c | 32 | ||||
-rw-r--r-- | kernel/ksysfs.c | 13 |
2 files changed, 32 insertions, 13 deletions
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 281d26784d2..982e6583cd6 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -83,6 +83,33 @@ static inline void register_cpu_control(struct cpu *cpu) } #endif /* CONFIG_HOTPLUG_CPU */ +#ifdef CONFIG_KEXEC +#include <linux/kexec.h> + +static ssize_t show_crash_notes(struct sys_device *dev, char *buf) +{ + struct cpu *cpu = container_of(dev, struct cpu, sysdev); + ssize_t rc; + unsigned long long addr; + int cpunum; + + cpunum = cpu->sysdev.id; + + /* + * Might be reading other cpu's data based on which cpu read thread + * has been scheduled. But cpu data (memory) is allocated once during + * boot up and this data does not change there after. Hence this + * operation should be safe. No locking required. + */ + get_cpu(); + addr = __pa(per_cpu_ptr(crash_notes, cpunum)); + rc = sprintf(buf, "%Lx\n", addr); + put_cpu(); + return rc; +} +static SYSDEV_ATTR(crash_notes, 0400, show_crash_notes, NULL); +#endif + /* * register_cpu - Setup a driverfs device for a CPU. * @cpu - Callers can set the cpu->no_control field to 1, to indicate not to @@ -108,6 +135,11 @@ int __devinit register_cpu(struct cpu *cpu, int num, struct node *root) register_cpu_control(cpu); if (!error) cpu_sys_devices[num] = &cpu->sysdev; + +#ifdef CONFIG_KEXEC + if (!error) + error = sysdev_create_file(&cpu->sysdev, &attr_crash_notes); +#endif return error; } diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index 99af8b05eea..d5eeae0fa5b 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c @@ -51,16 +51,6 @@ static ssize_t uevent_helper_store(struct subsystem *subsys, const char *page, s KERNEL_ATTR_RW(uevent_helper); #endif -#ifdef CONFIG_KEXEC -#include <asm/kexec.h> - -static ssize_t crash_notes_show(struct subsystem *subsys, char *page) -{ - return sprintf(page, "%p\n", (void *)crash_notes); -} -KERNEL_ATTR_RO(crash_notes); -#endif - decl_subsys(kernel, NULL, NULL); EXPORT_SYMBOL_GPL(kernel_subsys); @@ -69,9 +59,6 @@ static struct attribute * kernel_attrs[] = { &uevent_seqnum_attr.attr, &uevent_helper_attr.attr, #endif -#ifdef CONFIG_KEXEC - &crash_notes_attr.attr, -#endif NULL }; |