aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-03-23 17:29:03 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-05-16 14:26:49 -0300
commit97a912f7a832a662960749948049e15f3aecb2a7 (patch)
tree1cbe5852bd6175c6554cc2a405517de9a8787a0e
parentf787e138aa0bf677bf74fa2a08595c446292f3d7 (diff)
downloadglibc-97a912f7a832a662960749948049e15f3aecb2a7.tar
glibc-97a912f7a832a662960749948049e15f3aecb2a7.tar.gz
glibc-97a912f7a832a662960749948049e15f3aecb2a7.tar.bz2
glibc-97a912f7a832a662960749948049e15f3aecb2a7.zip
linux: Use /sys/devices/system/cpu on __get_nprocs_conf (BZ#28991)
Currently on Linux __get_nprocs_conf first tries to enumerate the cpus present in the system by iterating on /sys/devices/system/cpuX directories. This only enumerates the CPUs that are present in system (but possibly offline), not taking in account possible CPU that might added in the system through hotplugging. Linux provides the maximum number of configured cpus on the /sys/devices/system/cpu file. Although it might present a larger value of possible active CPUs on some system (where kernel either get the information from firmaware or is configured at boot time), the information is what kernel presents to userland. This also change the returned value of _SC_NPROCESSORS_CONF, which aligns as the maximum configure cpu in the system. Checked on x86_64-linux-gnu. Reviewed-by: Florian Weimer <fweimer@redhat.com>
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c36
1 files changed, 4 insertions, 32 deletions
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index d1ea074f0d..064eaa08ae 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -19,7 +19,6 @@
#include <array_length.h>
#include <assert.h>
#include <ctype.h>
-#include <dirent.h>
#include <errno.h>
#include <ldsodefs.h>
#include <limits.h>
@@ -136,7 +135,7 @@ get_nproc_stat (void)
}
static int
-get_nprocs_cpu_online (void)
+read_sysfs_file (const char *fname)
{
enum { buffer_size = 1024 };
char buffer[buffer_size];
@@ -146,7 +145,7 @@ get_nprocs_cpu_online (void)
const int flags = O_RDONLY | O_CLOEXEC;
/* This file contains comma-separated ranges. */
- int fd = __open_nocancel ("/sys/devices/system/cpu/online", flags);
+ int fd = __open_nocancel (fname, flags);
char *l;
int result = 0;
if (fd != -1)
@@ -191,31 +190,6 @@ get_nprocs_cpu_online (void)
}
static int
-get_nprocs_cpu (void)
-{
- int count = 0;
- DIR *dir = __opendir ("/sys/devices/system/cpu");
- if (dir != NULL)
- {
- struct dirent64 *d;
-
- while ((d = __readdir64 (dir)) != NULL)
- /* NB: the sysfs has d_type support. */
- if (d->d_type == DT_DIR && strncmp (d->d_name, "cpu", 3) == 0)
- {
- char *endp;
- unsigned long int nr = strtoul (d->d_name + 3, &endp, 10);
- if (nr != ULONG_MAX && endp != d->d_name + 3 && *endp == '\0')
- ++count;
- }
-
- __closedir (dir);
-
- }
- return count;
-}
-
-static int
get_nprocs_fallback (void)
{
int result;
@@ -239,8 +213,7 @@ get_nprocs_fallback (void)
int
__get_nprocs (void)
{
- /* Try /sys/devices/system/cpu/online first. */
- int result = get_nprocs_cpu_online ();
+ int result = read_sysfs_file ("/sys/devices/system/cpu/online");
if (result != 0)
return result;
@@ -255,8 +228,7 @@ weak_alias (__get_nprocs, get_nprocs)
int
__get_nprocs_conf (void)
{
- /* Try /sys/devices/system/cpu/ first. */
- int result = get_nprocs_cpu ();
+ int result = read_sysfs_file ("/sys/devices/system/cpu/possible");
if (result != 0)
return result;