<div dir="ltr"><div>Wall time obtained from do_gettimeofday is susceptible to sudden jumps due to user setting the time or due to NTP.</div><div><br></div><div>Boot time is constantly increasing time better suited for comparing two timestamps.</div><div>---</div><div> fs/ocfs2/cluster/heartbeat.c |   45 +++++++++++-------------------------------</div><div> 1 file changed, 11 insertions(+), 34 deletions(-)</div><div><br></div><div>diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c</div><div>index 363f0dc..a1f6ba2 100644</div><div>--- a/fs/ocfs2/cluster/heartbeat.c</div><div>+++ b/fs/ocfs2/cluster/heartbeat.c</div><div>@@ -291,6 +291,7 @@ static int o2hb_pop_count(void *map, int count)</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>return pop;</div><div> }</div><div> </div><div>+</div><div> static void o2hb_write_timeout(struct work_struct *work)</div><div> {</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>int failed, quorum;</div><div>@@ -1083,35 +1084,11 @@ bail:</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>return ret;</div><div> }</div><div> </div><div>-/* Subtract b from a, storing the result in a. a *must* have a larger</div><div>- * value than b. */</div><div>-static void o2hb_tv_subtract(struct timeval *a,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                        </span>     struct timeval *b)</div><div>-{</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>/* just return 0 when a is after b */</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>if (a-&gt;tv_sec &lt; b-&gt;tv_sec ||</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>    (a-&gt;tv_sec == b-&gt;tv_sec &amp;&amp; a-&gt;tv_usec &lt; b-&gt;tv_usec)) {</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>a-&gt;tv_sec = 0;</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>a-&gt;tv_usec = 0;</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>-</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>a-&gt;tv_sec -= b-&gt;tv_sec;</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>a-&gt;tv_usec -= b-&gt;tv_usec;</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>while ( a-&gt;tv_usec &lt; 0 ) {</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>a-&gt;tv_sec--;</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>a-&gt;tv_usec += 1000000;</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>-}</div><div>-</div><div>-static unsigned int o2hb_elapsed_msecs(struct timeval *start,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                                </span>       struct timeval *end)</div><div>-{</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>struct timeval res = *end;</div><div>-</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>o2hb_tv_subtract(&amp;res, start);</div><div>-</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>return res.tv_sec * 1000 + res.tv_usec / 1000;</div><div>+static unsigned int o2hb_elapsed_msecs(struct timespec *start,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>struct timespec *end) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>struct timespec res;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>res = timespec_sub(*end, *start);</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>return res.tv_sec* MSEC_PER_SEC + res.tv_nsec/NSEC_PER_MSEC;</div><div> }</div><div> </div><div> /*</div><div>@@ -1124,7 +1101,7 @@ static int o2hb_thread(void *data)</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>int i, ret;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>struct o2hb_region *reg = data;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>struct o2hb_bio_wait_ctxt write_wc;</div><div>-<span class="Apple-tab-span" style="white-space:pre">        </span>struct timeval before_hb, after_hb;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>struct timespec before_hb, after_hb;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>unsigned int elapsed_msec;</div><div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>mlog(ML_HEARTBEAT|ML_KTHREAD, &quot;hb thread running\n&quot;);</div><div>@@ -1141,17 +1118,17 @@ static int o2hb_thread(void *data)</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span> * hr_timeout_ms between disk writes. On busy systems</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span> * this should result in a heartbeat which is less</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span> * likely to time itself out. */</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>do_gettimeofday(&amp;before_hb);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>getboottime(&amp;before_hb);</div><div> </div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>ret = o2hb_do_disk_heartbeat(reg);</div><div> </div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>do_gettimeofday(&amp;after_hb);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>getboottime(&amp;after_hb);</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>elapsed_msec = o2hb_elapsed_msecs(&amp;before_hb, &amp;after_hb);</div><div> </div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>mlog(ML_HEARTBEAT,</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>     &quot;start = %lu.%lu, end = %lu.%lu, msec = %u\n&quot;,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>     before_hb.tv_sec, (unsigned long) before_hb.tv_usec,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>     after_hb.tv_sec, (unsigned long) after_hb.tv_usec,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>     before_hb.tv_sec, (unsigned long) before_hb.tv_nsec/NSEC_PER_USEC,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>     after_hb.tv_sec, (unsigned long) after_hb.tv_nsec/NSEC_PER_USEC,</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>     elapsed_msec);</div><div> </div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>if (!kthread_should_stop() &amp;&amp;</div><div>-- </div><div>1.7.9.5</div><div><br></div></div>