<matrixBuild _class='hudson.matrix.MatrixBuild'><action _class='hudson.model.CauseAction'><cause _class='org.jenkinsci.plugins.ghprb.GhprbCause'><shortDescription>GitHub pull request #3227 of commit f0dba496eefdf4170c19c83fc9fbd22d38488215, no merge conflicts.</shortDescription></cause></action><action _class='org.jenkinsci.plugins.ghprb.GhprbParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>sha1</name><value>origin/pr/3227/merge</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommit</name><value>f0dba496eefdf4170c19c83fc9fbd22d38488215</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommitAuthor</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommitAuthorEmail</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbAuthorRepoGitUrl</name><value>https://github.com/kawamuray/bcc.git</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthor</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorEmail</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorLogin</name><value>yonghong-song</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorLoginMention</name><value>@yonghong-song</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullId</name><value>3227</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTargetBranch</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbSourceBranch</name><value>offcputime-negative-time</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>GIT_BRANCH</name><value>offcputime-negative-time</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorEmail</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorLogin</name><value>kawamuray</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorLoginMention</name><value>@kawamuray</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullDescription</name><value>GitHub pull request #3227 of commit f0dba496eefdf4170c19c83fc9fbd22d38488215, no merge conflicts.</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullTitle</name><value>tools/offcputime Filter out negative offcpu duration</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullLink</name><value>https://github.com/iovisor/bcc/pull/3227</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullLongDescription</name><value>I think the current `offcputime.py` counts not only events properly filtered in but also some events with short duration due to regressing value from `bpf_ktime_get_ns()`.\r\n\r\nbcc version: latest on git\r\nkernel version: CentOS7, 3.10.0-1127.18.2.el7\r\n\r\n\r\n## Background\r\n\r\nI was developing my own version of offcputime.py that produces events for each long offcpu event including duration of the task stayed off-cpu.\r\nAfter getting some samples, I realized that in some cases duration (`u64 delta = bpf_ktime_get_ns() - *tsp`) is insanely large number and figured out that it is due to negative numbers printed as unsigned 64bit.\r\n\r\n## Reproducing the issue\r\n\r\nI thought there should be the same issue exists in `offcputime.py` and modified it as below:\r\n\r\n```diff\r\ndiff --git a/tools/offcputime.py b/tools/offcputime.py\r\nindex 068c7076..11d8a4d8 100755\r\n--- a/tools/offcputime.py\r\n+++ b/tools/offcputime.py\r\n@@ -146,7 +146,12 @@ int oncpu(struct pt_regs *ctx, struct task_struct *prev) {\r\n     }\r\n \r\n     // calculate current thread's delta time\r\n-    u64 delta = bpf_ktime_get_ns() - *tsp;\r\n+    u64 t_start = *tsp;\r\n+    u64 t_end = bpf_ktime_get_ns();\r\n+    if (t_start &gt; t_end) {\r\n+        bpf_trace_printk(\"Clock regression!: %u &gt; %u\\n\", t_start, t_end);\r\n+    }\r\n+    u64 delta = t_end - t_start;\r\n     start.delete(&amp;pid);\r\n     delta = delta / 1000;\r\n     if ((delta &lt; MINBLOCK_US) || (delta &gt; MAXBLOCK_US)) {\r\n@@ -246,6 +251,7 @@ if not folded:\r\n     else:\r\n         print(\"... Hit Ctrl-C to end.\")\r\n \r\n+b.trace_print()\r\n try:\r\n     sleep(duration)\r\n except KeyboardInterrupt:\r\n```\r\n\r\nAs I executed the modified version on my system, I could confirm that there are some events with negative delta (the time stored in `start` &gt; current time).\r\n\r\n```\r\n$ ~/offcputime.py -m 100000 3\r\nTracing off-CPU time (us) of all threads by user + kernel stack for 3 secs.\r\n           &lt;...&gt;-123820 [000] d... 3548318.327993: : Clock regression!: 59599178 &gt; 59567229\r\n           &lt;...&gt;-76871 [000] d... 3548330.825545: : Clock regression!: 3968610353 &gt; 3967622873\r\n           &lt;...&gt;-123810 [000] d... 3548353.203783: : Clock regression!: 577745979 &gt; 576818764\r\n          &lt;idle&gt;-0     [002] d... 3548378.357934: : Clock regression!: 4257954648 &gt; 4256982417\r\n          &lt;idle&gt;-0     [003] d... 3548404.022071: : Clock regression!: 4153185458 &gt; 4152188905\r\n```\r\n\r\n## Cause\r\n\r\nI think this is caused by regressing return value from `bpf_ktime_get_ns()`, which calls `ktime_get_mono_fast_ns`. The document of `ktime_get_mono_fast_ns` actually [states it isn't guaranteed to always return monotonic value](https://github.com/torvalds/linux/blob/65f0d2414b7079556fbbcc070b3d1c9f9587606d/kernel/time/timekeeping.c#L456).\r\n\r\n## Proposed fix\r\n\r\nJust filter out cases where the end time is larger than the start time. I assume such cases happen only when the actual duration between last off-cpu and on-cpu is short, so I think it's better than accidentally counting them in.\r\n</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbCommentBody</name><value>[buildbot, test this please]</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbGhRepository</name><value>iovisor/bcc</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbCredentialsId</name><value>6d3daf13-69b8-48b1-9c8f-ec5353264113</value></parameter></action><action _class='hudson.plugins.git.GitTagAction'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><description>&lt;a title="tools/offcputime Filter out negative offcpu duration" href="https://github.com/iovisor/bcc/pull/3227"&gt;PR #3227&lt;/a&gt;: tools/offcputime Filter out...</description><displayName>#807</displayName><duration>1236058</duration><estimatedDuration>7460664</estimatedDuration><fullDisplayName>bcc-pr #807</fullDisplayName><id>807</id><keepLog>false</keepLog><number>807</number><queueId>6465</queueId><result>SUCCESS</result><timestamp>1610696608662</timestamp><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/807/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><kind>git</kind></changeSet><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=fc25/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=fc26/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=fc27/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=fc28/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=ubuntu1604/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=ubuntu1710/807/</url></run><run><number>807</number><url>https://buildbot.iovisor.org/jenkins/job/bcc-pr/label=ubuntu1804/807/</url></run></matrixBuild>