diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 33 | 
1 files changed, 21 insertions, 12 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index b9e2edd0072..4430eb1376f 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -61,8 +61,8 @@  #include <linux/proc_fs.h>  #include <linux/blkdev.h>  #include <linux/fs_struct.h> -#include <trace/sched.h>  #include <linux/magic.h> +#include <linux/perf_counter.h>  #include <asm/pgtable.h>  #include <asm/pgalloc.h> @@ -71,6 +71,8 @@  #include <asm/cacheflush.h>  #include <asm/tlbflush.h> +#include <trace/events/sched.h> +  /*   * Protected counters by write_lock_irq(&tasklist_lock)   */ @@ -83,8 +85,6 @@ DEFINE_PER_CPU(unsigned long, process_counts) = 0;  __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */ -DEFINE_TRACE(sched_process_fork); -  int nr_processes(void)  {  	int cpu; @@ -982,6 +982,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	if (!p)  		goto fork_out; +	ftrace_graph_init_task(p); +  	rt_mutex_init_task(p);  #ifdef CONFIG_PROVE_LOCKING @@ -1089,12 +1091,16 @@ static struct task_struct *copy_process(unsigned long clone_flags,  #ifdef CONFIG_DEBUG_MUTEXES  	p->blocked_on = NULL; /* not blocked yet */  #endif -	if (unlikely(current->ptrace)) -		ptrace_fork(p, clone_flags); + +	p->bts = NULL;  	/* Perform scheduler related setup. Assign this task to a CPU. */  	sched_fork(p, clone_flags); +	retval = perf_counter_init_task(p); +	if (retval) +		goto bad_fork_cleanup_policy; +  	if ((retval = audit_alloc(p)))  		goto bad_fork_cleanup_policy;  	/* copy all the process information */ @@ -1131,8 +1137,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,  		}  	} -	ftrace_graph_init_task(p); -  	p->pid = pid_nr(pid);  	p->tgid = p->pid;  	if (clone_flags & CLONE_THREAD) @@ -1141,7 +1145,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	if (current->nsproxy != p->nsproxy) {  		retval = ns_cgroup_clone(p, pid);  		if (retval) -			goto bad_fork_free_graph; +			goto bad_fork_free_pid;  	}  	p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; @@ -1233,7 +1237,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  		spin_unlock(¤t->sighand->siglock);  		write_unlock_irq(&tasklist_lock);  		retval = -ERESTARTNOINTR; -		goto bad_fork_free_graph; +		goto bad_fork_free_pid;  	}  	if (clone_flags & CLONE_THREAD) { @@ -1268,8 +1272,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	cgroup_post_fork(p);  	return p; -bad_fork_free_graph: -	ftrace_graph_exit_task(p);  bad_fork_free_pid:  	if (pid != &init_struct_pid)  		free_pid(pid); @@ -1293,6 +1295,7 @@ bad_fork_cleanup_semundo:  bad_fork_cleanup_audit:  	audit_free(p);  bad_fork_cleanup_policy: +	perf_counter_free_task(p);  #ifdef CONFIG_NUMA  	mpol_put(p->mempolicy);  bad_fork_cleanup_cgroup: @@ -1406,10 +1409,16 @@ long do_fork(unsigned long clone_flags,  		if (clone_flags & CLONE_VFORK) {  			p->vfork_done = &vfork;  			init_completion(&vfork); +		} else if (!(clone_flags & CLONE_VM)) { +			/* +			 * vfork will do an exec which will call +			 * set_task_comm() +			 */ +			perf_counter_fork(p);  		}  		audit_finish_fork(p); -		tracehook_report_clone(trace, regs, clone_flags, nr, p); +		tracehook_report_clone(regs, clone_flags, nr, p);  		/*  		 * We set PF_STARTING at creation in case tracing wants to  |