]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 30 Aug 2001 02:13:26 +0000 (02:13 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 30 Aug 2001 02:13:26 +0000 (02:13 +0000)
2001-08-29  Ulrich Drepper  <drepper@redhat.com>

* spinlock.c (__pthread_lock): Top max_count value with
MAX_ADAPTIVE_SPIN_COUNT.
* internals.h (MAX_ADAPTIVE_SPIN_COUNT): Define if not already done.

* sysdeps/i386/i686/pt-machine.h (BUSY_WAIT_NOP): New macro to
help P4.

linuxthreads/ChangeLog
linuxthreads/internals.h
linuxthreads/spinlock.c
linuxthreads/sysdeps/i386/i686/pt-machine.h

index 1ce5a23186fa2b4d3ce98e80f07e6c90aaac9767..b85f8c94dff0c4e0ee7f5115445812498f1bfe50 100644 (file)
@@ -1,3 +1,12 @@
+2001-08-29  Ulrich Drepper  <drepper@redhat.com>
+
+       * spinlock.c (__pthread_lock): Top max_count value with
+       MAX_ADAPTIVE_SPIN_COUNT.
+       * internals.h (MAX_ADAPTIVE_SPIN_COUNT): Define if not already done.
+
+       * sysdeps/i386/i686/pt-machine.h (BUSY_WAIT_NOP): New macro to
+       help P4.
+
 2001-08-27  Jakub Jelinek  <jakub@redhat.com>
 
        * sysdeps/pthread/bits/libc-lock.h (__libc_rwlock_t): Only define to
index d5b469b347b2b8236ec81c02befc8e6489013a94..ae492662788ea0300f9dd2a0a6abbf139f599ad8 100644 (file)
@@ -414,6 +414,13 @@ static inline pthread_descr thread_self (void)
 #define MAX_SPIN_COUNT 50
 #endif
 
+/* Max number of times the spinlock in the adaptive mutex implementation
+   spins actively on SMP systems.  */
+
+#ifndef MAX_ADAPTIVE_SPIN_COUNT
+#define MAX_ADAPTIVE_SPIN_COUNT 100
+#endif
+
 /* Duration of sleep (in nanoseconds) when we can't acquire a spinlock
    after MAX_SPIN_COUNT iterations of sched_yield().
    With the 2.0 and 2.1 kernels, this MUST BE > 2ms.
index 199386a4fce9f41c30ca45f3a43722f0450517e9..3e16825997cb3806dc6fb743dc757db9d321e348 100644 (file)
@@ -94,6 +94,9 @@ again:
   if (__pthread_smp_kernel) {
     int max_count = lock->__spinlock * 2 + 10;
 
+    if (max_count > MAX_ADAPTIVE_SPIN_COUNT)
+      max_count = MAX_ADAPTIVE_SPIN_COUNT;
+
     for (spin_count = 0; spin_count < max_count; spin_count++) {
       if (((oldstatus = lock->__status) & 1) == 0) {
        if(__compare_and_swap(&lock->__status, oldstatus, oldstatus | 1))
@@ -104,6 +107,9 @@ again:
          return;
        }
       }
+#ifdef BUSY_WAIT_NOP
+      BUSY_WAIT_NOP;
+#endif
       __asm __volatile ("" : "=m" (lock->__status) : "0" (lock->__status));
     }
 
index 7df3e7e48781059a3ce88d8df75223c93f575f90..c7396024bb4592284623026ca959d5c8498881ce 100644 (file)
@@ -64,3 +64,6 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
 #if __ASSUME_LDT_WORKS > 0
 #include "../useldt.h"
 #endif
+
+/* The P4 and above really want some help to prevent overheating.  */
+#define BUSY_WAIT_NOP  __asm__ ("rep; nop")