Blame SOURCES/0040-btl-vader-fix-race-condition-in-writing-header.patch

Pablo Greco 12bf56
From 5d658937ce874422c66ac4c7d9723df8bb69ecd7 Mon Sep 17 00:00:00 2001
Pablo Greco 12bf56
From: Nathan Hjelm <hjelmn@me.com>
Pablo Greco 12bf56
Date: Fri, 5 Oct 2018 16:30:06 -0600
Pablo Greco 12bf56
Subject: [PATCH 40/52] btl/vader: fix race condition in writing header
Pablo Greco 12bf56
Pablo Greco 12bf56
Signed-off-by: Nathan Hjelm <hjelmn@me.com>
Pablo Greco 12bf56
(cherry picked from commit 8291f6722d890efd15333bf7b26f0d07952fa41e)
Pablo Greco 12bf56
Signed-off-by: Nathan Hjelm <hjelmn@me.com>
Pablo Greco 12bf56
---
Pablo Greco 12bf56
 opal/mca/btl/vader/btl_vader_fbox.h | 19 ++++++++++++-------
Pablo Greco 12bf56
 1 file changed, 12 insertions(+), 7 deletions(-)
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 6df9a2d..4ebfde8 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
@@ -29,6 +29,10 @@ typedef union mca_btl_vader_fbox_hdr_t {
Pablo Greco 12bf56
         /** sequence number */
Pablo Greco 12bf56
         uint16_t  seq;
Pablo Greco 12bf56
     } data;
Pablo Greco 12bf56
+    struct {
Pablo Greco 12bf56
+        uint32_t value0;
Pablo Greco 12bf56
+        uint32_t value1;
Pablo Greco 12bf56
+    } data_i32;
Pablo Greco 12bf56
     uint64_t ival;
Pablo Greco 12bf56
 } mca_btl_vader_fbox_hdr_t;
Pablo Greco 12bf56
 
Pablo Greco 12bf56
@@ -50,19 +54,20 @@ void mca_btl_vader_poll_handle_frag (mca_btl_vader_hdr_t *hdr, mca_btl_base_endp
Pablo Greco 12bf56
 static inline void mca_btl_vader_fbox_set_header (mca_btl_vader_fbox_hdr_t *hdr, uint16_t tag,
Pablo Greco 12bf56
                                                   uint16_t seq, uint32_t size)
Pablo Greco 12bf56
 {
Pablo Greco 12bf56
-    mca_btl_vader_fbox_hdr_t tmp = {.data = {.tag = 0, .seq = seq, .size = size}};
Pablo Greco 12bf56
-    hdr->ival = tmp.ival;
Pablo Greco 12bf56
+    mca_btl_vader_fbox_hdr_t tmp = {.data = {.tag = tag, .seq = seq, .size = size}};
Pablo Greco 12bf56
+    /* clear out existing tag/seq */
Pablo Greco 12bf56
+    hdr->data_i32.value1 = 0;
Pablo Greco 12bf56
+    opal_atomic_wmb ();
Pablo Greco 12bf56
+    hdr->data_i32.value0 = size;
Pablo Greco 12bf56
     opal_atomic_wmb ();
Pablo Greco 12bf56
-    hdr->data.tag = tag;
Pablo Greco 12bf56
+    hdr->data_i32.value1 = tmp.data_i32.value1;
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
+    mca_btl_vader_fbox_hdr_t tmp = {.data_i32 = {.value1 = hdr->data_i32.value1}};;
Pablo Greco 12bf56
     opal_atomic_rmb ();
Pablo Greco 12bf56
-    tmp.ival = hdr->ival;
Pablo Greco 12bf56
-    tmp.data.tag = tag;
Pablo Greco 12bf56
+    tmp.data_i32.value0 = hdr->data_i32.value0;
Pablo Greco 12bf56
     return tmp;
Pablo Greco 12bf56
 }
Pablo Greco 12bf56
 
Pablo Greco 12bf56
-- 
Pablo Greco 12bf56
1.8.3.1
Pablo Greco 12bf56