<font size=1>Hello Bart,</font>
<br><font size=1>This patch solved the data race problem,</font>
<br><font size=1>but the assignment for paths check interval has no effect,</font>
<br><font size=1>since there is no path in vecs when calling init_path_check_interval(vecs)
in child(),</font>
<br><font size=1>I think it is better to call  init_path_check_interval(vecs)
at reconfigure() or configure() </font>
<br><font size=1>after the paths has created in vecs .</font>
<br>
<br><font size=1>Thanks,</font>
<br><font size=1>Tang</font>
<p><font size=2 face="sans-serif"><br>
</font>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
    </font><font size=1 face="sans-serif">Bart Van Assche
<bart.vanassche@sandisk.com></font>
<br><font size=1 color=#5f5f5f face="sans-serif">收件人:    
    </font><font size=1 face="sans-serif">Christophe
Varoqui <christophe.varoqui@opensvc.com>, </font>
<br><font size=1 color=#5f5f5f face="sans-serif">抄送:    
   </font><font size=1 face="sans-serif">device-mapper
development <dm-devel@redhat.com></font>
<br><font size=1 color=#5f5f5f face="sans-serif">日期:    
    </font><font size=1 face="sans-serif">2016/10/05
01:45</font>
<br><font size=1 color=#5f5f5f face="sans-serif">主题:    
   </font><font size=1 face="sans-serif">[dm-devel] [PATCH
07/15] multipathd: Fix a data race</font>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
   </font><font size=1 face="sans-serif">dm-devel-bounces@redhat.com</font>
<br>
<hr noshade>
<br>
<br>
<br><tt><font size=2>Avoid that the path check interval initialization
loop races with<br>
other code that accesses the path vectors by executing that code<br>
on the context of the main thread instead of the checker loop.<br>
This patch avoids that DRD reports the following:<br>
<br>
Conflicting store by thread 1 at 0x07f3f1f8 size 8<br>
   at 0x40B50C: reconfigure (main.c:2014)<br>
   by 0x40C2EC: child (main.c:2371)<br>
   by 0x40CDA1: main (main.c:2609)<br>
Address 0x7f3f1f8 is at offset 40 from 0x7f3f1d0. Allocation context:<br>
   at 0x4C32995: calloc (in /usr/lib64/valgrind/vgpreload_drd-amd64-linux.so)<br>
   by 0x5DDAC36: zalloc (memory.c:34)<br>
   by 0x40B61A: init_vecs (main.c:2043)<br>
   by 0x40BF01: child (main.c:2295)<br>
   by 0x40CDA1: main (main.c:2609)<br>
<br>
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com><br>
---<br>
 multipathd/main.c | 24 +++++++++++++++---------<br>
 1 file changed, 15 insertions(+), 9 deletions(-)<br>
<br>
diff --git a/multipathd/main.c b/multipathd/main.c<br>
index 3030e85..cdfafe8 100644<br>
--- a/multipathd/main.c<br>
+++ b/multipathd/main.c<br>
@@ -1742,6 +1742,19 @@ check_path (struct vectors * vecs, struct path *
pp, int ticks)<br>
                  return
1;<br>
 }<br>
 <br>
+static void init_path_check_interval(struct vectors *vecs)<br>
+{<br>
+                
struct config *conf;<br>
+                
struct path *pp;<br>
+                
unsigned int i;<br>
+<br>
+                
vector_foreach_slot (vecs->pathvec, pp, i) {<br>
+                
                 conf
= get_multipath_config();<br>
+                
                 pp->checkint
= conf->checkint;<br>
+                
                 put_multipath_config(conf);<br>
+                
}<br>
+}<br>
+<br>
 static void *<br>
 checkerloop (void *ap)<br>
 {<br>
@@ -1759,15 +1772,6 @@ checkerloop (void *ap)<br>
                  vecs
= (struct vectors *)ap;<br>
                  condlog(2,
"path checkers start up");<br>
 <br>
-                
/*<br>
-                
 * init the path check interval<br>
-                
 */<br>
-                
vector_foreach_slot (vecs->pathvec, pp, i) {<br>
-                
                 conf
= get_multipath_config();<br>
-                
                 pp->checkint
= conf->checkint;<br>
-                
                 put_multipath_config(conf);<br>
-                
}<br>
-<br>
                  /*
Tweak start time for initial path check */<br>
                  if
(clock_gettime(CLOCK_MONOTONIC, &last_time) != 0)<br>
                  
               
last_time.tv_sec = 0;<br>
@@ -2327,6 +2331,8 @@ child (void * param)<br>
                  
*/<br>
                  post_config_state(DAEMON_CONFIGURE);<br>
 <br>
+                
init_path_check_interval(vecs);<br>
+<br>
                  /*<br>
                  
* Start uevent listener early to catch events<br>
                  
*/<br>
-- <br>
2.10.0<br>
<br>
--<br>
dm-devel mailing list<br>
dm-devel@redhat.com<br>
</font></tt><a href="https://www.redhat.com/mailman/listinfo/dm-devel"><tt><font size=2>https://www.redhat.com/mailman/listinfo/dm-devel</font></tt></a><tt><font size=2><br>
</font></tt>
<br>