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; \
})