This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: hppa: pending pthread init patch


On 01/05/2016 04:56 PM, Mike Frysinger wrote:
> do we still need this patch ?

Yes.

The note is woefully inadequate for our new requirements.

Please check this in with the following updated note:

/* CONCURRENCTY NOTES:

   The atomic_exchange_rel synchronizes-with the atomic_exhange_acq
   in pthread_spin_lock. 

   On hppa we must not use a plain `stw` to reset the guard lock.
   This has to do with the kernel compare-and-swap helper that is
   used to implement all of the atomic operations.

   The kernel CAS helper uses it's own internal locks and that means
   that to create a true happens-before relationship between any
   two threads, the second thread must observe the internal lock
   having a value of 0 (it must attempt to take the lock with ldcw).
   This creates the ordering required for a second thread to observe
   the effects of the RMW of the kernel CAS helper in any other
   thread.

   Therefore if a variable is used in an atomic macro it must always
   be manipulated with atomic macros in order for memory ordering
   rules to be preserved.  */

We must remove all instances of `stw` on hppa to manipulate atomic
types or we'll have memory ordering problems between CPUs.

> 
> --- a/sysdeps/hppa/nptl/pthread_spin_init.c
> +++ b/sysdeps/hppa/nptl/pthread_spin_init.c
> @@ -20,9 +20,9 @@
>  int
>  pthread_spin_init (pthread_spinlock_t *lock, int pshared)
>  {
> -  int tmp = 0;
> -  /* This should be a memory barrier to newer compilers */
> -  __asm__ __volatile__ ("stw,ma %1,0(%0)"
> -                        : : "r" (lock), "r" (tmp) : "memory");
> +  /* The LWS-CAS operation on hppa is a synthetic atomic operation
> +     that doesn't provide the type of coherency that we need. Therefore
> +     we force that coherency by using LWS-CAS again.  */
> +  atomic_exchange_rel (lock, 0);
>    return 0;
>  }
> --- a/sysdeps/hppa/nptl/pthread_spin_unlock.c
> +++ b/sysdeps/hppa/nptl/pthread_spin_unlock.c
> @@ -20,9 +20,9 @@
>  int
>  pthread_spin_unlock (pthread_spinlock_t *lock)
>  {
> -  int tmp = 0;
> -  /* This should be a memory barrier to newer compilers */
> -  __asm__ __volatile__ ("stw,ma %1,0(%0)"
> -                        : : "r" (lock), "r" (tmp) : "memory");
> +  /* The LWS-CAS operation on hppa is a synthetic atomic operation
> +     that doesn't provide the type of coherency that we need. Therefore
> +     we force that coherency by using LWS-CAS again.  */
> +  atomic_exchange_rel (lock, 0);
>    return 0;
>  }
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]