diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-08-15 12:47:19 +0200 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-08-15 12:47:19 +0200 |
| commit | 2d9f8a6e73ef2ec8ecaa24ca98e7010d6edd089f (patch) | |
| tree | 9ea035b696137b345c69532a318f55502f530558 /kernel/taskstats.c | |
| parent | ecf726f5414489fe749477eb77d6cb12bb93c8bc (diff) | |
| parent | eade7b281c9fc18401b989c77d5e5e660b25a3b7 (diff) | |
Merge branch 'fix/hda' into topic/hda
Diffstat (limited to 'kernel/taskstats.c')
| -rw-r--r-- | kernel/taskstats.c | 17 |
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; } |
