[PATCH] fix kexec load hang in case crash notes addr read failure

Dave Young dyoung at redhat.com
Thu Sep 24 19:37:51 PDT 2015


While readng crash note, count_cpu variable will be never decreased in case
any failure to read the sysfs file.

The issue was found during I test CONFIG_KEXEC_FILE only kernel option.
crash_notes are exported to sysfs only for CONFIG_KEXEC. In latest kernel
we can configure kernel with CONFIG_KEXEC_FILE only in Kconfig. In this
case, if you run a kernel with kexec_file only but do not specify "-s"
in kexec-tools arguments, then kexec-tools will hang there.

Though "-s" is mandatory for kexec_file_load, kexec should still fail out
instead of hanging.

Fixing the problem by always decreasing count_cpu in the for loop.

Signed-off-by: Dave Young <dyoung at redhat.com>
---
Ideally checking if kernel support kexec_load or kexec_file_load syscall
early is better, but there's no apparent way to check it, call the syscalls
with fake arguments then check return value sounds bad..

 kexec/crashdump-elf.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

--- kexec-tools.orig/kexec/crashdump-elf.c
+++ kexec-tools/kexec/crashdump-elf.c
@@ -141,11 +141,12 @@ int FUNC(struct kexec_info *info,
 
 	count_cpu = nr_cpus;
 	for (i = 0; count_cpu > 0; i++) {
-		if (get_note_info(i, &notes_addr, &notes_len) < 0) {
-			/* This cpu is not present. Skip it. */
-			continue;
-		}
+		int ret;
+
+		ret = get_note_info(i, &notes_addr, &notes_len);
 		count_cpu--;
+		if (ret < 0) /* This cpu is not present. Skip it. */
+			continue;
 
 		phdr = (PHDR *) bufp;
 		bufp += sizeof(PHDR);



More information about the kexec mailing list