diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 2 | ||||
| -rw-r--r-- | kernel/fork.c | 2 | ||||
| -rw-r--r-- | kernel/power/snapshot.c | 9 |
3 files changed, 7 insertions, 6 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 1a9787ac6173..f86434d7b3d1 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -56,7 +56,7 @@ static void __unhash_process(struct task_struct *p) | |||
| 56 | detach_pid(p, PIDTYPE_PGID); | 56 | detach_pid(p, PIDTYPE_PGID); |
| 57 | detach_pid(p, PIDTYPE_SID); | 57 | detach_pid(p, PIDTYPE_SID); |
| 58 | 58 | ||
| 59 | list_del_init(&p->tasks); | 59 | list_del_rcu(&p->tasks); |
| 60 | __get_cpu_var(process_counts)--; | 60 | __get_cpu_var(process_counts)--; |
| 61 | } | 61 | } |
| 62 | list_del_rcu(&p->thread_group); | 62 | list_del_rcu(&p->thread_group); |
diff --git a/kernel/fork.c b/kernel/fork.c index 54b15f8cda53..34515772611e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1204,7 +1204,7 @@ static task_t *copy_process(unsigned long clone_flags, | |||
| 1204 | attach_pid(p, PIDTYPE_PGID, process_group(p)); | 1204 | attach_pid(p, PIDTYPE_PGID, process_group(p)); |
| 1205 | attach_pid(p, PIDTYPE_SID, p->signal->session); | 1205 | attach_pid(p, PIDTYPE_SID, p->signal->session); |
| 1206 | 1206 | ||
| 1207 | list_add_tail(&p->tasks, &init_task.tasks); | 1207 | list_add_tail_rcu(&p->tasks, &init_task.tasks); |
| 1208 | __get_cpu_var(process_counts)++; | 1208 | __get_cpu_var(process_counts)++; |
| 1209 | } | 1209 | } |
| 1210 | attach_pid(p, PIDTYPE_PID, p->pid); | 1210 | attach_pid(p, PIDTYPE_PID, p->pid); |
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index c5863d02c89e..3eeedbb13b78 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -240,14 +240,15 @@ static void copy_data_pages(struct pbe *pblist) | |||
| 240 | * free_pagedir - free pages allocated with alloc_pagedir() | 240 | * free_pagedir - free pages allocated with alloc_pagedir() |
| 241 | */ | 241 | */ |
| 242 | 242 | ||
| 243 | static void free_pagedir(struct pbe *pblist) | 243 | static void free_pagedir(struct pbe *pblist, int clear_nosave_free) |
| 244 | { | 244 | { |
| 245 | struct pbe *pbe; | 245 | struct pbe *pbe; |
| 246 | 246 | ||
| 247 | while (pblist) { | 247 | while (pblist) { |
| 248 | pbe = (pblist + PB_PAGE_SKIP)->next; | 248 | pbe = (pblist + PB_PAGE_SKIP)->next; |
| 249 | ClearPageNosave(virt_to_page(pblist)); | 249 | ClearPageNosave(virt_to_page(pblist)); |
| 250 | ClearPageNosaveFree(virt_to_page(pblist)); | 250 | if (clear_nosave_free) |
| 251 | ClearPageNosaveFree(virt_to_page(pblist)); | ||
| 251 | free_page((unsigned long)pblist); | 252 | free_page((unsigned long)pblist); |
| 252 | pblist = pbe; | 253 | pblist = pbe; |
| 253 | } | 254 | } |
| @@ -389,7 +390,7 @@ struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask, int safe_needed | |||
| 389 | pbe->next = alloc_image_page(gfp_mask, safe_needed); | 390 | pbe->next = alloc_image_page(gfp_mask, safe_needed); |
| 390 | } | 391 | } |
| 391 | if (!pbe) { /* get_zeroed_page() failed */ | 392 | if (!pbe) { /* get_zeroed_page() failed */ |
| 392 | free_pagedir(pblist); | 393 | free_pagedir(pblist, 1); |
| 393 | pblist = NULL; | 394 | pblist = NULL; |
| 394 | } else | 395 | } else |
| 395 | create_pbe_list(pblist, nr_pages); | 396 | create_pbe_list(pblist, nr_pages); |
| @@ -736,7 +737,7 @@ static int create_image(struct snapshot_handle *handle) | |||
| 736 | pblist = alloc_pagedir(nr_copy_pages, GFP_ATOMIC, 1); | 737 | pblist = alloc_pagedir(nr_copy_pages, GFP_ATOMIC, 1); |
| 737 | if (pblist) | 738 | if (pblist) |
| 738 | copy_page_backup_list(pblist, p); | 739 | copy_page_backup_list(pblist, p); |
| 739 | free_pagedir(p); | 740 | free_pagedir(p, 0); |
| 740 | if (!pblist) | 741 | if (!pblist) |
| 741 | error = -ENOMEM; | 742 | error = -ENOMEM; |
| 742 | } | 743 | } |
