Bug 28865 - linux: _SC_NPROCESSORS_CONF and _SC_NPROCESSORS_ONLN are inaccurate without /sys and /proc
Summary: linux: _SC_NPROCESSORS_CONF and _SC_NPROCESSORS_ONLN are inaccurate without /...
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: 2.35
: P2 normal
Target Milestone: 2.36
Assignee: Dmitry V. Levin
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-02-05 19:43 UTC by Dmitry V. Levin
Modified: 2022-02-08 22:34 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
ldv: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitry V. Levin 2022-02-05 19:43:50 UTC
Commit 342298278e ("linux: Revert the use of sched_getaffinity on get_nproc") aka glibc-2.35~480 introduced a regression in environments where neither /sys/devices/system/cpu/ nor /proc/stat is available:

$ nproc
128
$ getconf -a | grep _NPROCESSORS_
_NPROCESSORS_CONF                  2
_NPROCESSORS_ONLN                  2

This happened because that commit made get_nprocs() and get_nprocs_conf() bluntly return 2 when neither /sys/devices/system/cpu/ nor /proc/stat is available.

I suggest changing these functions to check various sources of information in the following order:

get_nprocs: /sys/devices/system/cpu/online -> sched_getaffinity -> /proc/stat -> 2
get_nprocs_conf: /sys/devices/system/cpu/ -> /proc/stat -> sched_getaffinity -> 2
Comment 1 Sourceware Commits 2022-02-08 22:24:49 UTC
The master branch has been updated by Dmitry Levin <ldv@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e1d32b836410767270a3adf1f82b1a47e6e4cd51

commit e1d32b836410767270a3adf1f82b1a47e6e4cd51
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Sat Feb 5 08:00:00 2022 +0000

    linux: fix accuracy of get_nprocs and get_nprocs_conf [BZ #28865]
    
    get_nprocs() and get_nprocs_conf() use various methods to obtain an
    accurate number of processors.  Re-introduce __get_nprocs_sched() as
    a source of information, and fix the order in which these methods are
    used to return the most accurate information.  The primary source of
    information used in both functions remains unchanged.
    
    This also changes __get_nprocs_sched() error return value from 2 to 0,
    but all its users are already prepared to handle that.
    
    Old fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> 2
    
    New fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> sched_getaffinity -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> sched_getaffinity -> 2
    
    Fixes: 342298278e ("linux: Revert the use of sched_getaffinity on get_nproc")
    Closes: BZ #28865
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
Comment 2 Dmitry V. Levin 2022-02-08 22:27:28 UTC
Fixed in 2.36.
Comment 3 Sourceware Commits 2022-02-08 22:34:04 UTC
The release/2.34/master branch has been updated by Dmitry Levin <ldv@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=007e054d786be340699c634e3a3b30ab1fde1a7a

commit 007e054d786be340699c634e3a3b30ab1fde1a7a
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Sat Feb 5 08:00:00 2022 +0000

    linux: fix accuracy of get_nprocs and get_nprocs_conf [BZ #28865]
    
    get_nprocs() and get_nprocs_conf() use various methods to obtain an
    accurate number of processors.  Re-introduce __get_nprocs_sched() as
    a source of information, and fix the order in which these methods are
    used to return the most accurate information.  The primary source of
    information used in both functions remains unchanged.
    
    This also changes __get_nprocs_sched() error return value from 2 to 0,
    but all its users are already prepared to handle that.
    
    Old fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> 2
    
    New fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> sched_getaffinity -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> sched_getaffinity -> 2
    
    Fixes: 342298278e ("linux: Revert the use of sched_getaffinity on get_nproc")
    Closes: BZ #28865
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
    
    (cherry picked from commit e1d32b836410767270a3adf1f82b1a47e6e4cd51)
Comment 4 Sourceware Commits 2022-02-08 22:34:09 UTC
The release/2.35/master branch has been updated by Dmitry Levin <ldv@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=491f2ef1f0ff849490f374917957018d07ee0586

commit 491f2ef1f0ff849490f374917957018d07ee0586
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Sat Feb 5 08:00:00 2022 +0000

    linux: fix accuracy of get_nprocs and get_nprocs_conf [BZ #28865]
    
    get_nprocs() and get_nprocs_conf() use various methods to obtain an
    accurate number of processors.  Re-introduce __get_nprocs_sched() as
    a source of information, and fix the order in which these methods are
    used to return the most accurate information.  The primary source of
    information used in both functions remains unchanged.
    
    This also changes __get_nprocs_sched() error return value from 2 to 0,
    but all its users are already prepared to handle that.
    
    Old fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> 2
    
    New fallback order:
      get_nprocs:
        /sys/devices/system/cpu/online -> /proc/stat -> sched_getaffinity -> 2
      get_nprocs_conf:
        /sys/devices/system/cpu/ -> /proc/stat -> sched_getaffinity -> 2
    
    Fixes: 342298278e ("linux: Revert the use of sched_getaffinity on get_nproc")
    Closes: BZ #28865
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
    
    (cherry picked from commit e1d32b836410767270a3adf1f82b1a47e6e4cd51)