"rxq_enabled" of netdev is writen in the vhost thread and read by pmd
thread once it observes 'change_seq' is updated. This patch is to keep
order on aarch64 or other weak memory model CPU to ensure 'rxq_enabled' is
observed before 'change_seq'.

Reviewed-by: Gavin Hu <[email protected]>
Signed-off-by: Yanqin Wei <[email protected]>
---
 lib/netdev-provider.h | 8 +++++---
 lib/netdev.c          | 7 ++++++-
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 1e5a40c89..ba809daa0 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -91,11 +91,13 @@ struct netdev {
 static inline void
 netdev_change_seq_changed(const struct netdev *netdev_)
 {
+    uint64_t orig;
     struct netdev *netdev = CONST_CAST(struct netdev *, netdev_);
     seq_change(connectivity_seq_get());
-    netdev->change_seq++;
-    if (!netdev->change_seq) {
-        netdev->change_seq++;
+    atomic_add_explicit(&netdev->change_seq, 1, &orig, memory_order_release);
+    if (OVS_UNLIKELY(!netdev->change_seq)) {
+        atomic_add_explicit(&netdev->change_seq, 1, &orig,
+                            memory_order_release);
     }
 }
 
diff --git a/lib/netdev.c b/lib/netdev.c
index af8f8560d..1841889e7 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -2039,7 +2039,12 @@ restore_all_flags(void *aux OVS_UNUSED)
 uint64_t
 netdev_get_change_seq(const struct netdev *netdev)
 {
-    return netdev->change_seq;
+    uint64_t change_seq;
+
+    atomic_read_explicit(&netdev->change_seq, &change_seq,
+                         memory_order_acquire);
+
+    return change_seq;
 }
 
 #ifndef _WIN32
-- 
2.17.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to