public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [RFC] Support more than 1024 threads
@ 2002-08-08 14:59 Jakub Jelinek
  2002-08-08 15:30 ` Ulrich Drepper
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-08 14:59 UTC (permalink / raw)
  To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers

Hi!

Is there any reason why this shouldn't work (ie. does somebody
use __pthread_handles before __pthread_initialize_minimal)?
Testing still in progress.

The reason for moving __pthread_handles into separate file
is that it can be at the very end of bss, so that unless all 16384
threads are running the unneeded pages at the end are never touched.

2002-08-08  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/bits/local_lim.h (PTHREAD_THREADS_MAX):
	Bump to 16384.
	* manager.c (__pthread_handles): Remove.
	* pthandles.c: New.
	* pthread.c (__pthread_initialize_minimal): Initialize
	__pthread_handles[0] and __pthread_handles[1].
	* Makefile (libpthread-routines): Add pthandles (must be last).

--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h.jj	2002-04-10 00:08:12.000000000 +0200
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h	2002-08-08 23:08:39.000000000 +0200
@@ -64,7 +64,7 @@
 /* The number of threads per process.  */
 #define _POSIX_THREAD_THREADS_MAX	64
 /* This is the value this implementation supports.  */
-#define PTHREAD_THREADS_MAX	1024
+#define PTHREAD_THREADS_MAX	16384
 
 /* Maximum amount by which a process can descrease its asynchronous I/O
    priority level.  */
--- libc/linuxthreads/manager.c.jj	2002-08-04 20:23:21.000000000 +0200
+++ libc/linuxthreads/manager.c	2002-08-08 23:39:01.000000000 +0200
@@ -36,25 +36,6 @@
 #include "restart.h"
 #include "semaphore.h"
 
-/* Array of active threads. Entry 0 is reserved for the initial thread. */
-struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX]
-#ifdef USE_TLS
-# if __LT_SPINLOCK_INIT != 0
-= {
-  { __LOCK_INITIALIZER, NULL, 0},
-  { __LOCK_INITIALIZER, NULL, 0},
-  /* All NULLs */
-}
-# endif
-#else
-= {
-  { __LOCK_INITIALIZER, &__pthread_initial_thread, 0},
-  { __LOCK_INITIALIZER, &__pthread_manager_thread, 0},
-  /* All NULLs */
-}
-#endif
-;
-
 /* For debugging purposes put the maximum number of threads in a variable.  */
 const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;
 
--- libc/linuxthreads/pthread.c.jj	2002-08-08 10:39:16.000000000 +0200
+++ libc/linuxthreads/pthread.c	2002-08-08 23:06:51.000000000 +0200
@@ -417,6 +417,11 @@ __pthread_initialize_minimal(void)
 #ifdef USE_TLS
   pthread_descr self;
 
+  /* First of all init __pthread_handles[0] and [1] if needed.  */
+# if __LT_SPINLOCK_INIT != 0
+  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
+  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
+# endif
 # ifndef SHARED
   /* Unlike in the dynamically linked case the dynamic linker has not
      taken care of initializing the TLS data structures.  */
@@ -449,6 +454,14 @@ __pthread_initialize_minimal(void)
   /* And fill in the pointer the the thread __pthread_handles array.  */
   __pthread_handles[0].h_descr = self;
 #else
+  /* First of all init __pthread_handles[0] and [1].  */
+# if __LT_SPINLOCK_INIT != 0
+  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
+  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
+# endif
+  __pthread_handles[0].h_descr = &__pthread_initial_thread;
+  __pthread_handles[1].h_descr = &__pthread_manager_thread;
+
   /* If we have special thread_self processing, initialize that for the
      main thread now.  */
 # ifdef INIT_THREAD_SELF
--- libc/linuxthreads/Makefile.jj	2002-07-23 10:05:33.000000000 +0200
+++ libc/linuxthreads/Makefile	2002-08-08 23:38:05.000000000 +0200
@@ -36,7 +36,8 @@ libpthread-routines := attr cancel condv
 		       ptlongjmp pthread signals specific errno lockfile \
 		       semaphore spinlock wrapsyscall rwlock pt-machine \
 		       oldsemaphore events getcpuclockid pspinlock barrier \
-		       ptclock_gettime ptclock_settime sighandler
+		       ptclock_gettime ptclock_settime sighandler \
+		       pthandles
 
 nodelete-yes = -Wl,--enable-new-dtags,-z,nodelete
 initfirst-yes = -Wl,--enable-new-dtags,-z,initfirst
--- libc/linuxthreads/pthandles.c.jj	2002-08-09 00:17:21.000000000 +0200
+++ libc/linuxthreads/pthandles.c	2002-08-08 23:38:51.000000000 +0200
@@ -0,0 +1,6 @@
+#include <ldsodefs.h>
+#include "pthread.h"
+#include "internals.h"
+
+/* Array of active threads. Entry 0 is reserved for the initial thread. */
+struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];

	Jakub

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Support more than 1024 threads
  2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
@ 2002-08-08 15:30 ` Ulrich Drepper
  2002-08-09  1:15   ` Jakub Jelinek
  2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
  2002-08-27 23:46 ` [RFC] " Ulrich Drepper
  2 siblings, 1 reply; 6+ messages in thread
From: Ulrich Drepper @ 2002-08-08 15:30 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Roland McGrath, Glibc hackers

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Jakub Jelinek wrote:
> Is there any reason why this shouldn't work (ie. does somebody
> use __pthread_handles before __pthread_initialize_minimal)?
> Testing still in progress.

Well, test using gdb.  I fixed several problems in this area yesterday 
and before but who knows.

- -- 
- ---------------.                          ,-.   1325 Chesapeake Terrace
Ulrich Drepper  \    ,-------------------'   \  Sunnyvale, CA 94089 USA
Red Hat          `--' drepper at redhat.com   `------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQE9UvEQ2ijCOnn/RHQRAoYnAJ0W7+S+XkZcHtyCLoRJXW6BTGPGxgCgiAyU
z8fXB8voGiHEupd6lHMsDjA=
=s7Ff
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Support more than 1024 threads
  2002-08-08 15:30 ` Ulrich Drepper
@ 2002-08-09  1:15   ` Jakub Jelinek
  2002-08-09  1:41     ` Jakub Jelinek
  0 siblings, 1 reply; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-09  1:15 UTC (permalink / raw)
  To: Ulrich Drepper; +Cc: Roland McGrath, Glibc hackers

On Thu, Aug 08, 2002 at 03:30:36PM -0700, Ulrich Drepper wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Jakub Jelinek wrote:
> > Is there any reason why this shouldn't work (ie. does somebody
> > use __pthread_handles before __pthread_initialize_minimal)?
> > Testing still in progress.
> 
> Well, test using gdb.  I fixed several problems in this area yesterday 
> and before but who knows.

Works just fine (of course provided gdb is pointed
to the right linuxthreads_db if the glibc is not installed yet).
make check passed too.
Will do some more checks to see whether libpthread
memory usage increased because of this (comparing /proc/statm for this version,
version without this patch and version with this patch but
with PTHREAD_THREADS_MAX 1024).

	Jakub

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Support more than 1024 threads
  2002-08-09  1:15   ` Jakub Jelinek
@ 2002-08-09  1:41     ` Jakub Jelinek
  0 siblings, 0 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-09  1:41 UTC (permalink / raw)
  To: Ulrich Drepper; +Cc: Roland McGrath, Glibc hackers

On Fri, Aug 09, 2002 at 10:15:45AM +0200, Jakub Jelinek wrote:
> On Thu, Aug 08, 2002 at 03:30:36PM -0700, Ulrich Drepper wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> > 
> > Jakub Jelinek wrote:
> > > Is there any reason why this shouldn't work (ie. does somebody
> > > use __pthread_handles before __pthread_initialize_minimal)?
> > > Testing still in progress.
> > 
> > Well, test using gdb.  I fixed several problems in this area yesterday 
> > and before but who knows.
> 
> Works just fine (of course provided gdb is pointed
> to the right linuxthreads_db if the glibc is not installed yet).
> make check passed too.
> Will do some more checks to see whether libpthread
> memory usage increased because of this (comparing /proc/statm for this version,
> version without this patch and version with this patch but
> with PTHREAD_THREADS_MAX 1024).

These are results from hacking up linuxthreads/Examples/ex2.c, so that
it does fgetc(stdin);

95 95 79 2 0 93 16      - .bss, 16384 (this is current CVS + the patch I posted)
95 95 79 2 0 93 16      - .bss, 1024
96 96 79 2 0 94 17      - .data, 1024 (this is current CVS)

So it looks like it could make things one page better, not worse.

	Jakub

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] Support more than 1024 threads
  2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
  2002-08-08 15:30 ` Ulrich Drepper
@ 2002-08-27 22:37 ` Jakub Jelinek
  2002-08-27 23:46 ` [RFC] " Ulrich Drepper
  2 siblings, 0 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-27 22:37 UTC (permalink / raw)
  To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers

On Thu, Aug 08, 2002 at 11:59:52PM +0200, Jakub Jelinek wrote:
> Is there any reason why this shouldn't work (ie. does somebody
> use __pthread_handles before __pthread_initialize_minimal)?
> Testing still in progress.

As I wrote in the follow up mails, I've tested this using gdb and it
worked just fine, furthermore it makes libpthread at least
on IA-32 use one less page (because of the __pthread_handles placement
at end of .bss).

> The reason for moving __pthread_handles into separate file
> is that it can be at the very end of bss, so that unless all 16384
> threads are running the unneeded pages at the end are never touched.
> 
> 2002-08-08  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* sysdeps/unix/sysv/linux/bits/local_lim.h (PTHREAD_THREADS_MAX):
> 	Bump to 16384.
> 	* manager.c (__pthread_handles): Remove.
> 	* pthandles.c: New.
> 	* pthread.c (__pthread_initialize_minimal): Initialize
> 	__pthread_handles[0] and __pthread_handles[1].
> 	* Makefile (libpthread-routines): Add pthandles (must be last).
> 
> --- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h.jj	2002-04-10 00:08:12.000000000 +0200
> +++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h	2002-08-08 23:08:39.000000000 +0200
> @@ -64,7 +64,7 @@
>  /* The number of threads per process.  */
>  #define _POSIX_THREAD_THREADS_MAX	64
>  /* This is the value this implementation supports.  */
> -#define PTHREAD_THREADS_MAX	1024
> +#define PTHREAD_THREADS_MAX	16384
>  
>  /* Maximum amount by which a process can descrease its asynchronous I/O
>     priority level.  */
> --- libc/linuxthreads/manager.c.jj	2002-08-04 20:23:21.000000000 +0200
> +++ libc/linuxthreads/manager.c	2002-08-08 23:39:01.000000000 +0200
> @@ -36,25 +36,6 @@
>  #include "restart.h"
>  #include "semaphore.h"
>  
> -/* Array of active threads. Entry 0 is reserved for the initial thread. */
> -struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX]
> -#ifdef USE_TLS
> -# if __LT_SPINLOCK_INIT != 0
> -= {
> -  { __LOCK_INITIALIZER, NULL, 0},
> -  { __LOCK_INITIALIZER, NULL, 0},
> -  /* All NULLs */
> -}
> -# endif
> -#else
> -= {
> -  { __LOCK_INITIALIZER, &__pthread_initial_thread, 0},
> -  { __LOCK_INITIALIZER, &__pthread_manager_thread, 0},
> -  /* All NULLs */
> -}
> -#endif
> -;
> -
>  /* For debugging purposes put the maximum number of threads in a variable.  */
>  const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;
>  
> --- libc/linuxthreads/pthread.c.jj	2002-08-08 10:39:16.000000000 +0200
> +++ libc/linuxthreads/pthread.c	2002-08-08 23:06:51.000000000 +0200
> @@ -417,6 +417,11 @@ __pthread_initialize_minimal(void)
>  #ifdef USE_TLS
>    pthread_descr self;
>  
> +  /* First of all init __pthread_handles[0] and [1] if needed.  */
> +# if __LT_SPINLOCK_INIT != 0
> +  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
> +  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
> +# endif
>  # ifndef SHARED
>    /* Unlike in the dynamically linked case the dynamic linker has not
>       taken care of initializing the TLS data structures.  */
> @@ -449,6 +454,14 @@ __pthread_initialize_minimal(void)
>    /* And fill in the pointer the the thread __pthread_handles array.  */
>    __pthread_handles[0].h_descr = self;
>  #else
> +  /* First of all init __pthread_handles[0] and [1].  */
> +# if __LT_SPINLOCK_INIT != 0
> +  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
> +  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
> +# endif
> +  __pthread_handles[0].h_descr = &__pthread_initial_thread;
> +  __pthread_handles[1].h_descr = &__pthread_manager_thread;
> +
>    /* If we have special thread_self processing, initialize that for the
>       main thread now.  */
>  # ifdef INIT_THREAD_SELF
> --- libc/linuxthreads/Makefile.jj	2002-07-23 10:05:33.000000000 +0200
> +++ libc/linuxthreads/Makefile	2002-08-08 23:38:05.000000000 +0200
> @@ -36,7 +36,8 @@ libpthread-routines := attr cancel condv
>  		       ptlongjmp pthread signals specific errno lockfile \
>  		       semaphore spinlock wrapsyscall rwlock pt-machine \
>  		       oldsemaphore events getcpuclockid pspinlock barrier \
> -		       ptclock_gettime ptclock_settime sighandler
> +		       ptclock_gettime ptclock_settime sighandler \
> +		       pthandles
>  
>  nodelete-yes = -Wl,--enable-new-dtags,-z,nodelete
>  initfirst-yes = -Wl,--enable-new-dtags,-z,initfirst
> --- libc/linuxthreads/pthandles.c.jj	2002-08-09 00:17:21.000000000 +0200
> +++ libc/linuxthreads/pthandles.c	2002-08-08 23:38:51.000000000 +0200
> @@ -0,0 +1,6 @@
> +#include <ldsodefs.h>
> +#include "pthread.h"
> +#include "internals.h"
> +
> +/* Array of active threads. Entry 0 is reserved for the initial thread. */
> +struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];
> 
> 	Jakub

	Jakub

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Support more than 1024 threads
  2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
  2002-08-08 15:30 ` Ulrich Drepper
  2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
@ 2002-08-27 23:46 ` Ulrich Drepper
  2 siblings, 0 replies; 6+ messages in thread
From: Ulrich Drepper @ 2002-08-27 23:46 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Roland McGrath, Glibc hackers

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Jakub Jelinek wrote:

> 2002-08-08  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* sysdeps/unix/sysv/linux/bits/local_lim.h (PTHREAD_THREADS_MAX):
> 	Bump to 16384.
> 	* manager.c (__pthread_handles): Remove.
> 	* pthandles.c: New.
> 	* pthread.c (__pthread_initialize_minimal): Initialize
> 	__pthread_handles[0] and __pthread_handles[1].
> 	* Makefile (libpthread-routines): Add pthandles (must be last).

I've applied the patch now.  Thanks,

- -- 
- ---------------.                          ,-.   1325 Chesapeake Terrace
Ulrich Drepper  \    ,-------------------'   \  Sunnyvale, CA 94089 USA
Red Hat          `--' drepper at redhat.com   `------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQE9bHHI2ijCOnn/RHQRAj7sAJ0Yp+BO7jG+HPBOWgPWVrAXvZtb3ACgoaD1
sUx3IMMxYH0w8dgWfnaY7zY=
=zaem
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2002-08-28  6:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
2002-08-08 15:30 ` Ulrich Drepper
2002-08-09  1:15   ` Jakub Jelinek
2002-08-09  1:41     ` Jakub Jelinek
2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
2002-08-27 23:46 ` [RFC] " Ulrich Drepper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).