Blame SOURCES/0038-btl-vader-ensure-the-fast-box-tag-is-always-read-fir.patch

Pablo Greco 12bf56
From e43320ddc3a316e3410d6dde56062cf8968ea284 Mon Sep 17 00:00:00 2001
Pablo Greco 12bf56
From: Nathan Hjelm <hjelmn@lanl.gov>
Pablo Greco 12bf56
Date: Tue, 2 Oct 2018 15:52:45 -0600
Pablo Greco 12bf56
Subject: [PATCH 38/52] btl/vader: ensure the fast box tag is always read first
Pablo Greco 12bf56
Pablo Greco 12bf56
On some platfoms reading a 64-bit value is non-atomic and it is
Pablo Greco 12bf56
possible that the two 32-bit values are read in the wrong order. To
Pablo Greco 12bf56
ensure the tag is always read first this commit reads the tag before
Pablo Greco 12bf56
reading the full 64-bit value.
Pablo Greco 12bf56
Pablo Greco 12bf56
Signed-off-by: Nathan Hjelm <hjelmn@lanl.gov>
Pablo Greco 12bf56
(cherry picked from commit 66a7dc4c72cb25df67e7f872bee7a20b5fa9c763)
Pablo Greco 12bf56
---
Pablo Greco 12bf56
 opal/mca/btl/vader/btl_vader_fbox.h | 12 +++++++++++-
Pablo Greco 12bf56
 1 file changed, 11 insertions(+), 1 deletion(-)
Pablo Greco 12bf56
Pablo Greco 12bf56
diff --git a/opal/mca/btl/vader/btl_vader_fbox.h b/opal/mca/btl/vader/btl_vader_fbox.h
Pablo Greco 12bf56
index df1fb92..6df9a2d 100644
Pablo Greco 12bf56
--- a/opal/mca/btl/vader/btl_vader_fbox.h
Pablo Greco 12bf56
+++ b/opal/mca/btl/vader/btl_vader_fbox.h
Pablo Greco 12bf56
@@ -56,6 +56,16 @@ static inline void mca_btl_vader_fbox_set_header (mca_btl_vader_fbox_hdr_t *hdr,
Pablo Greco 12bf56
     hdr->data.tag = tag;
Pablo Greco 12bf56
 }
Pablo Greco 12bf56
 
Pablo Greco 12bf56
+static inline mca_btl_vader_fbox_hdr_t mca_btl_vader_fbox_read_header (mca_btl_vader_fbox_hdr_t *hdr)
Pablo Greco 12bf56
+{
Pablo Greco 12bf56
+    mca_btl_vader_fbox_hdr_t tmp;
Pablo Greco 12bf56
+    uint16_t tag = hdr->data.tag;
Pablo Greco 12bf56
+    opal_atomic_rmb ();
Pablo Greco 12bf56
+    tmp.ival = hdr->ival;
Pablo Greco 12bf56
+    tmp.data.tag = tag;
Pablo Greco 12bf56
+    return tmp;
Pablo Greco 12bf56
+}
Pablo Greco 12bf56
+
Pablo Greco 12bf56
 /* attempt to reserve a contiguous segment from the remote ep */
Pablo Greco 12bf56
 static inline bool mca_btl_vader_fbox_sendi (mca_btl_base_endpoint_t *ep, unsigned char tag,
Pablo Greco 12bf56
                                              void * restrict header, const size_t header_size,
Pablo Greco 12bf56
@@ -175,7 +185,7 @@ static inline bool mca_btl_vader_check_fboxes (void)
Pablo Greco 12bf56
         int poll_count;
Pablo Greco 12bf56
 
Pablo Greco 12bf56
         for (poll_count = 0 ; poll_count <= MCA_BTL_VADER_POLL_COUNT ; ++poll_count) {
Pablo Greco 12bf56
-            const mca_btl_vader_fbox_hdr_t hdr = {.ival = MCA_BTL_VADER_FBOX_HDR(ep->fbox_in.buffer + start)->ival};
Pablo Greco 12bf56
+            const mca_btl_vader_fbox_hdr_t hdr = mca_btl_vader_fbox_read_header (MCA_BTL_VADER_FBOX_HDR(ep->fbox_in.buffer + start));
Pablo Greco 12bf56
 
Pablo Greco 12bf56
             /* check for a valid tag a sequence number */
Pablo Greco 12bf56
             if (0 == hdr.data.tag || hdr.data.seq != ep->fbox_in.seq) {
Pablo Greco 12bf56
-- 
Pablo Greco 12bf56
1.8.3.1
Pablo Greco 12bf56