• Yang Jihong's avatar
    perf record: Fix continue profiling after draining the buffer · e16c2ce7
    Yang Jihong authored
    Commit da231338 ("perf record: Use an eventfd to wakeup when
    done") uses eventfd() to solve a rare race where the setting and
    checking of 'done' which add done_fd to pollfd.  When draining buffer,
    revents of done_fd is 0 and evlist__filter_pollfd function returns a
    non-zero value.  As a result, perf record does not stop profiling.
    
    The following simple scenarios can trigger this condition:
    
      # sleep 10 &
      # perf record -p $!
    
    After the sleep process exits, perf record should stop profiling and exit.
    However, perf record keeps running.
    
    If pollfd revents contains only POLLERR or POLLHUP, perf record
    indicates that buffer is draining and need to stop profiling.  Use
    fdarray_flag__nonfilterable() to set done eventfd to nonfilterable
    objects, so that evlist__filter_pollfd() does not filter and check done
    eventfd.
    
    Fixes: da231338 ("perf record: Use an eventfd to wakeup when done")
    Signed-off-by: default avatarYang Jihong <yangjihong1@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: default avatarJiri Olsa <jolsa@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: zhangjinhao2@huawei.com
    Link: http://lore.kernel.org/lkml/20210205065001.23252-1-yangjihong1@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    e16c2ce7
evlist.c 47 KB