Auto-sync with upstream branch master
Upstream commit: 9bd9978639c2f75dbea5c25226264b1ac11fdf05 - Do not declare fmax, fmin _FloatN, _FloatNx versions for C2X - Do not define tgmath.h fmaxmag, fminmag macros for C2X (bug 28397) - Add fmaximum, fminimum functions - Linux: Simplify __opensock and fix race condition [BZ #28353] - pthread/tst-cancel28: Fix barrier re-init race condition - powerpc: Delete unneeded ELF_MACHINE_BEFORE_RTLD_RELOC - posix: Remove spawni.c - Disable symbol hack in libc_nonshared.a - linux: Revert the use of sched_getaffinity on get_nproc (BZ #28310) - linux: Simplify get_nprocs - misc: Add __get_nprocs_sched - htl: Fix sigset of main thread - htl: make pthread_sigstate read/write set/oset outside sigstate section - Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so - benchtests: Improve reliability of memcmp benchmarks - Define __STDC_IEC_60559_BFP__ and __STDC_IEC_60559_COMPLEX__ - build-many-glibcs.py: add powerpc64le glibc variant without multiarch - Fix sysdeps/x86/fpu/s_ffma.c for 32-bit FMA processor case - Linux: Avoid closing -1 on failure in __closefrom_fallback - i386: Port elf_machine_{load_address,dynamic} from x86-64 - aarch64: Disable A64FX memcpy/memmove BTI unconditionally - xsysconf: Only fail on error results and errno set - powerpc64le: Avoid conflicting types for f64xfmaf128 when IFUNC is not used - Fix ffma use of round-to-odd on x86 - vfprintf: Unify argument handling in process_arg - vfprintf: Handle floating-point cases outside of process_arg macro
This commit is contained in:
		
							parent
							
								
									35da738a8e
								
							
						
					
					
						commit
						be77dd73c8
					
				| @ -1,102 +0,0 @@ | |||||||
| Patch proposed for upstream inclusion: |  | ||||||
| 
 |  | ||||||
|   <https://sourceware.org/pipermail/libc-alpha/2021-September/130801.html> |  | ||||||
| 
 |  | ||||||
| Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> |  | ||||||
| Date:   Tue Sep 7 09:22:57 2021 -0300 |  | ||||||
| 
 |  | ||||||
|     misc: Add __get_nprocs_sched |  | ||||||
|      |  | ||||||
|     This is an internal function meant to return the number of avaliable |  | ||||||
|     processor where the process can scheduled, different than the |  | ||||||
|     __get_nprocs which returns a the system available online CPU. |  | ||||||
|      |  | ||||||
|     The Linux implementation currently only calls __get_nprocs(), which |  | ||||||
|     in tuns calls sched_getaffinity. |  | ||||||
|     Reviewed-by: Florian Weimer <fweimer@redhat.com> |  | ||||||
| 
 |  | ||||||
| diff --git a/include/sys/sysinfo.h b/include/sys/sysinfo.h
 |  | ||||||
| index 7388356a19269335..c490561581733038 100644
 |  | ||||||
| --- a/include/sys/sysinfo.h
 |  | ||||||
| +++ b/include/sys/sysinfo.h
 |  | ||||||
| @@ -9,10 +9,15 @@
 |  | ||||||
|  extern int __get_nprocs_conf (void); |  | ||||||
|  libc_hidden_proto (__get_nprocs_conf) |  | ||||||
|   |  | ||||||
| -/* Return number of available processors.  */
 |  | ||||||
| +/* Return number of available processors (not all of them will be
 |  | ||||||
| +   available to the caller process).  */
 |  | ||||||
|  extern int __get_nprocs (void); |  | ||||||
|  libc_hidden_proto (__get_nprocs) |  | ||||||
|   |  | ||||||
| +/* Return the number of available processors which the process can
 |  | ||||||
| +   be scheduled.  */
 |  | ||||||
| +extern int __get_nprocs_sched (void) attribute_hidden;
 |  | ||||||
| +
 |  | ||||||
|  /* Return number of physical pages of memory in the system.  */ |  | ||||||
|  extern long int __get_phys_pages (void); |  | ||||||
|  libc_hidden_proto (__get_phys_pages) |  | ||||||
| diff --git a/malloc/arena.c b/malloc/arena.c
 |  | ||||||
| index 4c398753aeadbb9d..78ef4cf18c780dfc 100644
 |  | ||||||
| --- a/malloc/arena.c
 |  | ||||||
| +++ b/malloc/arena.c
 |  | ||||||
| @@ -878,7 +878,7 @@ arena_get2 (size_t size, mstate avoid_arena)
 |  | ||||||
|              narenas_limit = mp_.arena_max; |  | ||||||
|            else if (narenas > mp_.arena_test) |  | ||||||
|              { |  | ||||||
| -              int n = __get_nprocs ();
 |  | ||||||
| +              int n = __get_nprocs_sched ();
 |  | ||||||
|   |  | ||||||
|                if (n >= 1) |  | ||||||
|                  narenas_limit = NARENAS_FROM_NCORES (n); |  | ||||||
| diff --git a/misc/getsysstats.c b/misc/getsysstats.c
 |  | ||||||
| index 2986d62247cf98ca..5cbba0f9bd93bd78 100644
 |  | ||||||
| --- a/misc/getsysstats.c
 |  | ||||||
| +++ b/misc/getsysstats.c
 |  | ||||||
| @@ -44,6 +44,12 @@ weak_alias (__get_nprocs, get_nprocs)
 |  | ||||||
|  link_warning (get_nprocs, "warning: get_nprocs will always return 1") |  | ||||||
|   |  | ||||||
|   |  | ||||||
| +int
 |  | ||||||
| +__get_nprocs_sched (void)
 |  | ||||||
| +{
 |  | ||||||
| +  return 1;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|  long int |  | ||||||
|  __get_phys_pages (void) |  | ||||||
|  { |  | ||||||
| diff --git a/sysdeps/mach/getsysstats.c b/sysdeps/mach/getsysstats.c
 |  | ||||||
| index 1267f39da26aee38..cc8023f979bf6f74 100644
 |  | ||||||
| --- a/sysdeps/mach/getsysstats.c
 |  | ||||||
| +++ b/sysdeps/mach/getsysstats.c
 |  | ||||||
| @@ -62,6 +62,12 @@ __get_nprocs (void)
 |  | ||||||
|  libc_hidden_def (__get_nprocs) |  | ||||||
|  weak_alias (__get_nprocs, get_nprocs) |  | ||||||
|   |  | ||||||
| +int
 |  | ||||||
| +__get_nprocs_sched (void)
 |  | ||||||
| +{
 |  | ||||||
| +  return __get_nprocs ();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|  /* Return the number of physical pages on the system. */ |  | ||||||
|  long int |  | ||||||
|  __get_phys_pages (void) |  | ||||||
| diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| index 8a5d342f0c8bbeae..e9c0dc4d83d4fb2a 100644
 |  | ||||||
| --- a/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| +++ b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| @@ -87,6 +87,12 @@ __get_nprocs (void)
 |  | ||||||
|  libc_hidden_def (__get_nprocs) |  | ||||||
|  weak_alias (__get_nprocs, get_nprocs) |  | ||||||
|   |  | ||||||
| +int
 |  | ||||||
| +__get_nprocs_sched (void)
 |  | ||||||
| +{
 |  | ||||||
| +  return __get_nprocs ();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|   |  | ||||||
|  /* On some architectures it is possible to distinguish between configured |  | ||||||
|     and active cpus.  */ |  | ||||||
| @ -1,208 +0,0 @@ | |||||||
| Patch proposed for upstream inclusion: |  | ||||||
| 
 |  | ||||||
|   <https://sourceware.org/pipermail/libc-alpha/2021-September/130802.html> |  | ||||||
| 
 |  | ||||||
| Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> |  | ||||||
| Date:   Tue Sep 7 09:22:58 2021 -0300 |  | ||||||
| 
 |  | ||||||
|     linux: Simplify get_nprocs |  | ||||||
|      |  | ||||||
|     This patch simplifies the memory allocation code and uses the sched |  | ||||||
|     routines instead of reimplement it.  This still uses a stack |  | ||||||
|     allocation buffer, so it can be used on malloc initialization code. |  | ||||||
|      |  | ||||||
|     Linux currently supports at maximum of 4096 cpus for most architectures: |  | ||||||
|      |  | ||||||
|     $ find -iname Kconfig | xargs git grep -A10 -w NR_CPUS | grep -w range |  | ||||||
|     arch/alpha/Kconfig-     range 2 32 |  | ||||||
|     arch/arc/Kconfig-       range 2 4096 |  | ||||||
|     arch/arm/Kconfig-       range 2 16 if DEBUG_KMAP_LOCAL |  | ||||||
|     arch/arm/Kconfig-       range 2 32 if !DEBUG_KMAP_LOCAL |  | ||||||
|     arch/arm64/Kconfig-     range 2 4096 |  | ||||||
|     arch/csky/Kconfig-      range 2 32 |  | ||||||
|     arch/hexagon/Kconfig-   range 2 6 if SMP |  | ||||||
|     arch/ia64/Kconfig-      range 2 4096 |  | ||||||
|     arch/mips/Kconfig-      range 2 256 |  | ||||||
|     arch/openrisc/Kconfig-  range 2 32 |  | ||||||
|     arch/parisc/Kconfig-    range 2 32 |  | ||||||
|     arch/riscv/Kconfig-     range 2 32 |  | ||||||
|     arch/s390/Kconfig-      range 2 512 |  | ||||||
|     arch/sh/Kconfig-        range 2 32 |  | ||||||
|     arch/sparc/Kconfig-     range 2 32 if SPARC32 |  | ||||||
|     arch/sparc/Kconfig-     range 2 4096 if SPARC64 |  | ||||||
|     arch/um/Kconfig-        range 1 1 |  | ||||||
|     arch/x86/Kconfig-# [NR_CPUS_RANGE_BEGIN ... NR_CPUS_RANGE_END] range. |  | ||||||
|     arch/x86/Kconfig-       range NR_CPUS_RANGE_BEGIN NR_CPUS_RANGE_END |  | ||||||
|     arch/xtensa/Kconfig-    range 2 32 |  | ||||||
|      |  | ||||||
|     With x86 supporting 8192: |  | ||||||
|      |  | ||||||
|     arch/x86/Kconfig |  | ||||||
|      976 config NR_CPUS_RANGE_END |  | ||||||
|      977         int |  | ||||||
|      978         depends on X86_64 |  | ||||||
|      979         default 8192 if  SMP && CPUMASK_OFFSTACK |  | ||||||
|      980         default  512 if  SMP && !CPUMASK_OFFSTACK |  | ||||||
|      981         default    1 if !SMP |  | ||||||
|      |  | ||||||
|     So using a maximum of 32k cpu should cover all cases (and I would |  | ||||||
|     expect once we start to have many more CPUs that Linux would provide |  | ||||||
|     a more straightforward way to query for such information). |  | ||||||
|      |  | ||||||
|     A test is added to check if sched_getaffinity can successfully return |  | ||||||
|     with large buffers. |  | ||||||
|      |  | ||||||
|     Checked on x86_64-linux-gnu and i686-linux-gnu. |  | ||||||
|     Reviewed-by: Florian Weimer <fweimer@redhat.com> |  | ||||||
| 
 |  | ||||||
| diff --git a/posix/Makefile b/posix/Makefile
 |  | ||||||
| index a5229777eeb0e067..61fcdf015b4ec83b 100644
 |  | ||||||
| --- a/posix/Makefile
 |  | ||||||
| +++ b/posix/Makefile
 |  | ||||||
| @@ -107,7 +107,8 @@ tests		:= test-errno tstgetopt testfnm runtests runptests \
 |  | ||||||
|  		   tst-sysconf-empty-chroot tst-glob_symlinks tst-fexecve \ |  | ||||||
|  		   tst-glob-tilde test-ssize-max tst-spawn4 bug-regex37 \ |  | ||||||
|  		   bug-regex38 tst-regcomp-truncated tst-spawn-chdir \ |  | ||||||
| -		   tst-wordexp-nocmd tst-execveat tst-spawn5
 |  | ||||||
| +		   tst-wordexp-nocmd tst-execveat tst-spawn5 \
 |  | ||||||
| +		   tst-sched_getaffinity
 |  | ||||||
|   |  | ||||||
|  # Test for the glob symbol version that was replaced in glibc 2.27. |  | ||||||
|  ifeq ($(have-GLIBC_2.26)$(build-shared),yesyes) |  | ||||||
| diff --git a/posix/tst-sched_getaffinity.c b/posix/tst-sched_getaffinity.c
 |  | ||||||
| new file mode 100644 |  | ||||||
| index 0000000000000000..6d1fdcb05ff4d16c
 |  | ||||||
| --- /dev/null
 |  | ||||||
| +++ b/posix/tst-sched_getaffinity.c
 |  | ||||||
| @@ -0,0 +1,47 @@
 |  | ||||||
| +/* Tests for sched_getaffinity with large buffers.
 |  | ||||||
| +   Copyright (C) 2021 Free Software Foundation, Inc.
 |  | ||||||
| +   This file is part of the GNU C Library.
 |  | ||||||
| +
 |  | ||||||
| +   The GNU C Library is free software; you can redistribute it and/or
 |  | ||||||
| +   modify it under the terms of the GNU Lesser General Public
 |  | ||||||
| +   License as published by the Free Software Foundation; either
 |  | ||||||
| +   version 2.1 of the License, or (at your option) any later version.
 |  | ||||||
| +
 |  | ||||||
| +   The GNU C Library is distributed in the hope that it will be useful,
 |  | ||||||
| +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 |  | ||||||
| +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 |  | ||||||
| +   Lesser General Public License for more details.
 |  | ||||||
| +
 |  | ||||||
| +   You should have received a copy of the GNU Lesser General Public
 |  | ||||||
| +   License along with the GNU C Library; if not, see
 |  | ||||||
| +   <http://www.gnu.org/licenses/>.  */
 |  | ||||||
| +
 |  | ||||||
| +#include <array_length.h>
 |  | ||||||
| +#include <sched.h>
 |  | ||||||
| +#include <support/check.h>
 |  | ||||||
| +
 |  | ||||||
| +static int
 |  | ||||||
| +do_test (void)
 |  | ||||||
| +{
 |  | ||||||
| +  /* The values are larger than the default cpu_set_t.  */
 |  | ||||||
| +  const int bufsize[] = { 1<<11, 1<<12, 1<<13, 1<<14, 1<<15, 1<<16, 1<<17 };
 |  | ||||||
| +  int cpucount[array_length(bufsize)];
 |  | ||||||
| +
 |  | ||||||
| +  for (int i = 0; i < array_length (bufsize); i++)
 |  | ||||||
| +    {
 |  | ||||||
| +      cpu_set_t *cpuset = CPU_ALLOC (bufsize[i]);
 |  | ||||||
| +      TEST_VERIFY (cpuset != NULL);
 |  | ||||||
| +      size_t size = CPU_ALLOC_SIZE (bufsize[i]);
 |  | ||||||
| +      TEST_COMPARE (sched_getaffinity (0, size, cpuset), 0);
 |  | ||||||
| +      cpucount[i] = CPU_COUNT_S (size, cpuset);
 |  | ||||||
| +      CPU_FREE (cpuset);
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
| +  for (int i = 0; i < array_length (cpucount) - 1; i++)
 |  | ||||||
| +    for (int j = 1; j < array_length (cpucount); j++)
 |  | ||||||
| +      TEST_COMPARE (cpucount[i], cpucount[j]);
 |  | ||||||
| +
 |  | ||||||
| +  return 0;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +#include <support/test-driver.c>
 |  | ||||||
| diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| index e9c0dc4d83d4fb2a..1e3d88676df37f81 100644
 |  | ||||||
| --- a/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| +++ b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| @@ -28,61 +28,29 @@
 |  | ||||||
|  #include <sys/sysinfo.h> |  | ||||||
|  #include <sysdep.h> |  | ||||||
|   |  | ||||||
| -/* Compute the population count of the entire array.  */
 |  | ||||||
| -static int
 |  | ||||||
| -__get_nprocs_count (const unsigned long int *array, size_t length)
 |  | ||||||
| -{
 |  | ||||||
| -  int count = 0;
 |  | ||||||
| -  for (size_t i = 0; i < length; ++i)
 |  | ||||||
| -    if (__builtin_add_overflow (count,  __builtin_popcountl (array[i]),
 |  | ||||||
| -				&count))
 |  | ||||||
| -      return INT_MAX;
 |  | ||||||
| -  return count;
 |  | ||||||
| -}
 |  | ||||||
| -
 |  | ||||||
| -/* __get_nprocs with a large buffer.  */
 |  | ||||||
| -static int
 |  | ||||||
| -__get_nprocs_large (void)
 |  | ||||||
| -{
 |  | ||||||
| -  /* This code cannot use scratch_buffer because it is used during
 |  | ||||||
| -     malloc initialization.  */
 |  | ||||||
| -  size_t pagesize = GLRO (dl_pagesize);
 |  | ||||||
| -  unsigned long int *page = __mmap (0, pagesize, PROT_READ | PROT_WRITE,
 |  | ||||||
| -				    MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 |  | ||||||
| -  if (page == MAP_FAILED)
 |  | ||||||
| -    return 2;
 |  | ||||||
| -  int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0, pagesize, page);
 |  | ||||||
| -  int count;
 |  | ||||||
| -  if (r > 0)
 |  | ||||||
| -    count = __get_nprocs_count (page, pagesize / sizeof (unsigned long int));
 |  | ||||||
| -  else if (r == -EINVAL)
 |  | ||||||
| -    /* One page is still not enough to store the bits.  A more-or-less
 |  | ||||||
| -       arbitrary value.  This assumes t hat such large systems never
 |  | ||||||
| -       happen in practice.  */
 |  | ||||||
| -    count = GLRO (dl_pagesize) * CHAR_BIT;
 |  | ||||||
| -  else
 |  | ||||||
| -    count = 2;
 |  | ||||||
| -  __munmap (page, GLRO (dl_pagesize));
 |  | ||||||
| -  return count;
 |  | ||||||
| -}
 |  | ||||||
| -
 |  | ||||||
|  int |  | ||||||
|  __get_nprocs (void) |  | ||||||
|  { |  | ||||||
| -  /* Fast path for most systems.  The kernel expects a buffer size
 |  | ||||||
| -     that is a multiple of 8.  */
 |  | ||||||
| -  unsigned long int small_buffer[1024 / CHAR_BIT / sizeof (unsigned long int)];
 |  | ||||||
| -  int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0,
 |  | ||||||
| -				 sizeof (small_buffer), small_buffer);
 |  | ||||||
| +  enum
 |  | ||||||
| +    {
 |  | ||||||
| +      max_num_cpus = 32768,
 |  | ||||||
| +      cpu_bits_size = CPU_ALLOC_SIZE (32768)
 |  | ||||||
| +    };
 |  | ||||||
| +
 |  | ||||||
| +  /* This cannot use malloc because it is used on malloc initialization.  */
 |  | ||||||
| +  __cpu_mask cpu_bits[cpu_bits_size / sizeof (__cpu_mask)];
 |  | ||||||
| +  int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0, cpu_bits_size,
 |  | ||||||
| +				 cpu_bits);
 |  | ||||||
|    if (r > 0) |  | ||||||
| -    return __get_nprocs_count (small_buffer, r / sizeof (unsigned long int));
 |  | ||||||
| +    return CPU_COUNT_S (cpu_bits_size, (cpu_set_t*) cpu_bits);
 |  | ||||||
|    else if (r == -EINVAL) |  | ||||||
| -    /* The kernel requests a larger buffer to store the data.  */
 |  | ||||||
| -    return __get_nprocs_large ();
 |  | ||||||
| -  else
 |  | ||||||
| -    /* Some other error.  2 is conservative (not a uniprocessor
 |  | ||||||
| -       system, so atomics are needed). */
 |  | ||||||
| -    return 2;
 |  | ||||||
| +    /* The input buffer is still not enough to store the number of cpus.  This
 |  | ||||||
| +       is an arbitrary values assuming such systems should be rare and there
 |  | ||||||
| +       is no offline cpus.  */
 |  | ||||||
| +    return max_num_cpus;
 |  | ||||||
| +  /* Some other error.  2 is conservative (not a uniprocessor system, so
 |  | ||||||
| +     atomics are needed). */
 |  | ||||||
| +  return 2;
 |  | ||||||
|  } |  | ||||||
|  libc_hidden_def (__get_nprocs) |  | ||||||
|  weak_alias (__get_nprocs, get_nprocs) |  | ||||||
| @ -1,202 +0,0 @@ | |||||||
| Patch proposed for upstream inclusion: |  | ||||||
| 
 |  | ||||||
|   <https://sourceware.org/pipermail/libc-alpha/2021-September/130803.html> |  | ||||||
| 
 |  | ||||||
| Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> |  | ||||||
| Date:   Tue Sep 7 09:22:59 2021 -0300 |  | ||||||
| 
 |  | ||||||
|     linux: Revert the use of sched_getaffinity on get_nproc (BZ #28310) |  | ||||||
|      |  | ||||||
|     The use of sched_getaffinity on get_nproc and |  | ||||||
|     sysconf (_SC_NPROCESSORS_ONLN) done in 903bc7dcc2acafc40 (BZ #27645) |  | ||||||
|     breaks the top command in common hypervisor configurations and also |  | ||||||
|     other monitoring tools. |  | ||||||
|      |  | ||||||
|     The main issue using sched_getaffinity changed the symbols semantic |  | ||||||
|     from system-wide scope of online CPUs to per-process one (which can |  | ||||||
|     be changed with kernel cpusets or book parameters in VM). |  | ||||||
|      |  | ||||||
|     This patch reverts mostly of the 903bc7dcc2acafc40, with the |  | ||||||
|     exceptions: |  | ||||||
|      |  | ||||||
|       * No more cached values and atomic updates, since they are inherent |  | ||||||
|         racy. |  | ||||||
|      |  | ||||||
|       * No /proc/cpuinfo fallback, since /proc/stat is already used and |  | ||||||
|         it would require to revert more arch-specific code. |  | ||||||
|      |  | ||||||
|       * The alloca is replace with a static buffer of 1024 bytes. |  | ||||||
|      |  | ||||||
|     So the implementation first consult the sysfs, and fallbacks to procfs. |  | ||||||
|      |  | ||||||
|     Checked on x86_64-linux-gnu. |  | ||||||
|     Reviewed-by: Florian Weimer <fweimer@redhat.com> |  | ||||||
| 
 |  | ||||||
| diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| index 1e3d88676df37f81..15ad91cf2f5905ac 100644
 |  | ||||||
| --- a/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| +++ b/sysdeps/unix/sysv/linux/getsysstats.c
 |  | ||||||
| @@ -17,6 +17,8 @@
 |  | ||||||
|     <https://www.gnu.org/licenses/>.  */ |  | ||||||
|   |  | ||||||
|  #include <array_length.h> |  | ||||||
| +#include <assert.h>
 |  | ||||||
| +#include <ctype.h>
 |  | ||||||
|  #include <dirent.h> |  | ||||||
|  #include <errno.h> |  | ||||||
|  #include <ldsodefs.h> |  | ||||||
| @@ -29,7 +31,7 @@
 |  | ||||||
|  #include <sysdep.h> |  | ||||||
|   |  | ||||||
|  int |  | ||||||
| -__get_nprocs (void)
 |  | ||||||
| +__get_nprocs_sched (void)
 |  | ||||||
|  { |  | ||||||
|    enum |  | ||||||
|      { |  | ||||||
| @@ -52,14 +54,141 @@ __get_nprocs (void)
 |  | ||||||
|       atomics are needed). */ |  | ||||||
|    return 2; |  | ||||||
|  } |  | ||||||
| -libc_hidden_def (__get_nprocs)
 |  | ||||||
| -weak_alias (__get_nprocs, get_nprocs)
 |  | ||||||
| +
 |  | ||||||
| +static char *
 |  | ||||||
| +next_line (int fd, char *const buffer, char **cp, char **re,
 |  | ||||||
| +           char *const buffer_end)
 |  | ||||||
| +{
 |  | ||||||
| +  char *res = *cp;
 |  | ||||||
| +  char *nl = memchr (*cp, '\n', *re - *cp);
 |  | ||||||
| +  if (nl == NULL)
 |  | ||||||
| +    {
 |  | ||||||
| +      if (*cp != buffer)
 |  | ||||||
| +        {
 |  | ||||||
| +          if (*re == buffer_end)
 |  | ||||||
| +            {
 |  | ||||||
| +              memmove (buffer, *cp, *re - *cp);
 |  | ||||||
| +              *re = buffer + (*re - *cp);
 |  | ||||||
| +              *cp = buffer;
 |  | ||||||
| +
 |  | ||||||
| +              ssize_t n = __read_nocancel (fd, *re, buffer_end - *re);
 |  | ||||||
| +              if (n < 0)
 |  | ||||||
| +                return NULL;
 |  | ||||||
| +
 |  | ||||||
| +              *re += n;
 |  | ||||||
| +
 |  | ||||||
| +              nl = memchr (*cp, '\n', *re - *cp);
 |  | ||||||
| +              while (nl == NULL && *re == buffer_end)
 |  | ||||||
| +                {
 |  | ||||||
| +                  /* Truncate too long lines.  */
 |  | ||||||
| +                  *re = buffer + 3 * (buffer_end - buffer) / 4;
 |  | ||||||
| +                  n = __read_nocancel (fd, *re, buffer_end - *re);
 |  | ||||||
| +                  if (n < 0)
 |  | ||||||
| +                    return NULL;
 |  | ||||||
| +
 |  | ||||||
| +                  nl = memchr (*re, '\n', n);
 |  | ||||||
| +                  **re = '\n';
 |  | ||||||
| +                  *re += n;
 |  | ||||||
| +                }
 |  | ||||||
| +            }
 |  | ||||||
| +          else
 |  | ||||||
| +            nl = memchr (*cp, '\n', *re - *cp);
 |  | ||||||
| +
 |  | ||||||
| +          res = *cp;
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +      if (nl == NULL)
 |  | ||||||
| +        nl = *re - 1;
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
| +  *cp = nl + 1;
 |  | ||||||
| +  assert (*cp <= *re);
 |  | ||||||
| +
 |  | ||||||
| +  return res == *re ? NULL : res;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|   |  | ||||||
|  int |  | ||||||
| -__get_nprocs_sched (void)
 |  | ||||||
| +__get_nprocs (void)
 |  | ||||||
|  { |  | ||||||
| -  return __get_nprocs ();
 |  | ||||||
| +  enum { buffer_size = 1024 };
 |  | ||||||
| +  char buffer[buffer_size];
 |  | ||||||
| +  char *buffer_end = buffer + buffer_size;
 |  | ||||||
| +  char *cp = buffer_end;
 |  | ||||||
| +  char *re = buffer_end;
 |  | ||||||
| +
 |  | ||||||
| +  const int flags = O_RDONLY | O_CLOEXEC;
 |  | ||||||
| +  /* This file contains comma-separated ranges.  */
 |  | ||||||
| +  int fd = __open_nocancel ("/sys/devices/system/cpu/online", flags);
 |  | ||||||
| +  char *l;
 |  | ||||||
| +  int result = 0;
 |  | ||||||
| +  if (fd != -1)
 |  | ||||||
| +    {
 |  | ||||||
| +      l = next_line (fd, buffer, &cp, &re, buffer_end);
 |  | ||||||
| +      if (l != NULL)
 |  | ||||||
| +	do
 |  | ||||||
| +	  {
 |  | ||||||
| +	    char *endp;
 |  | ||||||
| +	    unsigned long int n = strtoul (l, &endp, 10);
 |  | ||||||
| +	    if (l == endp)
 |  | ||||||
| +	      {
 |  | ||||||
| +		result = 0;
 |  | ||||||
| +		break;
 |  | ||||||
| +	      }
 |  | ||||||
| +
 |  | ||||||
| +	    unsigned long int m = n;
 |  | ||||||
| +	    if (*endp == '-')
 |  | ||||||
| +	      {
 |  | ||||||
| +		l = endp + 1;
 |  | ||||||
| +		m = strtoul (l, &endp, 10);
 |  | ||||||
| +		if (l == endp)
 |  | ||||||
| +		  {
 |  | ||||||
| +		    result = 0;
 |  | ||||||
| +		    break;
 |  | ||||||
| +		  }
 |  | ||||||
| +	      }
 |  | ||||||
| +
 |  | ||||||
| +	    result += m - n + 1;
 |  | ||||||
| +
 |  | ||||||
| +	    l = endp;
 |  | ||||||
| +	    if (l < re && *l == ',')
 |  | ||||||
| +	      ++l;
 |  | ||||||
| +	  }
 |  | ||||||
| +	while (l < re && *l != '\n');
 |  | ||||||
| +
 |  | ||||||
| +      __close_nocancel_nostatus (fd);
 |  | ||||||
| +
 |  | ||||||
| +      if (result > 0)
 |  | ||||||
| +	return result;
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
| +  cp = buffer_end;
 |  | ||||||
| +  re = buffer_end;
 |  | ||||||
| +
 |  | ||||||
| +  /* Default to an SMP system in case we cannot obtain an accurate
 |  | ||||||
| +     number.  */
 |  | ||||||
| +  result = 2;
 |  | ||||||
| +
 |  | ||||||
| +  fd = __open_nocancel ("/proc/stat", flags);
 |  | ||||||
| +  if (fd != -1)
 |  | ||||||
| +    {
 |  | ||||||
| +      result = 0;
 |  | ||||||
| +
 |  | ||||||
| +      while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL)
 |  | ||||||
| +	/* The current format of /proc/stat has all the cpu* entries
 |  | ||||||
| +	   at the front.  We assume here that stays this way.  */
 |  | ||||||
| +	if (strncmp (l, "cpu", 3) != 0)
 |  | ||||||
| +	  break;
 |  | ||||||
| +	else if (isdigit (l[3]))
 |  | ||||||
| +	  ++result;
 |  | ||||||
| +
 |  | ||||||
| +      __close_nocancel_nostatus (fd);
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
| +  return result;
 |  | ||||||
|  } |  | ||||||
| +libc_hidden_def (__get_nprocs)
 |  | ||||||
| +weak_alias (__get_nprocs, get_nprocs)
 |  | ||||||
|   |  | ||||||
|   |  | ||||||
|  /* On some architectures it is possible to distinguish between configured |  | ||||||
							
								
								
									
										40
									
								
								glibc.spec
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								glibc.spec
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| %define glibcsrcdir glibc-2.34.9000-120-g2849e2f533 | %define glibcsrcdir glibc-2.34.9000-146-g9bd9978639 | ||||||
| %define glibcversion 2.34.9000 | %define glibcversion 2.34.9000 | ||||||
| # Pre-release tarballs are pulled in from git using a command that is | # Pre-release tarballs are pulled in from git using a command that is | ||||||
| # effectively: | # effectively: | ||||||
| @ -151,7 +151,7 @@ end \ | |||||||
| Summary: The GNU libc libraries | Summary: The GNU libc libraries | ||||||
| Name: glibc | Name: glibc | ||||||
| Version: %{glibcversion} | Version: %{glibcversion} | ||||||
| Release: 10%{?dist} | Release: 11%{?dist} | ||||||
| 
 | 
 | ||||||
| # In general, GPLv2+ is used by programs, LGPLv2+ is used for | # In general, GPLv2+ is used by programs, LGPLv2+ is used for | ||||||
| # libraries. | # libraries. | ||||||
| @ -229,10 +229,7 @@ Patch23: glibc-python3.patch | |||||||
| Patch29: glibc-fedora-nsswitch.patch | Patch29: glibc-fedora-nsswitch.patch | ||||||
| Patch30: glibc-deprecated-selinux-makedb.patch | Patch30: glibc-deprecated-selinux-makedb.patch | ||||||
| Patch31: glibc-deprecated-selinux-nscd.patch | Patch31: glibc-deprecated-selinux-nscd.patch | ||||||
| Patch32: glibc-rh1992702-1.patch | Patch32: glibc-ld-readonly-revert.patch | ||||||
| Patch33: glibc-rh1992702-2.patch |  | ||||||
| Patch34: glibc-rh1992702-3.patch |  | ||||||
| Patch35: glibc-ld-readonly-revert.patch |  | ||||||
| 
 | 
 | ||||||
| ############################################################################## | ############################################################################## | ||||||
| # Continued list of core "glibc" package information: | # Continued list of core "glibc" package information: | ||||||
| @ -2264,6 +2261,37 @@ fi | |||||||
| %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared | %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Wed Sep 29 2021 Florian Weimer <fweimer@redhat.com> - 2.34.9000-11 | ||||||
|  | - Drop glibc-rh1992702-*.patch, applied upstream. | ||||||
|  | - Auto-sync with upstream branch master, | ||||||
|  |   commit 9bd9978639c2f75dbea5c25226264b1ac11fdf05: | ||||||
|  | - Do not declare fmax, fmin _FloatN, _FloatNx versions for C2X | ||||||
|  | - Do not define tgmath.h fmaxmag, fminmag macros for C2X (bug 28397) | ||||||
|  | - Add fmaximum, fminimum functions | ||||||
|  | - Linux: Simplify __opensock and fix race condition [BZ #28353] | ||||||
|  | - pthread/tst-cancel28: Fix barrier re-init race condition | ||||||
|  | - powerpc: Delete unneeded ELF_MACHINE_BEFORE_RTLD_RELOC | ||||||
|  | - posix: Remove spawni.c | ||||||
|  | - Disable symbol hack in libc_nonshared.a | ||||||
|  | - linux: Revert the use of sched_getaffinity on get_nproc (BZ #28310) | ||||||
|  | - linux: Simplify get_nprocs | ||||||
|  | - misc: Add __get_nprocs_sched | ||||||
|  | - htl: Fix sigset of main thread | ||||||
|  | - htl: make pthread_sigstate read/write set/oset outside sigstate section | ||||||
|  | - Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so | ||||||
|  | - benchtests: Improve reliability of memcmp benchmarks | ||||||
|  | - Define __STDC_IEC_60559_BFP__ and __STDC_IEC_60559_COMPLEX__ | ||||||
|  | - build-many-glibcs.py: add powerpc64le glibc variant without multiarch | ||||||
|  | - Fix sysdeps/x86/fpu/s_ffma.c for 32-bit FMA processor case | ||||||
|  | - Linux: Avoid closing -1 on failure in __closefrom_fallback | ||||||
|  | - i386: Port elf_machine_{load_address,dynamic} from x86-64 | ||||||
|  | - aarch64: Disable A64FX memcpy/memmove BTI unconditionally | ||||||
|  | - xsysconf: Only fail on error results and errno set | ||||||
|  | - powerpc64le: Avoid conflicting types for f64xfmaf128 when IFUNC is not used | ||||||
|  | - Fix ffma use of round-to-odd on x86 | ||||||
|  | - vfprintf: Unify argument handling in process_arg | ||||||
|  | - vfprintf: Handle floating-point cases outside of process_arg macro | ||||||
|  | 
 | ||||||
| * Thu Sep 23 2021 Florian Weimer <fweimer@redhat.com> - 2.34.9000-10 | * Thu Sep 23 2021 Florian Weimer <fweimer@redhat.com> - 2.34.9000-10 | ||||||
| - Fix ppc64le build failure by reverting DL_RO_DYN_SECTION removal | - Fix ppc64le build failure by reverting DL_RO_DYN_SECTION removal | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								sources
									
									
									
									
									
								
							| @ -1 +1 @@ | |||||||
| SHA512 (glibc-2.34.9000-120-g2849e2f533.tar.xz) = 6ccd99d0e3e31ca37509d399969eedc59b321dd4d8c2da8748caf5faea464c33a28def32a5674c4323c77378843054270a0660ad1d5c968d0b0e9669bdda3d92 | SHA512 (glibc-2.34.9000-146-g9bd9978639.tar.xz) = 1f170d3ecbb48afbc2bfe27a6645c388d71ecb43e33c7957020da48added1f1718fd4e50294a79aaca79c3dc507891839c86fb70560fb4ec22ad17739bec8683 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user