kgdb: Turn off tracing while in the debugger
authorJason Wessel <jason.wessel@windriver.com>
Fri, 2 Apr 2010 16:57:18 +0000 (11:57 -0500)
committerJason Wessel <jason.wessel@windriver.com>
Fri, 2 Apr 2010 19:58:19 +0000 (14:58 -0500)
The kernel debugger should turn off kernel tracing any time the
debugger is active and restore it on resume.

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Reviewed-by: Steven Rostedt <rostedt@goodmis.org>
kernel/kgdb.c

index 2f7f454..11f3515 100644 (file)
@@ -1365,6 +1365,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
        int sstep_tries = 100;
        int error = 0;
        int i, cpu;
        int sstep_tries = 100;
        int error = 0;
        int i, cpu;
+       int trace_on = 0;
 acquirelock:
        /*
         * Interrupts will be restored by the 'trap return' code, except when
 acquirelock:
        /*
         * Interrupts will be restored by the 'trap return' code, except when
@@ -1399,6 +1400,8 @@ return_normal:
                         */
                        if (arch_kgdb_ops.correct_hw_break)
                                arch_kgdb_ops.correct_hw_break();
                         */
                        if (arch_kgdb_ops.correct_hw_break)
                                arch_kgdb_ops.correct_hw_break();
+                       if (trace_on)
+                               tracing_on();
                        atomic_dec(&cpu_in_kgdb[cpu]);
                        touch_softlockup_watchdog_sync();
                        clocksource_touch_watchdog();
                        atomic_dec(&cpu_in_kgdb[cpu]);
                        touch_softlockup_watchdog_sync();
                        clocksource_touch_watchdog();
@@ -1474,6 +1477,9 @@ return_normal:
        kgdb_single_step = 0;
        kgdb_contthread = current;
        exception_level = 0;
        kgdb_single_step = 0;
        kgdb_contthread = current;
        exception_level = 0;
+       trace_on = tracing_is_on();
+       if (trace_on)
+               tracing_off();
 
        /* Talk to debugger with gdbserial protocol */
        error = gdb_serial_stub(ks);
 
        /* Talk to debugger with gdbserial protocol */
        error = gdb_serial_stub(ks);
@@ -1505,6 +1511,8 @@ kgdb_restore:
                else
                        kgdb_sstep_pid = 0;
        }
                else
                        kgdb_sstep_pid = 0;
        }
+       if (trace_on)
+               tracing_on();
        /* Free kgdb_active */
        atomic_set(&kgdb_active, -1);
        touch_softlockup_watchdog_sync();
        /* Free kgdb_active */
        atomic_set(&kgdb_active, -1);
        touch_softlockup_watchdog_sync();