| From 43fb9cec1749b337bfa252fc2c1b0288847e8fa7 Mon Sep 17 00:00:00 2001 |
| From: Andrea Adami <andrea.adami@gmail.com> |
| Date: Wed, 18 Apr 2018 02:21:30 +0200 |
| Subject: [PATCH] crashdump-elf.c: work around for _SC_NPROCESSORS_CONF |
| |
| klibc sysconf lacks this so the implementation |
| of Linus Torvalds was taken (simplified): |
| |
| https://sourceware.org/ml/libc-alpha/2011-06/msg00079.html |
| |
| Have fun reding the thread! |
| |
| Fix |
| |
| crashdump-elf.c:117:21: error: '_SC_NPROCESSORS_CONF' undeclared |
| |
| Upstream-Status: Inappropriate [klibc specific] |
| Signed-off-by: Andrea Adami <andrea.adami@gmail.com> |
| |
| --- |
| kexec/crashdump-elf.c | 92 +++++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 92 insertions(+) |
| |
| diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c |
| index b8bb686..7e6767c 100644 |
| --- a/kexec/crashdump-elf.c |
| +++ b/kexec/crashdump-elf.c |
| @@ -25,6 +25,94 @@ do { \ |
| } while(0) |
| #endif |
| |
| +#ifdef __KLIBC__ |
| +#ifndef KLIBC_SYSFS_CPU_H |
| +#define KLIBC_SYSFS_CPU_H |
| + |
| + |
| +static int __get_sysfs_cpus(const char *path); |
| +int __get_nprocs (void); |
| +int __get_nprocs_conf (void); |
| + |
| + |
| + |
| +static int __get_sysfs_cpus(const char *path) |
| +{ |
| + FILE *file; |
| + int nr_cpus = 0; |
| + int prev = -1; |
| + char *p; |
| + char line[10]; |
| + |
| + |
| + file = fopen(path, "r"); |
| + if (!file) |
| + return -1; |
| + for (;;) { |
| + char sep; |
| + int cpu; |
| + int n; |
| + |
| + /* int n = fscanf(file, "%u%c", &cpu, &sep); */ |
| + p = fgets(line, sizeof(line), file); |
| + if (p == NULL) |
| + return -1; |
| + else |
| + n = sscanf(line, "%u%c", &cpu, &sep); |
| + |
| + if (n <= 0) |
| + break; |
| + |
| + /* EOF == EOLN */ |
| + if (n == 1) |
| + sep = '\n'; |
| + |
| + /* Was the previous CPU a range? */ |
| + if (prev >= 0) { |
| + nr_cpus += cpu - prev + 1; |
| + prev = -1; |
| + } else if (sep == '-') |
| + prev = cpu; |
| + else |
| + nr_cpus++; |
| + |
| + if (sep == '\n') |
| + break; |
| + } |
| + fclose(file); |
| + return nr_cpus; |
| +} |
| + |
| +int __get_nprocs () |
| +{ |
| + long ret; |
| + static int cached = -1; |
| + |
| + ret = cached; |
| + if (ret < 0) |
| + { |
| + ret = __get_sysfs_cpus("/sys/devices/system/cpu/online"); |
| + cached = ret; |
| + } |
| + return ret; |
| +} |
| + |
| +int __get_nprocs_conf () |
| +{ |
| + long ret; |
| + static int cached = -1; |
| + |
| + ret = cached; |
| + if (ret < 0) |
| + { |
| + ret = __get_sysfs_cpus("/sys/devices/system/cpu/possible"); |
| + cached = ret; |
| + } |
| + return ret; |
| +} |
| +#endif |
| +#endif |
| + |
| /* Prepares the crash memory headers and stores in supplied buffer. */ |
| int FUNC(struct kexec_info *info, |
| struct crash_elf_info *elf_info, |
| @@ -46,7 +134,11 @@ int FUNC(struct kexec_info *info, |
| if (xen_present()) |
| nr_cpus = xen_get_nr_phys_cpus(); |
| else |
| +#ifndef __KLIBC__ |
| nr_cpus = sysconf(_SC_NPROCESSORS_CONF); |
| +#else |
| + nr_cpus = __get_nprocs_conf(); |
| +#endif |
| |
| if (nr_cpus < 0) { |
| return -1; |