bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Fix num_processors_ignoring_omp.


From: Bruno Haible
Subject: Re: [PATCH] Fix num_processors_ignoring_omp.
Date: Mon, 10 Jun 2019 22:18:44 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-145-generic; KDE/5.18.0; x86_64; ; )

Hi Nikita,

> From: Nikita Ermakov <address@hidden>
> 
> - Update comments to correspond closed glibc bug #21542.
> 
> - In case of failed _SC_NPROCESSORS_CONF use the maximum between
>   nprocs_current and nprocs to meet the requirements of
>   num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT).

Thanks for the report. To summarize, sysconf (_SC_NPROCESSORS_CONF)
may now return 2 instead of 1, in situations where the number of
processors cannot be determined because /proc and /sys are not mounted.
The rationale given in
  <https://sourceware.org/bugzilla/show_bug.cgi?id=21542>
is that there are "applications which use the return value to recognize
uniprocessor systems and apply optimizations based on that".

> diff --git a/lib/nproc.c b/lib/nproc.c
> index 77b876027..a550711b4 100644
> --- a/lib/nproc.c
> +++ b/lib/nproc.c
> @@ -217,17 +217,14 @@ num_processors_ignoring_omp (enum nproc_query query)
>       the /sys and /proc file systems (see
>       glibc/sysdeps/unix/sysv/linux/getsysstats.c).
>       In some situations these file systems are not mounted, and the sysconf
> -     call returns 1, which does not reflect the reality.  */
> +     call returns 1 or 2, which does not reflect the reality.  */
> +  unsigned long nprocs_current = num_processors_via_affinity_mask ();
>  
>    if (query == NPROC_CURRENT)
>      {
>        /* Try the modern affinity mask system call.  */
> -      {
> -        unsigned long nprocs = num_processors_via_affinity_mask ();
> -
> -        if (nprocs > 0)
> -          return nprocs;
> -      }
> +      if (nprocs_current > 0)
> +        return nprocs_current;
>  
>  #if defined _SC_NPROCESSORS_ONLN
>        { /* This works on glibc, Mac OS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
> @@ -249,15 +246,10 @@ num_processors_ignoring_omp (enum nproc_query query)
>          /* On Linux systems with glibc, this information comes from the /sys 
> and
>             /proc file systems (see 
> glibc/sysdeps/unix/sysv/linux/getsysstats.c).
>             In some situations these file systems are not mounted, and the
> -           sysconf call returns 1.  But we wish to guarantee that
> +           sysconf call returns 1 or 2.  But we wish to guarantee that
>             num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT).  */
> -        if (nprocs == 1)
> -          {
> -            unsigned long nprocs_current = num_processors_via_affinity_mask 
> ();
> -
> -            if (nprocs_current > 0)
> -              nprocs = nprocs_current;
> -          }
> +        if (nprocs_current > nprocs)
> +          nprocs = nprocs_current;
>  # endif
>  
>          if (nprocs > 0)

Your patch goes in the right direction. But it causes additional,
unnecessary calls to num_processors_via_affinity_mask () in two situations:
  - on systems other than glibc/Linux systems,
  - on glibc/Linux systems on which sysconf (_SC_NPROCESSORS_CONF)
    returned a value > 2.

I'm therefore applying this slightly different patch:


2019-06-10  Bruno Haible  <address@hidden>

        nproc: Ensure nproc(NPROC_ALL) ≥ nproc(NPROC_CURRENT) with glibc ≥ 2.26.
        Reported by Nikita Ermakov <address@hidden> in
        <https://lists.gnu.org/archive/html/bug-gnulib/2019-06/msg00003.html>.
        * lib/nproc.c (num_processors_ignoring_omp): Treat a return value of
        sysconf (_SC_NPROCESSORS_CONF) == 2 like a return value == 1.

diff --git a/lib/nproc.c b/lib/nproc.c
index 77b8760..b11690b 100644
--- a/lib/nproc.c
+++ b/lib/nproc.c
@@ -216,8 +216,9 @@ num_processors_ignoring_omp (enum nproc_query query)
      Note! On Linux systems with glibc, the first and second number come from
      the /sys and /proc file systems (see
      glibc/sysdeps/unix/sysv/linux/getsysstats.c).
-     In some situations these file systems are not mounted, and the sysconf
-     call returns 1, which does not reflect the reality.  */
+     In some situations these file systems are not mounted, and the sysconf 
call
+     returns 1 or 2 (<https://sourceware.org/bugzilla/show_bug.cgi?id=21542>),
+     which does not reflect the reality.  */
 
   if (query == NPROC_CURRENT)
     {
@@ -249,13 +250,13 @@ num_processors_ignoring_omp (enum nproc_query query)
         /* On Linux systems with glibc, this information comes from the /sys 
and
            /proc file systems (see 
glibc/sysdeps/unix/sysv/linux/getsysstats.c).
            In some situations these file systems are not mounted, and the
-           sysconf call returns 1.  But we wish to guarantee that
+           sysconf call returns 1 or 2.  But we wish to guarantee that
            num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT).  */
-        if (nprocs == 1)
+        if (nprocs == 1 || nprocs == 2)
           {
             unsigned long nprocs_current = num_processors_via_affinity_mask ();
 
-            if (nprocs_current > 0)
+            if (/* nprocs_current > 0 && */ nprocs_current > nprocs)
               nprocs = nprocs_current;
           }
 # endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]