[PATCH] kexec: Parse percpu note size from kernel

Zhang Yanfei zhangyanfei at cn.fujitsu.com
Mon Apr 29 21:12:28 EDT 2013


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



More information about the kexec mailing list