From 880867a475b1016f892a1248a3fce693406bf1f1 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 9 May 2003 07:53:33 +0000 Subject: [PATCH] Update. 2003-05-09 Ulrich Drepper * sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c: New file. --- ChangeLog | 4 ++++ nptl/ChangeLog | 9 +++++++++ nptl/allocatestack.c | 8 +++++++- nptl/sysdeps/unix/sysv/linux/x86_64/Makefile | 3 --- nptl/sysdeps/x86_64/pthreaddef.h | 11 +++++++++++ sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c | 1 + 6 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c diff --git a/ChangeLog b/ChangeLog index b3f893b..06559ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2003-05-09 Ulrich Drepper + + * sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c: New file. + 2003-05-08 Ulrich Drepper * malloc/thread-m.h: Remove special handling of thread_atfork if diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 7bd8025..f46c221 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,12 @@ +2003-05-09 Ulrich Drepper + + * allocatestack.c (allocate_stack): If ARCH_RETRY_MMAP is defined, + use it in case mmap to allocate the stack fails. + * sysdeps/unix/sysv/linux/x86_64/Makefile: Don't define + ARCH_MAP_FLAGS here. + * sysdeps/x86_64/pthreaddef.h: Define ARCH_MAP_FLAGS and + ARCH_RETRY_MMAP. + 2003-05-08 Ulrich Drepper * sysdeps/unix/sysv/linux/fork.c: Complete rewrite of the atfork diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 680f365..95ee992 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -393,7 +393,13 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, MAP_PRIVATE | MAP_ANONYMOUS | ARCH_MAP_FLAGS, -1, 0); if (__builtin_expect (mem == MAP_FAILED, 0)) - return errno; + { +#ifdef ARCH_RETRY_MMAP + mem = ARCH_RETRY_MMAP (size); + if (__builtin_expect (mem == MAP_FAILED, 0)) +#endif + return errno; + } /* SIZE is guaranteed to be greater than zero. So we can never get a null pointer back from mmap. */ diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile b/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile index 9ecb7b0..d3e5eb5 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -1,6 +1,3 @@ ifeq ($(subdir),nptl) CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions -fno-asynchronous-unwind-tables - -# We need to make sure that stack memory is allocated in the low 4GB. -CFLAGS-pthread_create.c += -DARCH_MAP_FLAGS=MAP_32BIT endif diff --git a/nptl/sysdeps/x86_64/pthreaddef.h b/nptl/sysdeps/x86_64/pthreaddef.h index 90a67f1..27896a4 100644 --- a/nptl/sysdeps/x86_64/pthreaddef.h +++ b/nptl/sysdeps/x86_64/pthreaddef.h @@ -36,6 +36,17 @@ ({ char *frame; asm ("movq %%rsp, %0" : "=r" (frame)); frame; }) +/* We prefer to have the stack allocated in the low 4GB since this + allows faster context switches. */ +#define ARCH_MAP_FLAGS MAP_32BIT + +/* If it is not possible to allocate memory there retry without that + flag. */ +#define ARCH_RETRY_MMAP(size) \ + mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, \ + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) + + /* XXX Until we have a better place keep the definitions here. */ /* While there is no such syscall. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c b/sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c new file mode 100644 index 0000000..a58d40a --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c @@ -0,0 +1 @@ +#include "../i386/get_clockfreq.c" -- 2.7.4