Skip to content

Commit 84b0738

Browse files
antonblanchardozbenh
authored andcommitted
powerpc/pseries: Duplicate dtl entries sometimes sent to userspace
When reading from the dispatch trace log (dtl) userspace interface, I sometimes see duplicate entries. One example: # hexdump -C dtl.out 00000000 07 04 00 0c 00 00 48 44 00 00 00 00 00 00 00 00 00000010 00 0c a0 b4 16 83 6d 68 00 00 00 00 00 00 00 00 00000020 00 00 00 00 10 00 13 50 80 00 00 00 00 00 d0 32 00000030 07 04 00 0c 00 00 48 44 00 00 00 00 00 00 00 00 00000040 00 0c a0 b4 16 83 6d 68 00 00 00 00 00 00 00 00 00000050 00 00 00 00 10 00 13 50 80 00 00 00 00 00 d0 32 The problem is in scan_dispatch_log() where we call dtl_consumer() but bail out before incrementing the index. To fix this I moved dtl_consumer() after the timebase comparison. Signed-off-by: Anton Blanchard <anton@samba.org> Cc: stable@vger.kernel.org Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
1 parent 9db8bcf commit 84b0738

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/powerpc/kernel/time.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,6 @@ static u64 scan_dispatch_log(u64 stop_tb)
213213
if (i == be64_to_cpu(vpa->dtl_idx))
214214
return 0;
215215
while (i < be64_to_cpu(vpa->dtl_idx)) {
216-
if (dtl_consumer)
217-
dtl_consumer(dtl, i);
218216
dtb = be64_to_cpu(dtl->timebase);
219217
tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) +
220218
be32_to_cpu(dtl->ready_to_enqueue_time);
@@ -227,6 +225,8 @@ static u64 scan_dispatch_log(u64 stop_tb)
227225
}
228226
if (dtb > stop_tb)
229227
break;
228+
if (dtl_consumer)
229+
dtl_consumer(dtl, i);
230230
stolen += tb_delta;
231231
++i;
232232
++dtl;

0 commit comments

Comments
 (0)