perf: Fix racy access to cpu_buf->block
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 Jun 2016 21:31:57 +0000 (17:31 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jun 2016 16:20:31 +0000 (12:20 -0400)
commitda9e4d0e2cdc877faeb46ebef6b60fcfe779cf77
tree8be4739ae2a641347caa8d1fbb5ff4cd85f919b3
parent2590f4f818f64a59ec286c6264fa11193a027b24
perf: Fix racy access to cpu_buf->block

Each core has a block that it flushes to the global queue on command.
However, that is per-cpu state that is accessed from perfmon IRQs.  Thus
any unsafe access, such as writing the block to the global queue, should
be protected from concurrent access.  In this case, disabling IRQs is
necessary.

The bug showed up as a queue with an incorrect length.  The sum of the
BLENs did not add up to qlen (q->dlen, btw).  The last block on the list
was appended to *while* it was on the queue.  This happened due to an
IRQ right after writing to the queue, but before we cleared
cpu_buf->block.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/profiler.c