"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
