On 11/4/22 15:25, Ilya Maximets wrote:
Some macros for rculist have no users and there are no unit tests
specific to that library as well, so broken code wasn't spotted
while updating to multi-variable iterators.

Fixing multiple problems like missing commas, parenthesis, incorrect
variable and macro names.

Fixes: d293965d7b06 ("rculist: use multi-variable helpers for loop macros.")
Reported-by: Subrata Nath <subrata.n...@nokia.com>
Co-authored-by: Dumitru Ceara <dce...@redhat.com>
Signed-off-by: Dumitru Ceara <dce...@redhat.com>
Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
---
  lib/rculist.h | 18 +++++++++---------
  1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/lib/rculist.h b/lib/rculist.h
index c0d77acf9..9bb8cbf3e 100644
--- a/lib/rculist.h
+++ b/lib/rculist.h
@@ -380,18 +380,18 @@ rculist_is_singleton_protected(const struct rculist *list)
  #define RCULIST_FOR_EACH_REVERSE_PROTECTED(ITER, MEMBER, RCULIST)             
\
      for (INIT_MULTIVAR(ITER, MEMBER, (RCULIST)->prev, struct rculist);        
\
           CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST));       
\
-         UPDATE_MULTIVAR(ITER, ITER_VAR(VAR).prev))
+         UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))
#define RCULIST_FOR_EACH_REVERSE_PROTECTED_CONTINUE(ITER, MEMBER, RCULIST) \
      for (INIT_MULTIVAR(ITER, MEMBER, (ITER)->MEMBER.prev, struct rculist);    
\
           CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST));       
\
-         UPDATE_MULTIVAR(ITER, ITER_VAR(VAR).prev))
+         UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))


There's another hidden problem with the REVERSE iterators that has not popped up yet: They access 'prev' member directly which will not compile when using clang's thread-safety macros because of a fake mutex specifically added to avoid it. Since the macros are PROTECTED it should be OK to use rculist_back_protected() instead.

I have written a unit test for rculist that I was planning to post soon. If you prefer I can fix this at the same time.


  #define RCULIST_FOR_EACH_PROTECTED(ITER, MEMBER, RCULIST)                     
\
      for (INIT_MULTIVAR(ITER, MEMBER, rculist_next_protected(RCULIST),         
\
                         struct rculist);                                       
\
           CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST));       
\
-         UPDATE_MULTIVAR(ITER, rculist_next_protected(ITER_VAR(ITER)))        \
+         UPDATE_MULTIVAR(ITER, rculist_next_protected(ITER_VAR(ITER))))       \
#define RCULIST_FOR_EACH_SAFE_SHORT_PROTECTED(ITER, MEMBER, RCULIST) \
      for (INIT_MULTIVAR_SAFE_SHORT(ITER, MEMBER,                               
\
@@ -399,18 +399,18 @@ rculist_is_singleton_protected(const struct rculist *list)
                                    struct rculist);                            
\
           CONDITION_MULTIVAR_SAFE_SHORT(ITER, MEMBER,                          
\
                                         ITER_VAR(ITER) != (RCULIST),           
\
-             ITER_NEXT_VAR(ITER) = rculist_next_protected(ITER_VAR(VAR)));    \
-        UPDATE_MULTIVAR_SHORT(ITER))
+             ITER_NEXT_VAR(ITER) = rculist_next_protected(ITER_VAR(ITER)));   \
+        UPDATE_MULTIVAR_SAFE_SHORT(ITER))
#define RCULIST_FOR_EACH_SAFE_LONG_PROTECTED(ITER, NEXT, MEMBER, RCULIST) \
      for (INIT_MULTIVAR_SAFE_LONG(ITER, NEXT, MEMBER,                          
\
-                                 rculist_next_protected(RCULIST)              \
+                                 rculist_next_protected(RCULIST),             \
                                   struct rculist);                             
\
-         CONDITION_MULTIVAR_SAFE_LONG(VAR, NEXT, MEMBER                       \
+         CONDITION_MULTIVAR_SAFE_LONG(ITER, NEXT, MEMBER,                     \
                                        ITER_VAR(ITER) != (RCULIST),            
\
-             ITER_VAR(NEXT) = rculist_next_protected(ITER_VAR(VAR)),          \
+             ITER_VAR(NEXT) = rculist_next_protected(ITER_VAR(ITER)),         \
                                        ITER_VAR(NEXT) != (RCULIST));           
\
-        UPDATE_MULTIVAR_LONG(ITER))
+        UPDATE_MULTIVAR_SAFE_LONG(ITER, NEXT))
#define RCULIST_FOR_EACH_SAFE_PROTECTED(...) \
      OVERLOAD_SAFE_MACRO(RCULIST_FOR_EACH_SAFE_LONG_PROTECTED,                 
\

Thanks
--
Adrián Moreno

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to