|
@@ -4740,12 +4740,20 @@ static const struct file_operations perf_fops = {
|
|
|
* to user-space before waking everybody up.
|
|
|
*/
|
|
|
|
|
|
+static inline struct fasync_struct **perf_event_fasync(struct perf_event *event)
|
|
|
+{
|
|
|
+ /* only the parent has fasync state */
|
|
|
+ if (event->parent)
|
|
|
+ event = event->parent;
|
|
|
+ return &event->fasync;
|
|
|
+}
|
|
|
+
|
|
|
void perf_event_wakeup(struct perf_event *event)
|
|
|
{
|
|
|
ring_buffer_wakeup(event);
|
|
|
|
|
|
if (event->pending_kill) {
|
|
|
- kill_fasync(&event->fasync, SIGIO, event->pending_kill);
|
|
|
+ kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill);
|
|
|
event->pending_kill = 0;
|
|
|
}
|
|
|
}
|
|
@@ -6124,7 +6132,7 @@ static int __perf_event_overflow(struct perf_event *event,
|
|
|
else
|
|
|
perf_event_output(event, data, regs);
|
|
|
|
|
|
- if (event->fasync && event->pending_kill) {
|
|
|
+ if (*perf_event_fasync(event) && event->pending_kill) {
|
|
|
event->pending_wakeup = 1;
|
|
|
irq_work_queue(&event->pending);
|
|
|
}
|