diff options
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4a904623e05d..396fda034e3f 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1051,7 +1051,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip) | |||
1051 | * Need to use raw, since this must be called before the | 1051 | * Need to use raw, since this must be called before the |
1052 | * recursive protection is performed. | 1052 | * recursive protection is performed. |
1053 | */ | 1053 | */ |
1054 | raw_local_irq_save(flags); | 1054 | local_irq_save(flags); |
1055 | cpu = raw_smp_processor_id(); | 1055 | cpu = raw_smp_processor_id(); |
1056 | data = tr->data[cpu]; | 1056 | data = tr->data[cpu]; |
1057 | disabled = atomic_inc_return(&data->disabled); | 1057 | disabled = atomic_inc_return(&data->disabled); |
@@ -1062,7 +1062,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip) | |||
1062 | } | 1062 | } |
1063 | 1063 | ||
1064 | atomic_dec(&data->disabled); | 1064 | atomic_dec(&data->disabled); |
1065 | raw_local_irq_restore(flags); | 1065 | local_irq_restore(flags); |
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | #ifdef CONFIG_FUNCTION_RET_TRACER | 1068 | #ifdef CONFIG_FUNCTION_RET_TRACER |
@@ -2638,8 +2638,11 @@ static int tracing_set_tracer(char *buf) | |||
2638 | current_trace->reset(tr); | 2638 | current_trace->reset(tr); |
2639 | 2639 | ||
2640 | current_trace = t; | 2640 | current_trace = t; |
2641 | if (t->init) | 2641 | if (t->init) { |
2642 | t->init(tr); | 2642 | ret = t->init(tr); |
2643 | if (ret) | ||
2644 | goto out; | ||
2645 | } | ||
2643 | 2646 | ||
2644 | trace_branch_enable(tr); | 2647 | trace_branch_enable(tr); |
2645 | out: | 2648 | out: |
@@ -2655,6 +2658,9 @@ tracing_set_trace_write(struct file *filp, const char __user *ubuf, | |||
2655 | char buf[max_tracer_type_len+1]; | 2658 | char buf[max_tracer_type_len+1]; |
2656 | int i; | 2659 | int i; |
2657 | size_t ret; | 2660 | size_t ret; |
2661 | int err; | ||
2662 | |||
2663 | ret = cnt; | ||
2658 | 2664 | ||
2659 | if (cnt > max_tracer_type_len) | 2665 | if (cnt > max_tracer_type_len) |
2660 | cnt = max_tracer_type_len; | 2666 | cnt = max_tracer_type_len; |
@@ -2668,12 +2674,11 @@ tracing_set_trace_write(struct file *filp, const char __user *ubuf, | |||
2668 | for (i = cnt - 1; i > 0 && isspace(buf[i]); i--) | 2674 | for (i = cnt - 1; i > 0 && isspace(buf[i]); i--) |
2669 | buf[i] = 0; | 2675 | buf[i] = 0; |
2670 | 2676 | ||
2671 | ret = tracing_set_tracer(buf); | 2677 | err = tracing_set_tracer(buf); |
2672 | if (!ret) | 2678 | if (err) |
2673 | ret = cnt; | 2679 | return err; |
2674 | 2680 | ||
2675 | if (ret > 0) | 2681 | filp->f_pos += ret; |
2676 | filp->f_pos += ret; | ||
2677 | 2682 | ||
2678 | return ret; | 2683 | return ret; |
2679 | } | 2684 | } |