Module Name: src Committed By: riastradh Date: Sun Feb 13 14:06:51 UTC 2022
Modified Files: src/sys/arch/hppa/include: lock.h Log Message: hppa: __cpu_simple_lock membar audit. ok skrll To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/arch/hppa/include/lock.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/hppa/include/lock.h diff -u src/sys/arch/hppa/include/lock.h:1.23 src/sys/arch/hppa/include/lock.h:1.24 --- src/sys/arch/hppa/include/lock.h:1.23 Sat Feb 12 17:17:53 2022 +++ src/sys/arch/hppa/include/lock.h Sun Feb 13 14:06:51 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: lock.h,v 1.23 2022/02/12 17:17:53 riastradh Exp $ */ +/* $NetBSD: lock.h,v 1.24 2022/02/13 14:06:51 riastradh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -91,6 +91,25 @@ __cpu_simple_lock_init(__cpu_simple_lock __SIMPLELOCK_RAW_UNLOCKED; } +static __inline int +__cpu_simple_lock_try(__cpu_simple_lock_t *alp) +{ + volatile unsigned long *__aptr = __SIMPLELOCK_ALIGN(alp); + + if (__ldcw(__aptr) == __SIMPLELOCK_RAW_LOCKED) + return 0; + + /* + * __cpu_simple_lock_try must be a load-acquire operation, but + * HPPA's LDCW does not appear to guarantee load-acquire + * semantics, so we have to do LDCW and then an explicit SYNC + * to make a load-acquire operation that pairs with a preceding + * store-release in __cpu_simple_unlock. + */ + __sync(); + return 1; +} + static __inline void __cpu_simple_lock(__cpu_simple_lock_t *alp) { @@ -103,24 +122,20 @@ __cpu_simple_lock(__cpu_simple_lock_t *a * some work. */ - while (__ldcw(__aptr) == __SIMPLELOCK_RAW_LOCKED) + while (!__cpu_simple_lock_try(alp)) while (*__aptr == __SIMPLELOCK_RAW_LOCKED) ; } -static __inline int -__cpu_simple_lock_try(__cpu_simple_lock_t *alp) -{ - volatile unsigned long *__aptr = __SIMPLELOCK_ALIGN(alp); - - return (__ldcw(__aptr) != __SIMPLELOCK_RAW_LOCKED); -} - static __inline void __cpu_simple_unlock(__cpu_simple_lock_t *alp) { volatile unsigned long *__aptr = __SIMPLELOCK_ALIGN(alp); + /* + * SYNC and then store makes a store-release that pairs with + * the load-acquire in a subsequent __cpu_simple_lock_try. + */ __sync(); *__aptr = __SIMPLELOCK_RAW_UNLOCKED; }