Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 121304
b: refs/heads/master
c: bf53de9
h: refs/heads/master
v: v3
  • Loading branch information
Markus Metzger authored and Ingo Molnar committed Dec 20, 2008
1 parent bb4167b commit 521dac2
Show file tree
Hide file tree
Showing 25 changed files with 193 additions and 67 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 468a15bb4cc61694495cc5ed7ffca29e87c79b69
refs/heads/master: bf53de907dfdaac178c92d774aae7370d7b97d20
9 changes: 9 additions & 0 deletions trunk/arch/x86/include/asm/ds.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,12 +252,21 @@ extern void __cpuinit ds_init_intel(struct cpuinfo_x86 *);
*/
extern void ds_switch_to(struct task_struct *prev, struct task_struct *next);

/*
* Task clone/init and cleanup work
*/
extern void ds_copy_thread(struct task_struct *tsk, struct task_struct *father);
extern void ds_exit_thread(struct task_struct *tsk);

#else /* CONFIG_X86_DS */

struct cpuinfo_x86;
static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {}
static inline void ds_switch_to(struct task_struct *prev,
struct task_struct *next) {}
static inline void ds_copy_thread(struct task_struct *tsk,
struct task_struct *father) {}
static inline void ds_exit_thread(struct task_struct *tsk) {}

#endif /* CONFIG_X86_DS */
#endif /* _ASM_X86_DS_H */
3 changes: 1 addition & 2 deletions trunk/arch/x86/include/asm/msr.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@ static inline void native_write_msr(unsigned int msr,
asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high) : "memory");
}

/* Can be uninlined because referenced by paravirt */
notrace static inline int native_write_msr_safe(unsigned int msr,
static inline int native_write_msr_safe(unsigned int msr,
unsigned low, unsigned high)
{
int err;
Expand Down
7 changes: 7 additions & 0 deletions trunk/arch/x86/include/asm/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,13 @@ 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);

#define arch_ptrace_untrace(tsk) x86_ptrace_untrace(tsk)
#define arch_ptrace_fork(child, flags) x86_ptrace_fork(child, flags)

#endif /* __KERNEL__ */

#endif /* !__ASSEMBLY__ */
Expand Down
5 changes: 0 additions & 5 deletions trunk/arch/x86/kernel/cpu/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@
# Makefile for x86-compatible CPU details and quirks
#

# Don't trace early stages of a secondary CPU boot
ifdef CONFIG_FUNCTION_TRACER
CFLAGS_REMOVE_common.o = -pg
endif

obj-y := intel_cacheinfo.o addon_cpuid_features.o
obj-y += proc.o capflags.o powerflags.o common.o

Expand Down
11 changes: 11 additions & 0 deletions trunk/arch/x86/kernel/ds.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,3 +1017,14 @@ void ds_switch_to(struct task_struct *prev, struct task_struct *next)

update_debugctlmsr(next->thread.debugctlmsr);
}

void ds_copy_thread(struct task_struct *tsk, struct task_struct *father)
{
clear_tsk_thread_flag(tsk, TIF_DS_AREA_MSR);
tsk->thread.ds_ctx = NULL;
}

void ds_exit_thread(struct task_struct *tsk)
{
WARN_ON(tsk->thread.ds_ctx);
}
20 changes: 9 additions & 11 deletions trunk/arch/x86/kernel/process_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#include <asm/idle.h>
#include <asm/syscalls.h>
#include <asm/smp.h>
#include <asm/ds.h>

asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");

Expand Down Expand Up @@ -251,17 +252,8 @@ void exit_thread(void)
tss->x86_tss.io_bitmap_base = INVALID_IO_BITMAP_OFFSET;
put_cpu();
}
#ifdef CONFIG_X86_DS
/* Free any BTS tracers that have not been properly released. */
if (unlikely(current->bts)) {
ds_release_bts(current->bts);
current->bts = NULL;

kfree(current->bts_buffer);
current->bts_buffer = NULL;
current->bts_size = 0;
}
#endif /* CONFIG_X86_DS */

ds_exit_thread(current);
}

void flush_thread(void)
Expand Down Expand Up @@ -343,6 +335,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
kfree(p->thread.io_bitmap_ptr);
p->thread.io_bitmap_max = 0;
}

ds_copy_thread(p, current);

clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
p->thread.debugctlmsr = 0;

return err;
}

Expand Down
20 changes: 9 additions & 11 deletions trunk/arch/x86/kernel/process_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#include <asm/ia32.h>
#include <asm/idle.h>
#include <asm/syscalls.h>
#include <asm/ds.h>

asmlinkage extern void ret_from_fork(void);

Expand Down Expand Up @@ -236,17 +237,8 @@ void exit_thread(void)
t->io_bitmap_max = 0;
put_cpu();
}
#ifdef CONFIG_X86_DS
/* Free any BTS tracers that have not been properly released. */
if (unlikely(current->bts)) {
ds_release_bts(current->bts);
current->bts = NULL;

kfree(current->bts_buffer);
current->bts_buffer = NULL;
current->bts_size = 0;
}
#endif /* CONFIG_X86_DS */

ds_exit_thread(current);
}

void flush_thread(void)
Expand Down Expand Up @@ -376,6 +368,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
if (err)
goto out;
}

ds_copy_thread(p, me);

clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
p->thread.debugctlmsr = 0;

err = 0;
out:
if (err && p->thread.io_bitmap_ptr) {
Expand Down
50 changes: 40 additions & 10 deletions trunk/arch/x86/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,8 +769,47 @@ static int ptrace_bts_size(struct task_struct *child)

return (trace->ds.top - trace->ds.begin) / trace->ds.size;
}

static void ptrace_bts_fork(struct task_struct *tsk)
{
tsk->bts = NULL;
tsk->bts_buffer = NULL;
tsk->bts_size = 0;
tsk->thread.bts_ovfl_signal = 0;
}

static void ptrace_bts_untrace(struct task_struct *child)
{
if (unlikely(child->bts)) {
ds_release_bts(child->bts);
child->bts = NULL;

kfree(child->bts_buffer);
child->bts_buffer = NULL;
child->bts_size = 0;
}
}

static void ptrace_bts_detach(struct task_struct *child)
{
ptrace_bts_untrace(child);
}
#else
static inline void ptrace_bts_fork(struct task_struct *tsk) {}
static inline void ptrace_bts_detach(struct task_struct *child) {}
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..
*
Expand All @@ -782,16 +821,7 @@ void ptrace_disable(struct task_struct *child)
#ifdef TIF_SYSCALL_EMU
clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
#endif
#ifdef CONFIG_X86_PTRACE_BTS
if (child->bts) {
ds_release_bts(child->bts);
child->bts = NULL;

kfree(child->bts_buffer);
child->bts_buffer = NULL;
child->bts_size = 0;
}
#endif /* CONFIG_X86_PTRACE_BTS */
ptrace_bts_detach(child);
}

#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/smpboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ static int __cpuinitdata unsafe_smp;
/*
* Activate a secondary processor.
*/
notrace static void __cpuinit start_secondary(void *unused)
static void __cpuinit start_secondary(void *unused)
{
/*
* Don't put *anything* before cpu_init(), SMP booting is too
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ extern void ftrace_dump(void);
static inline void
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { }
static inline int
ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 0)));

static inline void tracing_start(void) { }
static inline void tracing_stop(void) { }
Expand Down
22 changes: 22 additions & 0 deletions trunk/include/linux/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ extern void ptrace_notify(int exit_code);
extern void __ptrace_link(struct task_struct *child,
struct task_struct *new_parent);
extern void __ptrace_unlink(struct task_struct *child);
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. */
Expand Down Expand Up @@ -313,6 +314,27 @@ static inline void user_enable_block_step(struct task_struct *task)
#define arch_ptrace_stop(code, info) do { } while (0)
#endif

#ifndef arch_ptrace_untrace
/*
* Do machine-specific work before untracing child.
*
* This is called for a normal detach as well as from ptrace_exit()
* when the tracing task dies.
*
* Called with write_lock(&tasklist_lock) held.
*/
#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);
Expand Down
4 changes: 2 additions & 2 deletions trunk/include/trace/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ DECLARE_TRACE(sched_wait_task,
TPARGS(rq, p));

DECLARE_TRACE(sched_wakeup,
TPPROTO(struct rq *rq, struct task_struct *p, int success),
TPARGS(rq, p, success));
TPPROTO(struct rq *rq, struct task_struct *p),
TPARGS(rq, p));

DECLARE_TRACE(sched_wakeup_new,
TPPROTO(struct rq *rq, struct task_struct *p, int success),
Expand Down
2 changes: 2 additions & 0 deletions trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,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(ptrace_reparented(current)))
ptrace_fork(p, clone_flags);

/* Perform scheduler related setup. Assign this task to a CPU. */
sched_fork(p, clone_flags);
Expand Down
12 changes: 12 additions & 0 deletions trunk/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,17 @@
#include <asm/pgtable.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
* move it to the ptrace list.
Expand Down Expand Up @@ -72,6 +83,7 @@ void __ptrace_unlink(struct task_struct *child)
child->parent = child->real_parent;
list_del_init(&child->ptrace_entry);

arch_ptrace_untrace(child);
if (task_is_traced(child))
ptrace_untrace(child);
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -2324,7 +2324,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)
success = 1;

out_running:
trace_sched_wakeup(rq, p, success);
trace_sched_wakeup(rq, p);
check_preempt_curr(rq, p, sync);

p->state = TASK_RUNNING;
Expand Down
10 changes: 0 additions & 10 deletions trunk/kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,16 +679,6 @@ void tracing_reset(struct trace_array *tr, int cpu)
ftrace_enable_cpu();
}

void tracing_reset_online_cpus(struct trace_array *tr)
{
int cpu;

tr->time_start = ftrace_now(tr->cpu);

for_each_online_cpu(cpu)
tracing_reset(tr, cpu);
}

#define SAVED_CMDLINES 128
static unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1];
static unsigned map_cmdline_to_pid[SAVED_CMDLINES];
Expand Down
1 change: 0 additions & 1 deletion trunk/kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,6 @@ struct trace_iterator {
int tracing_is_enabled(void);
void trace_wake_up(void);
void tracing_reset(struct trace_array *tr, int cpu);
void tracing_reset_online_cpus(struct trace_array *tr);
int tracing_open_generic(struct inode *inode, struct file *filp);
struct dentry *tracing_init_dentry(void);
void init_tracer_sysprof_debugfs(struct dentry *d_tracer);
Expand Down
12 changes: 11 additions & 1 deletion trunk/kernel/trace/trace_boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ void disable_boot_trace(void)
tracing_stop_sched_switch_record();
}

static void reset_boot_trace(struct trace_array *tr)
{
int cpu;

tr->time_start = ftrace_now(tr->cpu);

for_each_online_cpu(cpu)
tracing_reset(tr, cpu);
}

static int boot_trace_init(struct trace_array *tr)
{
int cpu;
Expand Down Expand Up @@ -120,7 +130,7 @@ struct tracer boot_tracer __read_mostly =
{
.name = "initcall",
.init = boot_trace_init,
.reset = tracing_reset_online_cpus,
.reset = reset_boot_trace,
.print_line = initcall_print_line,
};

Expand Down
Loading

0 comments on commit 521dac2

Please sign in to comment.