summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Moreno <amorenoz@redhat.com>2022-12-05 09:41:21 +0100
committerIlya Maximets <i.maximets@ovn.org>2022-12-06 16:29:20 +0100
commitd58ad6311c973846bf7012590b3d8d948afab763 (patch)
tree6fbc05f1e64c70ba2a61f93be32d336c907cf36f
parent595d0904d7a718d50caa6e8b6d194c95af95cb84 (diff)
downloadopenvswitch-d58ad6311c973846bf7012590b3d8d948afab763.tar.gz
rculist: Use rculist_back_protected to access prev.
The .prev member of a rculist should not be used directly by users because it's not rcu-safe. A convenient fake mutex (rculist_fake_mutex) helps ensuring that in conjunction with clang's thread safety extensions. Only writers with exclusive access to the rculist should access .prev via some of the provided *_protected() accessors. Use rculist_back_protected() in REVERSE_PROTECTED iterators to avoid clang's compilation warning. Acked-by: Mike Pattrick <mkp@redhat.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r--lib/rculist.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/rculist.h b/lib/rculist.h
index 9bb8cbf3e..6df963eb2 100644
--- a/lib/rculist.h
+++ b/lib/rculist.h
@@ -378,12 +378,14 @@ rculist_is_singleton_protected(const struct rculist *list)
UPDATE_MULTIVAR(ITER, rculist_next(ITER_VAR(ITER))))
#define RCULIST_FOR_EACH_REVERSE_PROTECTED(ITER, MEMBER, RCULIST) \
- for (INIT_MULTIVAR(ITER, MEMBER, (RCULIST)->prev, struct rculist); \
+ for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(RCULIST), \
+ struct rculist); \
CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST)); \
- UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))
+ UPDATE_MULTIVAR(ITER, rculist_back_protected(ITER_VAR(ITER))))
#define RCULIST_FOR_EACH_REVERSE_PROTECTED_CONTINUE(ITER, MEMBER, RCULIST) \
- for (INIT_MULTIVAR(ITER, MEMBER, (ITER)->MEMBER.prev, struct rculist); \
+ for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(ITER->MEMBER), \
+ struct rculist); \
CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST)); \
UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))