1From 1cfee75d9662c3382bb7cb8f1c952333837598ae Mon Sep 17 00:00:00 2001
2From: Andrea Adami <andrea.adami@gmail.com>
3Date: Wed, 18 Apr 2018 02:21:30 +0200
4Subject: [PATCH] crashdump-elf.c: work around for _SC_NPROCESSORS_CONF
5
6klibc sysconf lacks this so the implementation
7of Linus Torvalds was taken (simplified):
8
9https://sourceware.org/ml/libc-alpha/2011-06/msg00079.html
10
11Have fun reding the thread!
12
13Fix
14
15 crashdump-elf.c:117:21: error: '_SC_NPROCESSORS_CONF' undeclared
16
17Upstream-Status: Inappropriate [klibc specific]
18Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
19
20---
21 kexec/crashdump-elf.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++
22 1 file changed, 92 insertions(+)
23
24diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
25index b8bb686..7e6767c 100644
26--- a/kexec/crashdump-elf.c
27+++ b/kexec/crashdump-elf.c
28@@ -25,6 +25,94 @@ do {									\
29 } while(0)
30 #endif
31
32+#ifdef __KLIBC__
33+#ifndef KLIBC_SYSFS_CPU_H
34+#define KLIBC_SYSFS_CPU_H
35+
36+
37+static int __get_sysfs_cpus(const char *path);
38+int __get_nprocs (void);
39+int __get_nprocs_conf (void);
40+
41+
42+
43+static int __get_sysfs_cpus(const char *path)
44+{
45+	FILE *file;
46+	int nr_cpus = 0;
47+	int prev = -1;
48+	char *p;
49+	char line[10];
50+
51+
52+	file = fopen(path, "r");
53+	if (!file)
54+		return -1;
55+	for (;;) {
56+		char sep;
57+		int cpu;
58+		int n;
59+
60+		/* int n = fscanf(file, "%u%c", &cpu, &sep); */
61+		p = fgets(line, sizeof(line), file);
62+		if (p == NULL)
63+			return -1;
64+		else
65+			n = sscanf(line, "%u%c", &cpu, &sep);
66+
67+		if (n <= 0)
68+			break;
69+
70+		/* EOF == EOLN */
71+		if (n == 1)
72+			sep = '\n';
73+
74+		/* Was the previous CPU a range? */
75+		if (prev >= 0) {
76+			nr_cpus += cpu - prev + 1;
77+			prev = -1;
78+		} else if (sep == '-')
79+			prev = cpu;
80+		else
81+		nr_cpus++;
82+
83+		if (sep == '\n')
84+			break;
85+	}
86+	fclose(file);
87+	return nr_cpus;
88+}
89+
90+int __get_nprocs ()
91+{
92+	long ret;
93+	static int cached = -1;
94+
95+	ret = cached;
96+	if (ret < 0)
97+	{
98+		ret = __get_sysfs_cpus("/sys/devices/system/cpu/online");
99+		cached = ret;
100+	}
101+	return ret;
102+}
103+
104+int __get_nprocs_conf ()
105+{
106+	long ret;
107+	static int cached = -1;
108+
109+	ret = cached;
110+	if (ret < 0)
111+	{
112+		ret = __get_sysfs_cpus("/sys/devices/system/cpu/possible");
113+		cached = ret;
114+	}
115+	return ret;
116+}
117+#endif
118+#endif
119+
120 /* Prepares the crash memory headers and stores in supplied buffer. */
121 int FUNC(struct kexec_info *info,
122 	 struct crash_elf_info *elf_info,
123@@ -46,7 +134,11 @@ int FUNC(struct kexec_info *info,
124 	if (xen_present())
125 		nr_cpus = xen_get_nr_phys_cpus();
126 	else
127+#ifndef __KLIBC__
128 		nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
129+#else
130+		nr_cpus = __get_nprocs_conf();
131+#endif
132
133 	if (nr_cpus < 0) {
134 		return -1;
135