• Anand K Mistry's avatar
    perf record: Use an eventfd to wakeup when done · da231338
    Anand K Mistry authored
    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.
    
    Committer notes:
    
    Make this dependent on HAVE_EVENTFD_SUPPORT, so that we continue
    building on older systems without the eventfd syscall.
    Signed-off-by: default avatarAnand K Mistry <amistry@google.com>
    Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20200513122012.v3.1.I4d7421c6bbb1f83ea58419082481082e19097841@changeidSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    da231338
builtin-record.c 73.7 KB