Re: [BUG] perf stat: hangs with -p and process completes

From: Jiri Olsa
Date: Tue Oct 16 2018 - 07:03:46 EST


On Fri, Oct 12, 2018 at 02:26:09PM -0700, Stephane Eranian wrote:
> Hi,
>
> I am running into a perf stat issue with the -p option which allows you
> to attach to a running process. If that process happens to terminate
> while under monitoring
> perf hangs in there and never terminates. The proper behavior would be to stop.
> I can see the issue in that the attached process is not a child, so
> wait() would not work.
>
> To reproduce:
> $ sleep 10 &
> $ perf stat -p $!
>
> doing the same with perf record works, so there is a solution to this problem.

yea, we don't poll for the event state change in perf stat,
but we do that in perf record.. also because the perf poll
code in kernel is originaly meant for tracking the ring
buffer state

maybe we could return EPOLLIN for alive events without ring
buffer.. like below (totaly untested) and add polling for
event state into perf stat

cc-ing perf folks

jirka


---
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 5a97f34bc14c..b9ee7e7803bf 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4865,12 +4865,12 @@ static __poll_t perf_poll(struct file *file, poll_table *wait)
{
struct perf_event *event = file->private_data;
struct ring_buffer *rb;
- __poll_t events = EPOLLHUP;
+ __poll_t events = EPOLLIN;

poll_wait(file, &event->waitq, wait);

if (is_event_hup(event))
- return events;
+ return EPOLLHUP;

/*
* Pin the event->rb by taking event->mmap_mutex; otherwise