[PATCH] kexec: Parse percpu note size from kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux