Module Name: src Committed By: riastradh Date: Sun Dec 19 01:18:02 UTC 2021
Modified Files: src/sys/external/bsd/drm2/include/linux: rcupdate.h Log Message: RCU pointer fixes. - Use __typeof__, not typeof. - Use membar_exit, not membar_producer. => We want a store-release, not store/store barrier. => Consider: foo->x = 42; assert(foo->x == 42); rcu_assign_pointer(globalfoo, foo); The foo->x load can be reordered past the store/store barrier (membar_producer), and happen after another thread has clobbered foo->x. - Put the evaluation of the right-hand side before the barrier. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/rcupdate.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/external/bsd/drm2/include/linux/rcupdate.h diff -u src/sys/external/bsd/drm2/include/linux/rcupdate.h:1.8 src/sys/external/bsd/drm2/include/linux/rcupdate.h:1.9 --- src/sys/external/bsd/drm2/include/linux/rcupdate.h:1.8 Sun Dec 19 01:17:54 2021 +++ src/sys/external/bsd/drm2/include/linux/rcupdate.h Sun Dec 19 01:18:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rcupdate.h,v 1.8 2021/12/19 01:17:54 riastradh Exp $ */ +/* $NetBSD: rcupdate.h,v 1.9 2021/12/19 01:18:02 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -41,12 +41,13 @@ #define RCU_INIT_POINTER(P, V) ((P) = (V)) #define rcu_assign_pointer(P, V) do { \ - membar_producer(); \ - (P) = (V); \ + __typeof__(*(P)) *__rcu_assign_pointer_tmp = (V); \ + membar_exit(); \ + (P) = __rcu_assign_pointer_tmp; \ } while (0) #define rcu_dereference(P) ({ \ - typeof(*(P)) *__rcu_dereference_tmp = (P); \ + __typeof__(*(P)) *__rcu_dereference_tmp = (P); \ membar_datadep_consumer(); \ __rcu_dereference_tmp; \ })