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, ¬es_addr, ¬es_len) < 0) { - /* This cpu is not present. Skip it. */ - continue; - } + int ret; + + ret = get_note_info(i, ¬es_addr, ¬es_len); count_cpu--; + if (ret < 0) /* This cpu is not present. Skip it. */ + continue; phdr = (PHDR *) bufp; bufp += sizeof(PHDR);