<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">I'm puzzled, James - Why is &quot;cache_jobid&quot; in there?&nbsp; Isn't that from Ben Evans' work?&nbsp; This patch landed before all of that...</p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> James Simmons &lt;jsimmons@infradead.org&gt;<br>
<b>Sent:</b> Monday, July 30, 2018 9:25:58 PM<br>
<b>To:</b> Andreas Dilger; Oleg Drokin; NeilBrown<br>
<b>Cc:</b> Lustre Development List; Patrick Farrell; James Simmons<br>
<b>Subject:</b> [PATCH 06/31] lustre: llite: reduce jobstats race window</font>
<div>&nbsp;</div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">From: Patrick Farrell &lt;paf@cray.com&gt;<br>
<br>
In the current code, lli_jobid is set to zero on every call<br>
to lustre_get_jobid.&nbsp; This causes problems, because it's<br>
used asynchronously to set the job id in RPCs, and some<br>
RPCs will falsely get no jobid set.&nbsp; (For small IO sizes,<br>
this can be up to 60% of RPCs.)<br>
<br>
It would be very expensive to put hard synchronization<br>
between this and every outbound RPC, and it's OK to very<br>
rarely get an RPC without correct job stats info.<br>
<br>
This patch only updates the lli_jobid when the job id has<br>
changed, which leaves only a very small window for reading<br>
an inconsistent job id.<br>
<br>
Signed-off-by: Patrick Farrell &lt;paf@cray.com&gt;<br>
WC-id: <a href="https://jira.whamcloud.com/browse/LU-8926">https://jira.whamcloud.com/browse/LU-8926</a><br>
Reviewed-on: <a href="https://review.whamcloud.com/24253">https://review.whamcloud.com/24253</a><br>
Reviewed-by: Andreas Dilger &lt;adilger@whamcloud.com&gt;<br>
Reviewed-by: Chris Horn &lt;hornc@cray.com&gt;<br>
Signed-off-by: James Simmons &lt;jsimmons@infradead.org&gt;<br>
---<br>
&nbsp;drivers/staging/lustre/lustre/llite/llite_lib.c&nbsp;&nbsp;&nbsp; |&nbsp; 1 &#43;<br>
&nbsp;drivers/staging/lustre/lustre/obdclass/class_obd.c | 20 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;------<br>
&nbsp;2 files changed, 15 insertions(&#43;), 6 deletions(-)<br>
<br>
diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c<br>
index c0861b9..72b118a 100644<br>
--- a/drivers/staging/lustre/lustre/llite/llite_lib.c<br>
&#43;&#43;&#43; b/drivers/staging/lustre/lustre/llite/llite_lib.c<br>
@@ -894,6 &#43;894,7 @@ void ll_lli_init(struct ll_inode_info *lli)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lli-&gt;lli_async_rc = 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutex_init(&amp;lli-&gt;lli_layout_mutex);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(lli-&gt;lli_jobid, 0, LUSTRE_JOBID_SIZE);<br>
&nbsp;}<br>
&nbsp;<br>
&nbsp;int ll_fill_super(struct super_block *sb)<br>
diff --git a/drivers/staging/lustre/lustre/obdclass/class_obd.c b/drivers/staging/lustre/lustre/obdclass/class_obd.c<br>
index cdaf729..87327ef 100644<br>
--- a/drivers/staging/lustre/lustre/obdclass/class_obd.c<br>
&#43;&#43;&#43; b/drivers/staging/lustre/lustre/obdclass/class_obd.c<br>
@@ -95,26 &#43;95,34 @@<br>
&nbsp; */<br>
&nbsp;int lustre_get_jobid(char *jobid)<br>
&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(jobid, 0, LUSTRE_JOBID_SIZE);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char tmp_jobid[LUSTRE_JOBID_SIZE] = { 0 };<br>
&#43;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Jobstats isn't enabled */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(obd_jobid_var, JOBSTATS_DISABLE) == 0)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out_cache_jobid;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Use process name &#43; fsuid as jobid */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(obd_jobid_var, JOBSTATS_PROCNAME_UID) == 0) {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snprintf(jobid, LUSTRE_JOBID_SIZE, &quot;%s.%u&quot;,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snprintf(tmp_jobid, LUSTRE_JOBID_SIZE, &quot;%s.%u&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current-&gt;comm,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from_kuid(&amp;init_user_ns, current_fsuid()));<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out_cache_jobid;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Whole node dedicated to single job */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(obd_jobid_var, JOBSTATS_NODELOCAL) == 0) {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(jobid, obd_jobid_node);<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(tmp_jobid, obd_jobid_node);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out_cache_jobid;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -ENOENT;<br>
&#43;<br>
&#43;out_cache_jobid:<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Only replace the job ID if it changed. */<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(jobid, tmp_jobid) != 0)<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(jobid, tmp_jobid);<br>
&#43;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;}<br>
&nbsp;EXPORT_SYMBOL(lustre_get_jobid);<br>
&nbsp;<br>
-- <br>
1.8.3.1<br>
<br>
</div>
</span></font></div>
</body>
</html>