diff options
| author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-03-16 00:32:41 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-03-16 09:13:18 +0100 | 
| commit | ac1d52d0b85854958c7e78c8006e39aadb6ce4b8 (patch) | |
| tree | fc50818980e376a66d44f991b94e8a52c03e68fc /kernel/trace/trace_selftest.c | |
| parent | 59f586db98919d7d9c43527b26c8de1cdf9ed912 (diff) | |
| download | olio-linux-3.10-ac1d52d0b85854958c7e78c8006e39aadb6ce4b8.tar.xz olio-linux-3.10-ac1d52d0b85854958c7e78c8006e39aadb6ce4b8.zip  | |
tracing/ftrace: fix double calls to tracing_start()
Impact: fix a warning during preemptirqsoff selftests
When the preemptirqsoff selftest fails, we see the following
warning:
[    6.050000] Testing tracer preemptirqsoff: .. no entries found ..
------------[ cut here ]------------
[    6.060000] WARNING: at kernel/trace/trace.c:688 tracing_start+0x67/0xd3()
[    6.060000] Modules linked in:
[    6.060000] Pid: 1, comm: swapper Tainted: G
[    6.060000] Call Trace:
[    6.060000]  [<ffffffff802460ff>] warn_slowpath+0xb1/0x100
[    6.060000]  [<ffffffff802a8f5b>] ? trace_preempt_on+0x35/0x4b
[    6.060000]  [<ffffffff802a37fb>] ? tracing_start+0x31/0xd3
[    6.060000]  [<ffffffff802a37fb>] ? tracing_start+0x31/0xd3
[    6.060000]  [<ffffffff80271e0b>] ? __lock_acquired+0xe6/0x1f2
[    6.060000]  [<ffffffff802a37fb>] ? tracing_start+0x31/0xd3
[    6.060000]  [<ffffffff802a3831>] tracing_start+0x67/0xd3
[    6.060000]  [<ffffffff802a8ace>] ? irqsoff_tracer_reset+0x2d/0x57
[    6.060000]  [<ffffffff802a4d1c>] trace_selftest_startup_preemptirqsoff+0x1c8/0x1f1
[    6.060000]  [<ffffffff802a4798>] register_tracer+0x12f/0x241
[    6.060000]  [<ffffffff810250d0>] ? init_irqsoff_tracer+0x0/0x53
[    6.060000]  [<ffffffff8102510b>] init_irqsoff_tracer+0x3b/0x53
This is because in fail case, the preemptirqsoff tracer selftest calls twice
the tracing_start() function:
int
trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *tr)
{
        if (!ret && !count) {
                printk(KERN_CONT ".. no entries found ..");
                ret = -1;
                tracing_start(); <-----
                goto out;
        }
        [...]
out:
        trace->reset(tr);
        tracing_start(); <------
        tracing_max_latency = save_max;
        return ret;
}
Since it is well handled in the out path, we don't need the conditional one.
Reported-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <1237159961-7447-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace_selftest.c')
| -rw-r--r-- | kernel/trace/trace_selftest.c | 16 | 
1 files changed, 6 insertions, 10 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index f907a2b2902..a2ca6f0fef9 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -414,7 +414,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *  	ret = tracer_init(trace, tr);  	if (ret) {  		warn_failed_init_tracer(trace, ret); -		goto out; +		goto out_no_start;  	}  	/* reset the max latency */ @@ -432,21 +432,16 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *  	tracing_stop();  	/* check both trace buffers */  	ret = trace_test_buffer(tr, NULL); -	if (ret) { -		tracing_start(); +	if (ret)  		goto out; -	}  	ret = trace_test_buffer(&max_tr, &count); -	if (ret) { -		tracing_start(); +	if (ret)  		goto out; -	}  	if (!ret && !count) {  		printk(KERN_CONT ".. no entries found ..");  		ret = -1; -		tracing_start();  		goto out;  	} @@ -475,9 +470,10 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *  		goto out;  	} - out: -	trace->reset(tr); +out:  	tracing_start(); +out_no_start: +	trace->reset(tr);  	tracing_max_latency = save_max;  	return ret;  |