aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index f88bd984df35..b0ec34abc0bb 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -86,6 +86,7 @@ int max_threads; /* tunable limit on nr_threads */
86DEFINE_PER_CPU(unsigned long, process_counts) = 0; 86DEFINE_PER_CPU(unsigned long, process_counts) = 0;
87 87
88__cacheline_aligned DEFINE_RWLOCK(tasklist_lock); /* outer */ 88__cacheline_aligned DEFINE_RWLOCK(tasklist_lock); /* outer */
89EXPORT_SYMBOL_GPL(tasklist_lock);
89 90
90int nr_processes(void) 91int nr_processes(void)
91{ 92{
@@ -328,15 +329,17 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
328 if (!tmp) 329 if (!tmp)
329 goto fail_nomem; 330 goto fail_nomem;
330 *tmp = *mpnt; 331 *tmp = *mpnt;
332 INIT_LIST_HEAD(&tmp->anon_vma_chain);
331 pol = mpol_dup(vma_policy(mpnt)); 333 pol = mpol_dup(vma_policy(mpnt));
332 retval = PTR_ERR(pol); 334 retval = PTR_ERR(pol);
333 if (IS_ERR(pol)) 335 if (IS_ERR(pol))
334 goto fail_nomem_policy; 336 goto fail_nomem_policy;
335 vma_set_policy(tmp, pol); 337 vma_set_policy(tmp, pol);
338 if (anon_vma_fork(tmp, mpnt))
339 goto fail_nomem_anon_vma_fork;
336 tmp->vm_flags &= ~VM_LOCKED; 340 tmp->vm_flags &= ~VM_LOCKED;
337 tmp->vm_mm = mm; 341 tmp->vm_mm = mm;
338 tmp->vm_next = NULL; 342 tmp->vm_next = NULL;
339 anon_vma_link(tmp);
340 file = tmp->vm_file; 343 file = tmp->vm_file;
341 if (file) { 344 if (file) {
342 struct inode *inode = file->f_path.dentry->d_inode; 345 struct inode *inode = file->f_path.dentry->d_inode;
@@ -391,6 +394,8 @@ out:
391 flush_tlb_mm(oldmm); 394 flush_tlb_mm(oldmm);
392 up_write(&oldmm->mmap_sem); 395 up_write(&oldmm->mmap_sem);
393 return retval; 396 return retval;
397fail_nomem_anon_vma_fork:
398 mpol_put(pol);
394fail_nomem_policy: 399fail_nomem_policy:
395 kmem_cache_free(vm_area_cachep, tmp); 400 kmem_cache_free(vm_area_cachep, tmp);
396fail_nomem: 401fail_nomem:
@@ -454,8 +459,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p)
454 (current->mm->flags & MMF_INIT_MASK) : default_dump_filter; 459 (current->mm->flags & MMF_INIT_MASK) : default_dump_filter;
455 mm->core_state = NULL; 460 mm->core_state = NULL;
456 mm->nr_ptes = 0; 461 mm->nr_ptes = 0;
457 set_mm_counter(mm, file_rss, 0); 462 memset(&mm->rss_stat, 0, sizeof(mm->rss_stat));
458 set_mm_counter(mm, anon_rss, 0);
459 spin_lock_init(&mm->page_table_lock); 463 spin_lock_init(&mm->page_table_lock);
460 mm->free_area_cache = TASK_UNMAPPED_BASE; 464 mm->free_area_cache = TASK_UNMAPPED_BASE;
461 mm->cached_hole_size = ~0UL; 465 mm->cached_hole_size = ~0UL;
@@ -824,6 +828,8 @@ void __cleanup_sighand(struct sighand_struct *sighand)
824 */ 828 */
825static void posix_cpu_timers_init_group(struct signal_struct *sig) 829static void posix_cpu_timers_init_group(struct signal_struct *sig)
826{ 830{
831 unsigned long cpu_limit;
832
827 /* Thread group counters. */ 833 /* Thread group counters. */
828 thread_group_cputime_init(sig); 834 thread_group_cputime_init(sig);
829 835
@@ -838,9 +844,9 @@ static void posix_cpu_timers_init_group(struct signal_struct *sig)
838 sig->cputime_expires.virt_exp = cputime_zero; 844 sig->cputime_expires.virt_exp = cputime_zero;
839 sig->cputime_expires.sched_exp = 0; 845 sig->cputime_expires.sched_exp = 0;
840 846
841 if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) { 847 cpu_limit = ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur);
842 sig->cputime_expires.prof_exp = 848 if (cpu_limit != RLIM_INFINITY) {
843 secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur); 849 sig->cputime_expires.prof_exp = secs_to_cputime(cpu_limit);
844 sig->cputimer.running = 1; 850 sig->cputimer.running = 1;
845 } 851 }
846 852
@@ -1033,7 +1039,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1033#endif 1039#endif
1034 retval = -EAGAIN; 1040 retval = -EAGAIN;
1035 if (atomic_read(&p->real_cred->user->processes) >= 1041 if (atomic_read(&p->real_cred->user->processes) >=
1036 p->signal->rlim[RLIMIT_NPROC].rlim_cur) { 1042 task_rlimit(p, RLIMIT_NPROC)) {
1037 if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) && 1043 if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
1038 p->real_cred->user != INIT_USER) 1044 p->real_cred->user != INIT_USER)
1039 goto bad_fork_free; 1045 goto bad_fork_free;