summaryrefslogtreecommitdiff
path: root/kernel/taskstats.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-08-15 12:47:19 +0200
committerTakashi Iwai <tiwai@suse.de>2011-08-15 12:47:19 +0200
commit2d9f8a6e73ef2ec8ecaa24ca98e7010d6edd089f (patch)
tree9ea035b696137b345c69532a318f55502f530558 /kernel/taskstats.c
parentecf726f5414489fe749477eb77d6cb12bb93c8bc (diff)
parenteade7b281c9fc18401b989c77d5e5e660b25a3b7 (diff)
Merge branch 'fix/hda' into topic/hda
Diffstat (limited to 'kernel/taskstats.c')
-rw-r--r--kernel/taskstats.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index 9ffea360a778..e19ce1454ee1 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -28,7 +28,7 @@
#include <linux/fs.h>
#include <linux/file.h>
#include <net/genetlink.h>
-#include <asm/atomic.h>
+#include <linux/atomic.h>
/*
* Maximum length of a cpumask that can be specified in
@@ -285,7 +285,7 @@ ret:
static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd)
{
struct listener_list *listeners;
- struct listener *s, *tmp;
+ struct listener *s, *tmp, *s2;
unsigned int cpu;
if (!cpumask_subset(mask, cpu_possible_mask))
@@ -293,18 +293,25 @@ static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd)
if (isadd == REGISTER) {
for_each_cpu(cpu, mask) {
- s = kmalloc_node(sizeof(struct listener), GFP_KERNEL,
- cpu_to_node(cpu));
+ s = kmalloc_node(sizeof(struct listener),
+ GFP_KERNEL, cpu_to_node(cpu));
if (!s)
goto cleanup;
+
s->pid = pid;
- INIT_LIST_HEAD(&s->list);
s->valid = 1;
listeners = &per_cpu(listener_array, cpu);
down_write(&listeners->sem);
+ list_for_each_entry(s2, &listeners->list, list) {
+ if (s2->pid == pid && s2->valid)
+ goto exists;
+ }
list_add(&s->list, &listeners->list);
+ s = NULL;
+exists:
up_write(&listeners->sem);
+ kfree(s); /* nop if NULL */
}
return 0;
}