aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2009-04-03 10:43:48 -0400
committerIngo Molnar <mingo@elte.hu>2009-04-07 07:36:31 -0400
commit0f4814065ff8c24ca8bfd75c9b73502be152c287 (patch)
treef3816ecb64ee198235d2e9c1649de3241c3f2ac2
parentee811517a5604aa63fae803b7c044712699e1303 (diff)
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>
-rw-r--r--arch/x86/include/asm/ptrace.h9
-rw-r--r--arch/x86/kernel/ptrace.c20
-rw-r--r--include/linux/ptrace.h10
-rw-r--r--include/linux/sched.h2
-rw-r--r--kernel/fork.c4
-rw-r--r--kernel/ptrace.c10
6 files changed, 7 insertions, 48 deletions
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index e304b66abeea..5cdd19f20b5b 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -235,12 +235,11 @@ extern int do_get_thread_area(struct task_struct *p, int idx,
235extern int do_set_thread_area(struct task_struct *p, int idx, 235extern int do_set_thread_area(struct task_struct *p, int idx,
236 struct user_desc __user *info, int can_allocate); 236 struct user_desc __user *info, int can_allocate);
237 237
238extern void x86_ptrace_untrace(struct task_struct *); 238#ifdef CONFIG_X86_PTRACE_BTS
239extern void x86_ptrace_fork(struct task_struct *child, 239extern void ptrace_bts_untrace(struct task_struct *tsk);
240 unsigned long clone_flags);
241 240
242#define arch_ptrace_untrace(tsk) x86_ptrace_untrace(tsk) 241#define arch_ptrace_untrace(tsk) ptrace_bts_untrace(tsk)
243#define arch_ptrace_fork(child, flags) x86_ptrace_fork(child, flags) 242#endif /* CONFIG_X86_PTRACE_BTS */
244 243
245#endif /* __KERNEL__ */ 244#endif /* __KERNEL__ */
246 245
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index adbb24322d8f..b32a8ee53381 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -887,37 +887,19 @@ static int ptrace_bts_size(struct task_struct *child)
887 return (trace->ds.top - trace->ds.begin) / trace->ds.size; 887 return (trace->ds.top - trace->ds.begin) / trace->ds.size;
888} 888}
889 889
890static inline void ptrace_bts_fork(struct task_struct *tsk)
891{
892 tsk->bts = NULL;
893}
894
895/* 890/*
896 * Called from __ptrace_unlink() after the child has been moved back 891 * Called from __ptrace_unlink() after the child has been moved back
897 * to its original parent. 892 * to its original parent.
898 */ 893 */
899static inline void ptrace_bts_untrace(struct task_struct *child) 894void ptrace_bts_untrace(struct task_struct *child)
900{ 895{
901 if (unlikely(child->bts)) { 896 if (unlikely(child->bts)) {
902 free_bts_context(child->bts); 897 free_bts_context(child->bts);
903 child->bts = NULL; 898 child->bts = NULL;
904 } 899 }
905} 900}
906#else
907static inline void ptrace_bts_fork(struct task_struct *tsk) {}
908static inline void ptrace_bts_untrace(struct task_struct *child) {}
909#endif /* CONFIG_X86_PTRACE_BTS */ 901#endif /* CONFIG_X86_PTRACE_BTS */
910 902
911void x86_ptrace_fork(struct task_struct *child, unsigned long clone_flags)
912{
913 ptrace_bts_fork(child);
914}
915
916void x86_ptrace_untrace(struct task_struct *child)
917{
918 ptrace_bts_untrace(child);
919}
920
921/* 903/*
922 * Called by kernel/ptrace.c when detaching.. 904 * Called by kernel/ptrace.c when detaching..
923 * 905 *
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 67c15653fc23..59e133d39d50 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -95,7 +95,6 @@ extern void __ptrace_link(struct task_struct *child,
95 struct task_struct *new_parent); 95 struct task_struct *new_parent);
96extern void __ptrace_unlink(struct task_struct *child); 96extern void __ptrace_unlink(struct task_struct *child);
97extern void exit_ptrace(struct task_struct *tracer); 97extern void exit_ptrace(struct task_struct *tracer);
98extern void ptrace_fork(struct task_struct *task, unsigned long clone_flags);
99#define PTRACE_MODE_READ 1 98#define PTRACE_MODE_READ 1
100#define PTRACE_MODE_ATTACH 2 99#define PTRACE_MODE_ATTACH 2
101/* Returns 0 on success, -errno on denial. */ 100/* Returns 0 on success, -errno on denial. */
@@ -327,15 +326,6 @@ static inline void user_enable_block_step(struct task_struct *task)
327#define arch_ptrace_untrace(task) do { } while (0) 326#define arch_ptrace_untrace(task) do { } while (0)
328#endif 327#endif
329 328
330#ifndef arch_ptrace_fork
331/*
332 * Do machine-specific work to initialize a new task.
333 *
334 * This is called from copy_process().
335 */
336#define arch_ptrace_fork(child, clone_flags) do { } while (0)
337#endif
338
339extern int task_current_syscall(struct task_struct *target, long *callno, 329extern int task_current_syscall(struct task_struct *target, long *callno,
340 unsigned long args[6], unsigned int maxargs, 330 unsigned long args[6], unsigned int maxargs,
341 unsigned long *sp, unsigned long *pc); 331 unsigned long *sp, unsigned long *pc);
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 52b8cd049c2e..451186a22ef5 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1205,13 +1205,11 @@ struct task_struct {
1205 struct list_head ptraced; 1205 struct list_head ptraced;
1206 struct list_head ptrace_entry; 1206 struct list_head ptrace_entry;
1207 1207
1208#ifdef CONFIG_X86_PTRACE_BTS
1209 /* 1208 /*
1210 * This is the tracer handle for the ptrace BTS extension. 1209 * This is the tracer handle for the ptrace BTS extension.
1211 * This field actually belongs to the ptracer task. 1210 * This field actually belongs to the ptracer task.
1212 */ 1211 */
1213 struct bts_context *bts; 1212 struct bts_context *bts;
1214#endif /* CONFIG_X86_PTRACE_BTS */
1215 1213
1216 /* PID/PID hash table linkage. */ 1214 /* PID/PID hash table linkage. */
1217 struct pid_link pids[PIDTYPE_MAX]; 1215 struct pid_link pids[PIDTYPE_MAX];
diff --git a/kernel/fork.c b/kernel/fork.c
index 660c2b8765bc..69bde7a22e9b 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1086,8 +1086,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1086#ifdef CONFIG_DEBUG_MUTEXES 1086#ifdef CONFIG_DEBUG_MUTEXES
1087 p->blocked_on = NULL; /* not blocked yet */ 1087 p->blocked_on = NULL; /* not blocked yet */
1088#endif 1088#endif
1089 if (unlikely(current->ptrace)) 1089
1090 ptrace_fork(p, clone_flags); 1090 p->bts = NULL;
1091 1091
1092 /* Perform scheduler related setup. Assign this task to a CPU. */ 1092 /* Perform scheduler related setup. Assign this task to a CPU. */
1093 sched_fork(p, clone_flags); 1093 sched_fork(p, clone_flags);
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index aaad0ec34194..321127d965c2 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -27,16 +27,6 @@
27 27
28 28
29/* 29/*
30 * Initialize a new task whose father had been ptraced.
31 *
32 * Called from copy_process().
33 */
34void ptrace_fork(struct task_struct *child, unsigned long clone_flags)
35{
36 arch_ptrace_fork(child, clone_flags);
37}
38
39/*
40 * ptrace a task: make the debugger its new parent and 30 * ptrace a task: make the debugger its new parent and
41 * move it to the ptrace list. 31 * move it to the ptrace list.
42 * 32 *