diff options
author | Adrian Moreno <amorenoz@redhat.com> | 2022-12-05 09:41:21 +0100 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2022-12-06 16:21:54 +0100 |
commit | 6bc92db366631f0996c8cbae2d6e1263d437ce21 (patch) | |
tree | 0281e948f9122bc140e98ebb2d69db907b7e4567 | |
parent | e83dad6e53f3fe04ca9c4d6972fcaa7995de2ba2 (diff) | |
download | openvswitch-6bc92db366631f0996c8cbae2d6e1263d437ce21.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.h | 8 |
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)) |