From: Olivier Houchard Date: Fri, 18 Jan 2019 16:21:32 +0000 (+0100) Subject: MINOR: xref: Add missing barriers. X-Git-Tag: v2.0-dev1~85 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff5dd74e25e1069d74635dba9e8215a6093c481e;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/common/xref.h b/include/common/xref.h index 6dfa7b6275..a6291f52f5 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; }