Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 121288
b: refs/heads/master
c: cc1dc6d
h: refs/heads/master
v: v3
  • Loading branch information
Markus Metzger authored and Ingo Molnar committed Dec 16, 2008
1 parent ed86499 commit 462d10e
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 97 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: d680fe44775ed17a80035462d9898f5e77bfd7dd
refs/heads/master: cc1dc6d039ced64c2f8b8457bf1cccf4ecfc5942
29 changes: 1 addition & 28 deletions trunk/arch/x86/include/asm/ftrace.h
Original file line number Diff line number Diff line change
@@ -1,33 +1,6 @@
#ifndef _ASM_X86_FTRACE_H
#define _ASM_X86_FTRACE_H

#ifdef __ASSEMBLY__

.macro MCOUNT_SAVE_FRAME
/* taken from glibc */
subq $0x38, %rsp
movq %rax, (%rsp)
movq %rcx, 8(%rsp)
movq %rdx, 16(%rsp)
movq %rsi, 24(%rsp)
movq %rdi, 32(%rsp)
movq %r8, 40(%rsp)
movq %r9, 48(%rsp)
.endm

.macro MCOUNT_RESTORE_FRAME
movq 48(%rsp), %r9
movq 40(%rsp), %r8
movq 32(%rsp), %rdi
movq 24(%rsp), %rsi
movq 16(%rsp), %rdx
movq 8(%rsp), %rcx
movq (%rsp), %rax
addq $0x38, %rsp
.endm

#endif

#ifdef CONFIG_FUNCTION_TRACER
#define MCOUNT_ADDR ((long)(mcount))
#define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */
Expand Down Expand Up @@ -73,7 +46,7 @@ struct ftrace_ret_stack {
/*
* Primary handler of a function return.
* It relays on ftrace_return_to_handler.
* Defined in entry_32/64.S
* Defined in entry32.S
*/
extern void return_to_handler(void);

Expand Down
58 changes: 25 additions & 33 deletions trunk/arch/x86/kernel/ds.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,53 +232,45 @@ static DEFINE_PER_CPU(struct ds_context *, system_context_array);

#define system_context per_cpu(system_context_array, smp_processor_id())

static struct ds_context *ds_get_context(struct task_struct *task)

static inline struct ds_context *ds_get_context(struct task_struct *task)
{
struct ds_context **p_context =
(task ? &task->thread.ds_ctx : &system_context);
struct ds_context *context = *p_context;
struct ds_context *context = NULL;
struct ds_context *new_context = NULL;
unsigned long irq;

if (!context) {
context = kzalloc(sizeof(*context), GFP_KERNEL);
if (!context)
return NULL;

spin_lock_irqsave(&ds_lock, irq);

if (*p_context) {
kfree(context);
/* Chances are small that we already have a context. */
new_context = kzalloc(sizeof(*new_context), GFP_KERNEL);
if (!new_context)
return NULL;

context = *p_context;
} else {
*p_context = context;
spin_lock_irqsave(&ds_lock, irq);

context->this = p_context;
context->task = task;
context = *p_context;
if (!context) {
context = new_context;

if (task)
set_tsk_thread_flag(task, TIF_DS_AREA_MSR);
context->this = p_context;
context->task = task;
context->count = 0;

if (!task || (task == current))
wrmsrl(MSR_IA32_DS_AREA,
(unsigned long)context->ds);
}
if (task)
set_tsk_thread_flag(task, TIF_DS_AREA_MSR);

context->count++;
if (!task || (task == current))
wrmsrl(MSR_IA32_DS_AREA, (unsigned long)context->ds);

spin_unlock_irqrestore(&ds_lock, irq);
} else {
spin_lock_irqsave(&ds_lock, irq);
*p_context = context;
}

context = *p_context;
if (context)
context->count++;
context->count++;

spin_unlock_irqrestore(&ds_lock, irq);
spin_unlock_irqrestore(&ds_lock, irq);

if (!context)
context = ds_get_context(task);
}
if (context != new_context)
kfree(new_context);

return context;
}
Expand Down
57 changes: 50 additions & 7 deletions trunk/arch/x86/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,15 @@ ENTRY(ftrace_caller)
cmpl $0, function_trace_stop
jne ftrace_stub

MCOUNT_SAVE_FRAME
/* taken from glibc */
subq $0x38, %rsp
movq %rax, (%rsp)
movq %rcx, 8(%rsp)
movq %rdx, 16(%rsp)
movq %rsi, 24(%rsp)
movq %rdi, 32(%rsp)
movq %r8, 40(%rsp)
movq %r9, 48(%rsp)

movq 0x38(%rsp), %rdi
movq 8(%rbp), %rsi
Expand All @@ -81,7 +89,14 @@ ENTRY(ftrace_caller)
ftrace_call:
call ftrace_stub

MCOUNT_RESTORE_FRAME
movq 48(%rsp), %r9
movq 40(%rsp), %r8
movq 32(%rsp), %rdi
movq 24(%rsp), %rsi
movq 16(%rsp), %rdx
movq 8(%rsp), %rcx
movq (%rsp), %rax
addq $0x38, %rsp

#ifdef CONFIG_FUNCTION_GRAPH_TRACER
.globl ftrace_graph_call
Expand Down Expand Up @@ -115,15 +130,30 @@ ftrace_stub:
retq

trace:
MCOUNT_SAVE_FRAME
/* taken from glibc */
subq $0x38, %rsp
movq %rax, (%rsp)
movq %rcx, 8(%rsp)
movq %rdx, 16(%rsp)
movq %rsi, 24(%rsp)
movq %rdi, 32(%rsp)
movq %r8, 40(%rsp)
movq %r9, 48(%rsp)

movq 0x38(%rsp), %rdi
movq 8(%rbp), %rsi
subq $MCOUNT_INSN_SIZE, %rdi

call *ftrace_trace_function

MCOUNT_RESTORE_FRAME
movq 48(%rsp), %r9
movq 40(%rsp), %r8
movq 32(%rsp), %rdi
movq 24(%rsp), %rsi
movq 16(%rsp), %rdx
movq 8(%rsp), %rcx
movq (%rsp), %rax
addq $0x38, %rsp

jmp ftrace_stub
END(mcount)
Expand All @@ -135,16 +165,29 @@ ENTRY(ftrace_graph_caller)
cmpl $0, function_trace_stop
jne ftrace_stub

MCOUNT_SAVE_FRAME
subq $0x38, %rsp
movq %rax, (%rsp)
movq %rcx, 8(%rsp)
movq %rdx, 16(%rsp)
movq %rsi, 24(%rsp)
movq %rdi, 32(%rsp)
movq %r8, 40(%rsp)
movq %r9, 48(%rsp)

leaq 8(%rbp), %rdi
movq 0x38(%rsp), %rsi
subq $MCOUNT_INSN_SIZE, %rsi

call prepare_ftrace_return

MCOUNT_RESTORE_FRAME

movq 48(%rsp), %r9
movq 40(%rsp), %r8
movq 32(%rsp), %rdi
movq 24(%rsp), %rsi
movq 16(%rsp), %rdx
movq 8(%rsp), %rcx
movq (%rsp), %rax
addq $0x38, %rsp
retq
END(ftrace_graph_caller)

Expand Down
2 changes: 1 addition & 1 deletion trunk/kernel/trace/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ u64 ring_buffer_time_stamp(int cpu)
preempt_disable_notrace();
/* shift to debug/test normalization and TIME_EXTENTS */
time = sched_clock() << DEBUG_SHIFT;
preempt_enable_no_resched_notrace();
preempt_enable_notrace();

return time;
}
Expand Down
25 changes: 0 additions & 25 deletions trunk/kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,6 @@ static const char *trace_options[] = {
"annotate",
"userstacktrace",
"sym-userobj",
"printk-msg-only",
NULL
};

Expand Down Expand Up @@ -2266,25 +2265,6 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)
return TRACE_TYPE_HANDLED;
}

static enum print_line_t print_printk_msg_only(struct trace_iterator *iter)
{
struct trace_seq *s = &iter->seq;
struct trace_entry *entry = iter->ent;
struct print_entry *field;
int ret;

trace_assign_type(field, entry);

ret = trace_seq_printf(s, field->buf);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

if (entry->flags & TRACE_FLAG_CONT)
trace_seq_print_cont(s, iter);

return TRACE_TYPE_HANDLED;
}

static enum print_line_t print_bin_fmt(struct trace_iterator *iter)
{
struct trace_seq *s = &iter->seq;
Expand Down Expand Up @@ -2365,11 +2345,6 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
return ret;
}

if (iter->ent->type == TRACE_PRINT &&
trace_flags & TRACE_ITER_PRINTK &&
trace_flags & TRACE_ITER_PRINTK_MSGONLY)
return print_printk_msg_only(iter);

if (trace_flags & TRACE_ITER_BIN)
return print_bin_fmt(iter);

Expand Down
3 changes: 1 addition & 2 deletions trunk/kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,7 @@ enum trace_iterator_flags {
TRACE_ITER_BRANCH = 0x1000,
TRACE_ITER_ANNOTATE = 0x2000,
TRACE_ITER_USERSTACKTRACE = 0x4000,
TRACE_ITER_SYM_USEROBJ = 0x8000,
TRACE_ITER_PRINTK_MSGONLY = 0x10000
TRACE_ITER_SYM_USEROBJ = 0x8000
};

/*
Expand Down

0 comments on commit 462d10e

Please sign in to comment.