return n * sizeof(u64);
 }
 
+static bool is_event_hup(struct perf_event *event)
+{
+       bool no_children;
+
+       if (event->state != PERF_EVENT_STATE_EXIT)
+               return false;
+
+       mutex_lock(&event->child_mutex);
+       no_children = list_empty(&event->child_list);
+       mutex_unlock(&event->child_mutex);
+       return no_children;
+}
+
 /*
  * Read the performance event - simple non blocking version for now
  */
 
        poll_wait(file, &event->waitq, wait);
 
-       if (event->state == PERF_EVENT_STATE_EXIT)
+       if (is_event_hup(event))
                return events;
 
        /*
        list_del_init(&child_event->child_list);
        mutex_unlock(&parent_event->child_mutex);
 
+       /*
+        * Make sure user/parent get notified, that we just
+        * lost one event.
+        */
+       perf_event_wakeup(parent_event);
+
        /*
         * Release the parent event, if this was the last
         * reference to it.