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,
|
extern int do_set_thread_area(struct task_struct *p, int idx,
|
||||||
struct user_desc __user *info, int can_allocate);
|
struct user_desc __user *info, int can_allocate);
|
||||||
|
|
||||||
extern void x86_ptrace_untrace(struct task_struct *);
|
#ifdef CONFIG_X86_PTRACE_BTS
|
||||||
extern void x86_ptrace_fork(struct task_struct *child,
|
extern void ptrace_bts_untrace(struct task_struct *tsk);
|
||||||
unsigned long clone_flags);
|
|
||||||
|
|
||||||
#define arch_ptrace_untrace(tsk) x86_ptrace_untrace(tsk)
|
#define arch_ptrace_untrace(tsk) ptrace_bts_untrace(tsk)
|
||||||
#define arch_ptrace_fork(child, flags) x86_ptrace_fork(child, flags)
|
#endif /* CONFIG_X86_PTRACE_BTS */
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#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;
|
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
|
* Called from __ptrace_unlink() after the child has been moved back
|
||||||
* to its original parent.
|
* 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)) {
|
if (unlikely(child->bts)) {
|
||||||
free_bts_context(child->bts);
|
free_bts_context(child->bts);
|
||||||
child->bts = NULL;
|
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 */
|
#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..
|
* Called by kernel/ptrace.c when detaching..
|
||||||
*
|
*
|
||||||
|
|
|
@ -95,7 +95,6 @@ extern void __ptrace_link(struct task_struct *child,
|
||||||
struct task_struct *new_parent);
|
struct task_struct *new_parent);
|
||||||
extern void __ptrace_unlink(struct task_struct *child);
|
extern void __ptrace_unlink(struct task_struct *child);
|
||||||
extern void exit_ptrace(struct task_struct *tracer);
|
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_READ 1
|
||||||
#define PTRACE_MODE_ATTACH 2
|
#define PTRACE_MODE_ATTACH 2
|
||||||
/* Returns 0 on success, -errno on denial. */
|
/* 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)
|
#define arch_ptrace_untrace(task) do { } while (0)
|
||||||
#endif
|
#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,
|
extern int task_current_syscall(struct task_struct *target, long *callno,
|
||||||
unsigned long args[6], unsigned int maxargs,
|
unsigned long args[6], unsigned int maxargs,
|
||||||
unsigned long *sp, unsigned long *pc);
|
unsigned long *sp, unsigned long *pc);
|
||||||
|
|
|
@ -1205,13 +1205,11 @@ struct task_struct {
|
||||||
struct list_head ptraced;
|
struct list_head ptraced;
|
||||||
struct list_head ptrace_entry;
|
struct list_head ptrace_entry;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_PTRACE_BTS
|
|
||||||
/*
|
/*
|
||||||
* This is the tracer handle for the ptrace BTS extension.
|
* This is the tracer handle for the ptrace BTS extension.
|
||||||
* This field actually belongs to the ptracer task.
|
* This field actually belongs to the ptracer task.
|
||||||
*/
|
*/
|
||||||
struct bts_context *bts;
|
struct bts_context *bts;
|
||||||
#endif /* CONFIG_X86_PTRACE_BTS */
|
|
||||||
|
|
||||||
/* PID/PID hash table linkage. */
|
/* PID/PID hash table linkage. */
|
||||||
struct pid_link pids[PIDTYPE_MAX];
|
struct pid_link pids[PIDTYPE_MAX];
|
||||||
|
|
|
@ -1086,8 +1086,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||||
#ifdef CONFIG_DEBUG_MUTEXES
|
#ifdef CONFIG_DEBUG_MUTEXES
|
||||||
p->blocked_on = NULL; /* not blocked yet */
|
p->blocked_on = NULL; /* not blocked yet */
|
||||||
#endif
|
#endif
|
||||||
if (unlikely(current->ptrace))
|
|
||||||
ptrace_fork(p, clone_flags);
|
p->bts = NULL;
|
||||||
|
|
||||||
/* Perform scheduler related setup. Assign this task to a CPU. */
|
/* Perform scheduler related setup. Assign this task to a CPU. */
|
||||||
sched_fork(p, clone_flags);
|
sched_fork(p, clone_flags);
|
||||||
|
|
|
@ -26,16 +26,6 @@
|
||||||
#include <asm/uaccess.h>
|
#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
|
* ptrace a task: make the debugger its new parent and
|
||||||
* move it to the ptrace list.
|
* move it to the ptrace list.
|
||||||
|
|
Loading…
Reference in New Issue