We used 1024 as the percpu crash note size. But for new kernel that exports the real crash note size, we should parse it instead of using 1024. Signed-off-by: Zhang Yanfei <zhangyanfei at cn.fujitsu.com> --- kexec/crashdump.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/kexec/crashdump.c b/kexec/crashdump.c index 70817b8..8d88fdf 100644 --- a/kexec/crashdump.c +++ b/kexec/crashdump.c @@ -65,6 +65,7 @@ unsigned long crash_architecture(struct crash_elf_info *elf_info) int get_crash_notes_per_cpu(int cpu, uint64_t *addr, uint64_t *len) { char crash_notes[PATH_MAX]; + char crash_notes_size[PATH_MAX]; char line[MAX_LINE]; FILE *fp; struct stat cpu_stat; @@ -101,12 +102,27 @@ int get_crash_notes_per_cpu(int cpu, uint64_t *addr, uint64_t *len) if (count != 1) die("Cannot parse %s: %s\n", crash_notes, strerror(errno)); *addr = (uint64_t) temp; - *len = MAX_NOTE_BYTES; /* we should get this from the kernel instead */ + fclose(fp); + + *len = MAX_NOTE_BYTES; + sprintf(crash_notes_size, + "/sys/devices/system/cpu/cpu%d/crash_notes_size", cpu); + fp = fopen(crash_notes_size, "r"); + if (fp) { + if (!fgets(line, sizeof(line), fp)) + die("Cannot parse %s: %s\n", + crash_notes_size, strerror(errno)); + count = sscanf(line, "%Lu", &temp); + if (count != 1) + die("Cannot parse %s: %s\n", + crash_notes_size, strerror(errno)); + *len = (uint64_t) temp; + fclose(fp); + } - dbgprintf("%s: crash_notes addr = %Lx\n", __FUNCTION__, - (unsigned long long)*addr); + dbgprintf("%s: crash_notes addr = %Lx, size = %Lu\n", __FUNCTION__, + (unsigned long long)*addr, (unsigned long long)*len); - fclose(fp); return 0; } -- 1.7.1