From ff5dd74e25e1069d74635dba9e8215a6093c481e Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 18 Jan 2019 17:21:32 +0100 Subject: [PATCH] MINOR: xref: Add missing barriers. Add a few missing barriers in the xref code, it's unlikely to be a problem for x86, but may be on architectures with weak memory ordering. --- include/common/xref.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/common/xref.h b/include/common/xref.h index 6dfa7b6..a6291f5 100644 --- a/include/common/xref.h +++ b/include/common/xref.h @@ -32,6 +32,7 @@ static inline struct xref *xref_get_peer_and_lock(struct xref *xref) /* Get the local pointer to the peer. */ local = HA_ATOMIC_XCHG(&xref->peer, XREF_BUSY); + __ha_barrier_store(); /* If the local pointer is NULL, the peer no longer exists. */ if (local == NULL) { @@ -53,6 +54,7 @@ static inline struct xref *xref_get_peer_and_lock(struct xref *xref) /* The remote lock is BUSY, We retry the process. */ if (remote == XREF_BUSY) { xref->peer = local; + __ha_barrier_store(); continue; } @@ -66,6 +68,8 @@ static inline void xref_unlock(struct xref *xref, struct xref *peer) /* Release the peer. */ peer->peer = xref; + __ha_barrier_store(); + /* Release myself. */ xref->peer = peer; } @@ -73,6 +77,7 @@ static inline void xref_unlock(struct xref *xref, struct xref *peer) static inline void xref_disconnect(struct xref *xref, struct xref *peer) { peer->peer = NULL; + __ha_barrier_store(); xref->peer = NULL; } -- 1.7.10.4