diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 40 | 
1 files changed, 21 insertions, 19 deletions
| diff --git a/kernel/fork.c b/kernel/fork.c index da4a6a10d088..051f090d40c1 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -76,6 +76,9 @@  #include <trace/events/sched.h> +#define CREATE_TRACE_POINTS +#include <trace/events/task.h> +  /*   * Protected counters by write_lock_irq(&tasklist_lock)   */ @@ -870,6 +873,7 @@ static int copy_io(unsigned long clone_flags, struct task_struct *tsk)  {  #ifdef CONFIG_BLOCK  	struct io_context *ioc = current->io_context; +	struct io_context *new_ioc;  	if (!ioc)  		return 0; @@ -881,11 +885,12 @@ static int copy_io(unsigned long clone_flags, struct task_struct *tsk)  		if (unlikely(!tsk->io_context))  			return -ENOMEM;  	} else if (ioprio_valid(ioc->ioprio)) { -		tsk->io_context = alloc_io_context(GFP_KERNEL, -1); -		if (unlikely(!tsk->io_context)) +		new_ioc = get_task_io_context(tsk, GFP_KERNEL, NUMA_NO_NODE); +		if (unlikely(!new_ioc))  			return -ENOMEM; -		tsk->io_context->ioprio = ioc->ioprio; +		new_ioc->ioprio = ioc->ioprio; +		put_io_context(new_ioc, NULL);  	}  #endif  	return 0; @@ -972,7 +977,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)  	sched_autogroup_fork(sig);  #ifdef CONFIG_CGROUPS -	init_rwsem(&sig->threadgroup_fork_lock); +	init_rwsem(&sig->group_rwsem);  #endif  	sig->oom_adj = current->signal->oom_adj; @@ -992,7 +997,6 @@ static void copy_flags(unsigned long clone_flags, struct task_struct *p)  	new_flags |= PF_FORKNOEXEC;  	new_flags |= PF_STARTING;  	p->flags = new_flags; -	clear_freeze_flag(p);  }  SYSCALL_DEFINE1(set_tid_address, int __user *, tidptr) @@ -1023,8 +1027,8 @@ void mm_init_owner(struct mm_struct *mm, struct task_struct *p)   */  static void posix_cpu_timers_init(struct task_struct *tsk)  { -	tsk->cputime_expires.prof_exp = cputime_zero; -	tsk->cputime_expires.virt_exp = cputime_zero; +	tsk->cputime_expires.prof_exp = 0; +	tsk->cputime_expires.virt_exp = 0;  	tsk->cputime_expires.sched_exp = 0;  	INIT_LIST_HEAD(&tsk->cpu_timers[0]);  	INIT_LIST_HEAD(&tsk->cpu_timers[1]); @@ -1132,14 +1136,10 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	init_sigpending(&p->pending); -	p->utime = cputime_zero; -	p->stime = cputime_zero; -	p->gtime = cputime_zero; -	p->utimescaled = cputime_zero; -	p->stimescaled = cputime_zero; +	p->utime = p->stime = p->gtime = 0; +	p->utimescaled = p->stimescaled = 0;  #ifndef CONFIG_VIRT_CPU_ACCOUNTING -	p->prev_utime = cputime_zero; -	p->prev_stime = cputime_zero; +	p->prev_utime = p->prev_stime = 0;  #endif  #if defined(SPLIT_RSS_COUNTING)  	memset(&p->rss_stat, 0, sizeof(p->rss_stat)); @@ -1158,7 +1158,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	p->io_context = NULL;  	p->audit_context = NULL;  	if (clone_flags & CLONE_THREAD) -		threadgroup_fork_read_lock(current); +		threadgroup_change_begin(current);  	cgroup_fork(p);  #ifdef CONFIG_NUMA  	p->mempolicy = mpol_dup(p->mempolicy); @@ -1296,6 +1296,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	p->nr_dirtied = 0;  	p->nr_dirtied_pause = 128 >> (PAGE_SHIFT - 10); +	p->dirty_paused_when = 0;  	/*  	 * Ok, make it visible to the rest of the system. @@ -1373,8 +1374,11 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	proc_fork_connector(p);  	cgroup_post_fork(p);  	if (clone_flags & CLONE_THREAD) -		threadgroup_fork_read_unlock(current); +		threadgroup_change_end(current);  	perf_event_fork(p); + +	trace_task_newtask(p, clone_flags); +  	return p;  bad_fork_free_pid: @@ -1408,7 +1412,7 @@ bad_fork_cleanup_policy:  bad_fork_cleanup_cgroup:  #endif  	if (clone_flags & CLONE_THREAD) -		threadgroup_fork_read_unlock(current); +		threadgroup_change_end(current);  	cgroup_exit(p, cgroup_callbacks_done);  	delayacct_tsk_free(p);  	module_put(task_thread_info(p)->exec_domain->module); @@ -1523,8 +1527,6 @@ long do_fork(unsigned long clone_flags,  			init_completion(&vfork);  		} -		audit_finish_fork(p); -  		/*  		 * We set PF_STARTING at creation in case tracing wants to  		 * use this to distinguish a fully live task from one that | 
