perfcounters: fix refcounting bug, take 2
authorPaul Mackerras <paulus@samba.org>
Wed, 11 Feb 2009 12:53:19 +0000 (13:53 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 11 Feb 2009 13:08:44 +0000 (14:08 +0100)
Only free child_counter if it has a parent; if it doesn't, then it
has a file pointing to it and we'll free it in perf_release.

Signed-off-by: Mike Galbraith <efault@gmx.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/perf_counter.c

index e0576c3..fcefb0a 100644 (file)
@@ -1958,14 +1958,13 @@ __perf_counter_exit_task(struct task_struct *child,
                sync_child_counter(child_counter, parent_counter);
                list_for_each_entry_safe(sub, tmp, &child_counter->sibling_list,
                                         list_entry) {
-                       if (sub->parent)
+                       if (sub->parent) {
                                sync_child_counter(sub, sub->parent);
-                       kfree(sub);
+                               kfree(sub);
+                       }
                }
-       }
-
-       if (!child_counter->filp || !atomic_long_read(&child_counter->filp->f_count))
                kfree(child_counter);
+       }
 }
 
 /*