Messages in this thread | | | Date | Wed, 13 May 2020 13:39:41 +0200 | From | Jiri Olsa <> | Subject | Re: [PATCH v3] perf record: Use an eventfd to wakeup when done |
| |
On Wed, May 13, 2020 at 12:20:23PM +1000, Anand K Mistry wrote: > The setting and checking of 'done' contains a rare race where the signal > handler setting 'done' is run after checking to break the loop, but > before waiting in evlist__poll(). In this case, the main loop won't wake > up until either another signal is sent, or the perf data fd causes a > wake up. > > The following simple script can trigger this condition (but you might > need to run it for several hours): > for ((i = 0; i >= 0; i++)) ; do > echo "Loop $i" > delay=$(echo "scale=4; 0.1 * $RANDOM/32768" | bc) > ./perf record -- sleep 30000000 >/dev/null& > pid=$! > sleep $delay > kill -TERM $pid > echo "PID $pid" > wait $pid > done > > At some point, the loop will stall. Adding logging, even though perf has > received the SIGTERM and set 'done = 1', perf will remain sleeping until > a second signal is sent. > > Signed-off-by: Anand K Mistry <amistry@google.com> > > --- > > Changes in v3: > - Move done_fd creation to below session initialisation > - Close done_fd on exit > - Log errno when write(done_fd) fails
Acked-by: Jiri Olsa <jolsa@redhat.com>
thanks, jirka
| |