From c2a4c53a4561c97790cc6dbb0b12bf9573731f4e Mon Sep 17 00:00:00 2001 From: Alastair McKinstry Date: Mon, 8 Oct 2018 11:44:08 +0100 Subject: [PATCH] btl Gbp-Pq: Name btl.patch --- opal/mca/btl/vader/btl_vader_fbox.h | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/opal/mca/btl/vader/btl_vader_fbox.h b/opal/mca/btl/vader/btl_vader_fbox.h index 7c0cdd53..060d164b 100644 --- a/opal/mca/btl/vader/btl_vader_fbox.h +++ b/opal/mca/btl/vader/btl_vader_fbox.h @@ -29,6 +29,10 @@ typedef union mca_btl_vader_fbox_hdr_t { /** sequence number */ uint16_t seq; } data; + struct { + uint32_t value0; + uint32_t value1; + } data_i32; uint64_t ival; } mca_btl_vader_fbox_hdr_t; @@ -51,10 +55,23 @@ static inline void mca_btl_vader_fbox_set_header (mca_btl_vader_fbox_hdr_t *hdr, uint16_t seq, uint32_t size) { mca_btl_vader_fbox_hdr_t tmp = {.data = {.tag = tag, .seq = seq, .size = size}}; + /* clear out existing tag/seq */ + hdr->data_i32.value1 = 0; + opal_atomic_wmb (); + hdr->data_i32.value0 = size; opal_atomic_wmb (); - hdr->ival = tmp.ival; + hdr->data_i32.value1 = tmp.data_i32.value1; +} + +static inline mca_btl_vader_fbox_hdr_t mca_btl_vader_fbox_read_header (mca_btl_vader_fbox_hdr_t *hdr) +{ + mca_btl_vader_fbox_hdr_t tmp = {.data_i32 = {.value1 = hdr->data_i32.value1}};; + opal_atomic_rmb (); + tmp.data_i32.value0 = hdr->data_i32.value0; + return tmp; } + /* attempt to reserve a contiguous segment from the remote ep */ static inline bool mca_btl_vader_fbox_sendi (mca_btl_base_endpoint_t *ep, unsigned char tag, void * restrict header, const size_t header_size, @@ -138,9 +155,6 @@ static inline bool mca_btl_vader_fbox_sendi (mca_btl_base_endpoint_t *ep, unsign memcpy (data + header_size, payload, payload_size); } - /* write out part of the header now. the tag will be written when the data is available */ - mca_btl_vader_fbox_set_header (MCA_BTL_VADER_FBOX_HDR(dst), tag, ep->fbox_out.seq++, data_size); - end += size; if (OPAL_UNLIKELY(fbox_size == end)) { @@ -152,6 +166,9 @@ static inline bool mca_btl_vader_fbox_sendi (mca_btl_base_endpoint_t *ep, unsign MCA_BTL_VADER_FBOX_HDR(ep->fbox_out.buffer + end)->ival = 0; } + /* write out part of the header now. the tag will be written when the data is available */ + mca_btl_vader_fbox_set_header (MCA_BTL_VADER_FBOX_HDR(dst), tag, ep->fbox_out.seq++, data_size); + /* align the buffer */ ep->fbox_out.end = ((uint32_t) hbs << 31) | end; opal_atomic_wmb (); @@ -174,7 +191,7 @@ static inline bool mca_btl_vader_check_fboxes (void) int poll_count; for (poll_count = 0 ; poll_count <= MCA_BTL_VADER_POLL_COUNT ; ++poll_count) { - const mca_btl_vader_fbox_hdr_t hdr = {.ival = MCA_BTL_VADER_FBOX_HDR(ep->fbox_in.buffer + start)->ival}; + const mca_btl_vader_fbox_hdr_t hdr = mca_btl_vader_fbox_read_header (MCA_BTL_VADER_FBOX_HDR(ep->fbox_in.buffer + start)); /* check for a valid tag a sequence number */ if (0 == hdr.data.tag || hdr.data.seq != ep->fbox_in.seq) { -- 2.30.2