Skip to content

Commit 8291f67

Browse files
committed
btl/vader: fix race condition in writing header
Signed-off-by: Nathan Hjelm <hjelmn@me.com>
1 parent 1a14785 commit 8291f67

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

opal/mca/btl/vader/btl_vader_fbox.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ typedef union mca_btl_vader_fbox_hdr_t {
2929
/** sequence number */
3030
uint16_t seq;
3131
} data;
32+
struct {
33+
uint32_t value0;
34+
uint32_t value1;
35+
} data_i32;
3236
uint64_t ival;
3337
} mca_btl_vader_fbox_hdr_t;
3438

@@ -50,19 +54,20 @@ void mca_btl_vader_poll_handle_frag (mca_btl_vader_hdr_t *hdr, mca_btl_base_endp
5054
static inline void mca_btl_vader_fbox_set_header (mca_btl_vader_fbox_hdr_t *hdr, uint16_t tag,
5155
uint16_t seq, uint32_t size)
5256
{
53-
mca_btl_vader_fbox_hdr_t tmp = {.data = {.tag = 0, .seq = seq, .size = size}};
54-
hdr->ival = tmp.ival;
57+
mca_btl_vader_fbox_hdr_t tmp = {.data = {.tag = tag, .seq = seq, .size = size}};
58+
/* clear out existing tag/seq */
59+
hdr->data_i32.value1 = 0;
60+
opal_atomic_wmb ();
61+
hdr->data_i32.value0 = size;
5562
opal_atomic_wmb ();
56-
hdr->data.tag = tag;
63+
hdr->data_i32.value1 = tmp.data_i32.value1;
5764
}
5865

5966
static inline mca_btl_vader_fbox_hdr_t mca_btl_vader_fbox_read_header (mca_btl_vader_fbox_hdr_t *hdr)
6067
{
61-
mca_btl_vader_fbox_hdr_t tmp;
62-
uint16_t tag = hdr->data.tag;
68+
mca_btl_vader_fbox_hdr_t tmp = {.data_i32 = {.value1 = hdr->data_i32.value1}};;
6369
opal_atomic_rmb ();
64-
tmp.ival = hdr->ival;
65-
tmp.data.tag = tag;
70+
tmp.data_i32.value0 = hdr->data_i32.value0;
6671
return tmp;
6772
}
6873

0 commit comments

Comments
 (0)