diff options
| -rw-r--r-- | kernel/events/core.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 10d076b2572c..072b8a686517 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -4740,12 +4740,20 @@ static const struct file_operations perf_fops = { | |||
| 4740 | * to user-space before waking everybody up. | 4740 | * to user-space before waking everybody up. |
| 4741 | */ | 4741 | */ |
| 4742 | 4742 | ||
| 4743 | static inline struct fasync_struct **perf_event_fasync(struct perf_event *event) | ||
| 4744 | { | ||
| 4745 | /* only the parent has fasync state */ | ||
| 4746 | if (event->parent) | ||
| 4747 | event = event->parent; | ||
| 4748 | return &event->fasync; | ||
| 4749 | } | ||
| 4750 | |||
| 4743 | void perf_event_wakeup(struct perf_event *event) | 4751 | void perf_event_wakeup(struct perf_event *event) |
| 4744 | { | 4752 | { |
| 4745 | ring_buffer_wakeup(event); | 4753 | ring_buffer_wakeup(event); |
| 4746 | 4754 | ||
| 4747 | if (event->pending_kill) { | 4755 | if (event->pending_kill) { |
| 4748 | kill_fasync(&event->fasync, SIGIO, event->pending_kill); | 4756 | kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill); |
| 4749 | event->pending_kill = 0; | 4757 | event->pending_kill = 0; |
| 4750 | } | 4758 | } |
| 4751 | } | 4759 | } |
| @@ -6124,7 +6132,7 @@ static int __perf_event_overflow(struct perf_event *event, | |||
| 6124 | else | 6132 | else |
| 6125 | perf_event_output(event, data, regs); | 6133 | perf_event_output(event, data, regs); |
| 6126 | 6134 | ||
| 6127 | if (event->fasync && event->pending_kill) { | 6135 | if (*perf_event_fasync(event) && event->pending_kill) { |
| 6128 | event->pending_wakeup = 1; | 6136 | event->pending_wakeup = 1; |
| 6129 | irq_work_queue(&event->pending); | 6137 | irq_work_queue(&event->pending); |
| 6130 | } | 6138 | } |
