Message ID | Y6ywbxuxqQ/cGPJW@p100 (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] linux-user: Fix /proc/cpuinfo output for sparc and hppa | expand |
On 28/12/22 22:09, Helge Deller wrote: > The sparc and hppa architectures provide an own output for the emulated > /proc/cpuinfo file. > > Some userspace applications count (even if that's not the recommended > way) the number of lines which start with "processor:" and assume that > this number then reflects the number of online CPUs. Since those 3 > architectures don't provide any such line, applications may assume "0" > CPUs. One such issue can be seen in debian bug report: > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024653 > > Avoid such issues by adding a "processor:" line for each of the online > CPUs. > > Signed-off-by: Helge Deller <deller@gmx.de> > > --- > v3: > - add trailing newline at end of /proc/cpuinfo file (needed by procps) > > v2: > - drop m68k part (based on feedback from Laurent Vivier <laurent@vivier.eu>) > - change commit message > > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index afb24fd0b9..5ec11a3683 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -8310,7 +8310,13 @@ static int open_net_route(CPUArchState *cpu_env, int fd) > #if defined(TARGET_SPARC) > static int open_cpuinfo(CPUArchState *cpu_env, int fd) > { > - dprintf(fd, "type\t\t: sun4u\n"); > + int i, num_cpus; > + > + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); > + for (i = 0; i < num_cpus; i++) { > + dprintf(fd, "processor\t: %d\n", i); > + dprintf(fd, "type\t\t: sun4u\n\n"); > + } > return 0; > } > #endif > @@ -8318,11 +8324,17 @@ static int open_cpuinfo(CPUArchState *cpu_env, int fd) > #if defined(TARGET_HPPA) > static int open_cpuinfo(CPUArchState *cpu_env, int fd) > { > - dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); > - dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); > - dprintf(fd, "capabilities\t: os32\n"); > - dprintf(fd, "model\t\t: 9000/778/B160L\n"); > - dprintf(fd, "model name\t: Merlin L2 160 QEMU (9000/778/B160L)\n"); > + int i, num_cpus; > + > + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); > + for (i = 0; i < num_cpus; i++) { > + dprintf(fd, "processor\t: %d\n", i); > + dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); > + dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); > + dprintf(fd, "capabilities\t: os32\n"); > + dprintf(fd, "model\t\t: 9000/778/B160L - " > + "Merlin L2 160 QEMU (9000/778/B160L)\n\n"); > + } > return 0; > } > #endif I'd rather have common code in a single open_cpuinfo() and a per-arch dprintf_cpuinfo(): static void dprintf_cpuinfo(CPUArchState *cpu_env, int fd, unsigned cpuid) { dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); dprintf(fd, "capabilities\t: os32\n"); dprintf(fd, "model\t\t: 9000/778/B160L - " "Merlin L2 160 QEMU (9000/778/B160L)\n"); } static int open_cpuinfo(CPUArchState *cpu_env, int fd) { int i, num_cpus; num_cpus = sysconf(_SC_NPROCESSORS_ONLN); for (i = 0; i < num_cpus; i++) { dprintf(fd, "processor\t: %d\n", i); dprintf_cpuinfo(cpu_env, fd, i); dprintf(fd, "\n"); } return 0; } Anyhow, Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Le 28/12/2022 à 22:09, Helge Deller a écrit : > The sparc and hppa architectures provide an own output for the emulated > /proc/cpuinfo file. > > Some userspace applications count (even if that's not the recommended > way) the number of lines which start with "processor:" and assume that > this number then reflects the number of online CPUs. Since those 3 > architectures don't provide any such line, applications may assume "0" > CPUs. One such issue can be seen in debian bug report: > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024653 > > Avoid such issues by adding a "processor:" line for each of the online > CPUs. > > Signed-off-by: Helge Deller <deller@gmx.de> > > --- > v3: > - add trailing newline at end of /proc/cpuinfo file (needed by procps) > > v2: > - drop m68k part (based on feedback from Laurent Vivier <laurent@vivier.eu>) > - change commit message > > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index afb24fd0b9..5ec11a3683 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -8310,7 +8310,13 @@ static int open_net_route(CPUArchState *cpu_env, int fd) > #if defined(TARGET_SPARC) > static int open_cpuinfo(CPUArchState *cpu_env, int fd) > { > - dprintf(fd, "type\t\t: sun4u\n"); > + int i, num_cpus; > + > + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); > + for (i = 0; i < num_cpus; i++) { > + dprintf(fd, "processor\t: %d\n", i); > + dprintf(fd, "type\t\t: sun4u\n\n"); > + } I'm sorry, kernel on real hardware doesn't use the "processor:" entry on sparc. See show_cpuinfo() in arch/sparc/kernel/cpu.c. In this case, fix the userspace application, as it would not work on the real hardware too. > return 0; > } > #endif > @@ -8318,11 +8324,17 @@ static int open_cpuinfo(CPUArchState *cpu_env, int fd) > #if defined(TARGET_HPPA) > static int open_cpuinfo(CPUArchState *cpu_env, int fd) > { > - dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); > - dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); > - dprintf(fd, "capabilities\t: os32\n"); > - dprintf(fd, "model\t\t: 9000/778/B160L\n"); > - dprintf(fd, "model name\t: Merlin L2 160 QEMU (9000/778/B160L)\n"); > + int i, num_cpus; > + > + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); > + for (i = 0; i < num_cpus; i++) { > + dprintf(fd, "processor\t: %d\n", i); > + dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); > + dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); > + dprintf(fd, "capabilities\t: os32\n"); > + dprintf(fd, "model\t\t: 9000/778/B160L - " > + "Merlin L2 160 QEMU (9000/778/B160L)\n\n"); > + } > return 0; > } > #endif It's good for hppa. Please, send a v4 with only hppa. Thanks, Laurent
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index afb24fd0b9..5ec11a3683 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8310,7 +8310,13 @@ static int open_net_route(CPUArchState *cpu_env, int fd) #if defined(TARGET_SPARC) static int open_cpuinfo(CPUArchState *cpu_env, int fd) { - dprintf(fd, "type\t\t: sun4u\n"); + int i, num_cpus; + + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); + for (i = 0; i < num_cpus; i++) { + dprintf(fd, "processor\t: %d\n", i); + dprintf(fd, "type\t\t: sun4u\n\n"); + } return 0; } #endif @@ -8318,11 +8324,17 @@ static int open_cpuinfo(CPUArchState *cpu_env, int fd) #if defined(TARGET_HPPA) static int open_cpuinfo(CPUArchState *cpu_env, int fd) { - dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); - dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); - dprintf(fd, "capabilities\t: os32\n"); - dprintf(fd, "model\t\t: 9000/778/B160L\n"); - dprintf(fd, "model name\t: Merlin L2 160 QEMU (9000/778/B160L)\n"); + int i, num_cpus; + + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); + for (i = 0; i < num_cpus; i++) { + dprintf(fd, "processor\t: %d\n", i); + dprintf(fd, "cpu family\t: PA-RISC 1.1e\n"); + dprintf(fd, "cpu\t\t: PA7300LC (PCX-L2)\n"); + dprintf(fd, "capabilities\t: os32\n"); + dprintf(fd, "model\t\t: 9000/778/B160L - " + "Merlin L2 160 QEMU (9000/778/B160L)\n\n"); + } return 0; } #endif
The sparc and hppa architectures provide an own output for the emulated /proc/cpuinfo file. Some userspace applications count (even if that's not the recommended way) the number of lines which start with "processor:" and assume that this number then reflects the number of online CPUs. Since those 3 architectures don't provide any such line, applications may assume "0" CPUs. One such issue can be seen in debian bug report: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024653 Avoid such issues by adding a "processor:" line for each of the online CPUs. Signed-off-by: Helge Deller <deller@gmx.de> --- v3: - add trailing newline at end of /proc/cpuinfo file (needed by procps) v2: - drop m68k part (based on feedback from Laurent Vivier <laurent@vivier.eu>) - change commit message