This adds sysfs entries /sys/kernel/kexec_newkernel_phys and /sys/kernel/kexec_newkernel_memsz. Both are supposed to be passed to a balloon driver. --- include/linux/kexec.h | 5 +++++ kernel/kexec.c | 24 ++++++++++++++++++++++++ kernel/ksysfs.c | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/include/linux/kexec.h b/include/linux/kexec.h index d0b8458..3a317b6 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -203,6 +203,11 @@ int crash_shrink_memory(unsigned long new_size); size_t crash_get_memory_size(void); void crash_free_reserved_phys_range(unsigned long begin, unsigned long end); +unsigned long kexec_newkernel_get_phys(void); +void kexec_newkernel_set_phys(unsigned long phys); +unsigned long kexec_newkernel_get_memsz(void); +void kexec_newkernel_set_memsz(unsigned long memsz); + #else /* !CONFIG_KEXEC */ struct pt_regs; struct task_struct; diff --git a/kernel/kexec.c b/kernel/kexec.c index 5e4bd78..9e421a8 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -38,6 +38,9 @@ #include <asm/io.h> #include <asm/sections.h> +static unsigned long kexec_newkernel_phys; +static unsigned long kexec_newkernel_memsz; + /* Per cpu memory for storing cpu states in case of system crash. */ note_buf_t __percpu *crash_notes; @@ -62,6 +65,27 @@ int kexec_should_crash(struct task_struct *p) return 0; } +unsigned long kexec_newkernel_get_phys(void) +{ + return kexec_newkernel_phys; +} + +void kexec_newkernel_set_phys(unsigned long phys) +{ + printk("%s: kexec_newkernel_phys %lx -> %lx\n", __func__, kexec_newkernel_phys, phys); + kexec_newkernel_phys = phys; +} + +unsigned long kexec_newkernel_get_memsz(void) +{ + return kexec_newkernel_memsz; +} + +void kexec_newkernel_set_memsz(unsigned long memsz) +{ + printk("%s: kexec_newkernel_mensz %lx -> %lx\n", __func__, kexec_newkernel_memsz, memsz); + kexec_newkernel_memsz = memsz; +} /* * When kexec transitions to the new kernel there is a one-to-one * mapping between physical and virtual addresses. On processors diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index 6ada93c..0660e40 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c @@ -121,6 +121,44 @@ static ssize_t kexec_crash_size_store(struct kobject *kobj, } KERNEL_ATTR_RW(kexec_crash_size); +static ssize_t kexec_newkernel_phys_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "%zu\n", kexec_newkernel_get_phys()); +} +static ssize_t kexec_newkernel_phys_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned long phys; + + if (strict_strtoul(buf, 0, &phys)) + return -EINVAL; + + kexec_newkernel_set_phys(phys); + return count; +} +KERNEL_ATTR_RW(kexec_newkernel_phys); + +static ssize_t kexec_newkernel_memsz_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "%zu\n", kexec_newkernel_get_memsz()); +} +static ssize_t kexec_newkernel_memsz_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned long memsz; + + if (strict_strtoul(buf, 0, &memsz)) + return -EINVAL; + + kexec_newkernel_set_memsz(memsz); + return count; +} +KERNEL_ATTR_RW(kexec_newkernel_memsz); + static ssize_t vmcoreinfo_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -194,6 +232,8 @@ static struct attribute * kernel_attrs[] = { &kexec_loaded_attr.attr, &kexec_crash_loaded_attr.attr, &kexec_crash_size_attr.attr, + &kexec_newkernel_phys_attr.attr, + &kexec_newkernel_memsz_attr.attr, &vmcoreinfo_attr.attr, #endif &rcu_expedited_attr.attr, -- 1.8.1