|
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 |
|