Skip to content

Commit bff1b20

Browse files
committed
tracing: Partial revert of "tracing: Centralize preemptirq tracepoints and unify their usage"
Joel Fernandes created a nice patch that cleaned up the duplicate hooks used by lockdep and irqsoff latency tracer. It made both use tracepoints. But it caused lockdep to trigger several false positives. We have not figured out why yet, but removing lockdep from using the trace event hooks and just call its helper functions directly (like it use to), makes the problem go away. This is a partial revert of the clean up patch c3bc8fd ("tracing: Centralize preemptirq tracepoints and unify their usage") that adds direct calls for lockdep, but also keeps most of the clean up done to get rid of the horrible preprocessor if statements. Link: http://lkml.kernel.org/r/[email protected] Cc: Peter Zijlstra <[email protected]> Reviewed-by: Joel Fernandes (Google) <[email protected]> Fixes: c3bc8fd ("tracing: Centralize preemptirq tracepoints and unify their usage") Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent da5b3eb commit bff1b20

File tree

5 files changed

+28
-34
lines changed

5 files changed

+28
-34
lines changed

include/linux/irqflags.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@
1919
#ifdef CONFIG_PROVE_LOCKING
2020
extern void trace_softirqs_on(unsigned long ip);
2121
extern void trace_softirqs_off(unsigned long ip);
22+
extern void lockdep_hardirqs_on(unsigned long ip);
23+
extern void lockdep_hardirqs_off(unsigned long ip);
2224
#else
23-
# define trace_softirqs_on(ip) do { } while (0)
24-
# define trace_softirqs_off(ip) do { } while (0)
25+
static inline void trace_softirqs_on(unsigned long ip) { }
26+
static inline void trace_softirqs_off(unsigned long ip) { }
27+
static inline void lockdep_hardirqs_on(unsigned long ip) { }
28+
static inline void lockdep_hardirqs_off(unsigned long ip) { }
2529
#endif
2630

2731
#ifdef CONFIG_TRACE_IRQFLAGS

include/linux/lockdep.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,6 @@ struct held_lock {
267267
* Initialization, self-test and debugging-output methods:
268268
*/
269269
extern void lockdep_init(void);
270-
extern void lockdep_init_early(void);
271270
extern void lockdep_reset(void);
272271
extern void lockdep_reset_lock(struct lockdep_map *lock);
273272
extern void lockdep_free_key_range(void *start, unsigned long size);
@@ -408,7 +407,6 @@ static inline void lockdep_on(void)
408407
# define lock_set_class(l, n, k, s, i) do { } while (0)
409408
# define lock_set_subclass(l, s, i) do { } while (0)
410409
# define lockdep_init() do { } while (0)
411-
# define lockdep_init_early() do { } while (0)
412410
# define lockdep_init_map(lock, name, key, sub) \
413411
do { (void)(name); (void)(key); } while (0)
414412
# define lockdep_set_class(lock, key) do { (void)(key); } while (0)

init/main.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,6 @@ asmlinkage __visible void __init start_kernel(void)
649649
call_function_init();
650650
WARN(!irqs_disabled(), "Interrupts were enabled early\n");
651651

652-
lockdep_init_early();
653-
654652
early_boot_irqs_disabled = false;
655653
local_irq_enable();
656654

kernel/locking/lockdep.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,8 +2840,7 @@ static void __trace_hardirqs_on_caller(unsigned long ip)
28402840
debug_atomic_inc(hardirqs_on_events);
28412841
}
28422842

2843-
static void lockdep_hardirqs_on(void *none, unsigned long ignore,
2844-
unsigned long ip)
2843+
void lockdep_hardirqs_on(unsigned long ip)
28452844
{
28462845
if (unlikely(!debug_locks || current->lockdep_recursion))
28472846
return;
@@ -2885,8 +2884,7 @@ static void lockdep_hardirqs_on(void *none, unsigned long ignore,
28852884
/*
28862885
* Hardirqs were disabled:
28872886
*/
2888-
static void lockdep_hardirqs_off(void *none, unsigned long ignore,
2889-
unsigned long ip)
2887+
void lockdep_hardirqs_off(unsigned long ip)
28902888
{
28912889
struct task_struct *curr = current;
28922890

@@ -4315,14 +4313,6 @@ void lockdep_reset_lock(struct lockdep_map *lock)
43154313
raw_local_irq_restore(flags);
43164314
}
43174315

4318-
void __init lockdep_init_early(void)
4319-
{
4320-
#ifdef CONFIG_PROVE_LOCKING
4321-
register_trace_prio_irq_disable(lockdep_hardirqs_off, NULL, INT_MAX);
4322-
register_trace_prio_irq_enable(lockdep_hardirqs_on, NULL, INT_MIN);
4323-
#endif
4324-
}
4325-
43264316
void __init lockdep_init(void)
43274317
{
43284318
printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n");

kernel/trace/trace_preemptirq.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,45 @@ static DEFINE_PER_CPU(int, tracing_irq_cpu);
1919

2020
void trace_hardirqs_on(void)
2121
{
22-
if (!this_cpu_read(tracing_irq_cpu))
23-
return;
22+
if (this_cpu_read(tracing_irq_cpu)) {
23+
trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
24+
this_cpu_write(tracing_irq_cpu, 0);
25+
}
2426

25-
trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
26-
this_cpu_write(tracing_irq_cpu, 0);
27+
lockdep_hardirqs_on(CALLER_ADDR0);
2728
}
2829
EXPORT_SYMBOL(trace_hardirqs_on);
2930

3031
void trace_hardirqs_off(void)
3132
{
32-
if (this_cpu_read(tracing_irq_cpu))
33-
return;
33+
if (!this_cpu_read(tracing_irq_cpu)) {
34+
this_cpu_write(tracing_irq_cpu, 1);
35+
trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
36+
}
3437

35-
this_cpu_write(tracing_irq_cpu, 1);
36-
trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
38+
lockdep_hardirqs_off(CALLER_ADDR0);
3739
}
3840
EXPORT_SYMBOL(trace_hardirqs_off);
3941

4042
__visible void trace_hardirqs_on_caller(unsigned long caller_addr)
4143
{
42-
if (!this_cpu_read(tracing_irq_cpu))
43-
return;
44+
if (this_cpu_read(tracing_irq_cpu)) {
45+
trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
46+
this_cpu_write(tracing_irq_cpu, 0);
47+
}
4448

45-
trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
46-
this_cpu_write(tracing_irq_cpu, 0);
49+
lockdep_hardirqs_on(CALLER_ADDR0);
4750
}
4851
EXPORT_SYMBOL(trace_hardirqs_on_caller);
4952

5053
__visible void trace_hardirqs_off_caller(unsigned long caller_addr)
5154
{
52-
if (this_cpu_read(tracing_irq_cpu))
53-
return;
55+
if (!this_cpu_read(tracing_irq_cpu)) {
56+
this_cpu_write(tracing_irq_cpu, 1);
57+
trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
58+
}
5459

55-
this_cpu_write(tracing_irq_cpu, 1);
56-
trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
60+
lockdep_hardirqs_off(CALLER_ADDR0);
5761
}
5862
EXPORT_SYMBOL(trace_hardirqs_off_caller);
5963
#endif /* CONFIG_TRACE_IRQFLAGS */

0 commit comments

Comments
 (0)