x86, ptrace: add bts context unconditionally
Add the ptrace bts context field to task_struct unconditionally. Initialize the field directly in copy_process(). Remove all the unneeded functionality used to initialize that field. Signed-off-by: Markus Metzger <markus.t.metzger@intel.com> Cc: roland@redhat.com Cc: eranian@googlemail.com Cc: oleg@redhat.com Cc: juan.villacis@intel.com Cc: ak@linux.jf.intel.com LKML-Reference: <20090403144603.292754000@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									ee811517a5
								
							
						
					
					
						commit
						0f4814065f
					
				| @ -235,12 +235,11 @@ extern int do_get_thread_area(struct task_struct *p, int idx, | ||||
| extern int do_set_thread_area(struct task_struct *p, int idx, | ||||
| 			      struct user_desc __user *info, int can_allocate); | ||||
| 
 | ||||
| extern void x86_ptrace_untrace(struct task_struct *); | ||||
| extern void x86_ptrace_fork(struct task_struct *child, | ||||
| 			    unsigned long clone_flags); | ||||
| #ifdef CONFIG_X86_PTRACE_BTS | ||||
| extern void ptrace_bts_untrace(struct task_struct *tsk); | ||||
| 
 | ||||
| #define arch_ptrace_untrace(tsk) x86_ptrace_untrace(tsk) | ||||
| #define arch_ptrace_fork(child, flags) x86_ptrace_fork(child, flags) | ||||
| #define arch_ptrace_untrace(tsk)	ptrace_bts_untrace(tsk) | ||||
| #endif /* CONFIG_X86_PTRACE_BTS */ | ||||
| 
 | ||||
| #endif /* __KERNEL__ */ | ||||
| 
 | ||||
|  | ||||
| @ -887,37 +887,19 @@ static int ptrace_bts_size(struct task_struct *child) | ||||
| 	return (trace->ds.top - trace->ds.begin) / trace->ds.size; | ||||
| } | ||||
| 
 | ||||
| static inline void ptrace_bts_fork(struct task_struct *tsk) | ||||
| { | ||||
| 	tsk->bts = NULL; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Called from __ptrace_unlink() after the child has been moved back | ||||
|  * to its original parent. | ||||
|  */ | ||||
| static inline void ptrace_bts_untrace(struct task_struct *child) | ||||
| void ptrace_bts_untrace(struct task_struct *child) | ||||
| { | ||||
| 	if (unlikely(child->bts)) { | ||||
| 		free_bts_context(child->bts); | ||||
| 		child->bts = NULL; | ||||
| 	} | ||||
| } | ||||
| #else | ||||
| static inline void ptrace_bts_fork(struct task_struct *tsk) {} | ||||
| static inline void ptrace_bts_untrace(struct task_struct *child) {} | ||||
| #endif /* CONFIG_X86_PTRACE_BTS */ | ||||
| 
 | ||||
| void x86_ptrace_fork(struct task_struct *child, unsigned long clone_flags) | ||||
| { | ||||
| 	ptrace_bts_fork(child); | ||||
| } | ||||
| 
 | ||||
| void x86_ptrace_untrace(struct task_struct *child) | ||||
| { | ||||
| 	ptrace_bts_untrace(child); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Called by kernel/ptrace.c when detaching.. | ||||
|  * | ||||
|  | ||||
| @ -95,7 +95,6 @@ extern void __ptrace_link(struct task_struct *child, | ||||
| 			  struct task_struct *new_parent); | ||||
| extern void __ptrace_unlink(struct task_struct *child); | ||||
| extern void exit_ptrace(struct task_struct *tracer); | ||||
| extern void ptrace_fork(struct task_struct *task, unsigned long clone_flags); | ||||
| #define PTRACE_MODE_READ   1 | ||||
| #define PTRACE_MODE_ATTACH 2 | ||||
| /* Returns 0 on success, -errno on denial. */ | ||||
| @ -327,15 +326,6 @@ static inline void user_enable_block_step(struct task_struct *task) | ||||
| #define arch_ptrace_untrace(task)		do { } while (0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef arch_ptrace_fork | ||||
| /*
 | ||||
|  * Do machine-specific work to initialize a new task. | ||||
|  * | ||||
|  * This is called from copy_process(). | ||||
|  */ | ||||
| #define arch_ptrace_fork(child, clone_flags)	do { } while (0) | ||||
| #endif | ||||
| 
 | ||||
| extern int task_current_syscall(struct task_struct *target, long *callno, | ||||
| 				unsigned long args[6], unsigned int maxargs, | ||||
| 				unsigned long *sp, unsigned long *pc); | ||||
|  | ||||
| @ -1205,13 +1205,11 @@ struct task_struct { | ||||
| 	struct list_head ptraced; | ||||
| 	struct list_head ptrace_entry; | ||||
| 
 | ||||
| #ifdef CONFIG_X86_PTRACE_BTS | ||||
| 	/*
 | ||||
| 	 * This is the tracer handle for the ptrace BTS extension. | ||||
| 	 * This field actually belongs to the ptracer task. | ||||
| 	 */ | ||||
| 	struct bts_context *bts; | ||||
| #endif /* CONFIG_X86_PTRACE_BTS */ | ||||
| 
 | ||||
| 	/* PID/PID hash table linkage. */ | ||||
| 	struct pid_link pids[PIDTYPE_MAX]; | ||||
|  | ||||
| @ -1086,8 +1086,8 @@ 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); | ||||
|  | ||||
| @ -26,16 +26,6 @@ | ||||
| #include <asm/uaccess.h> | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Initialize a new task whose father had been ptraced. | ||||
|  * | ||||
|  * Called from copy_process(). | ||||
|  */ | ||||
| void ptrace_fork(struct task_struct *child, unsigned long clone_flags) | ||||
| { | ||||
| 	arch_ptrace_fork(child, clone_flags); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * ptrace a task: make the debugger its new parent and | ||||
|  * move it to the ptrace list. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user