Hi Ming,

This patch seems to be against the old LTTng 0.x kernel patchset,
which has been unmaintained for a while now. LTTng 2.x does not need
those patches.

Thanks,

Mathieu

----- Original Message -----
> From: "Ming Liu" <[email protected]>
> To: [email protected]
> Sent: Monday, December 16, 2013 1:23:46 AM
> Subject: [lttng-dev] [PATCH] x86-trace-clock/preempt_rt: move async_tsc_lock  
> out of atomic condition
> 
> The following call trace is observed in preempt_rt:
> ------
> BUG: sleeping function called from invalid context at
> /opt/platforms/atom_prj/build/linux/kernel/rtmutex.c:707
> pcnt: 0 0 in_atomic(): 0, irqs_disabled(): 1, pid: 5928, name: kstop/1
> Pid: 5928, comm: kstop/1 Tainted: P           2.6.38.6-rt_preempt_rt #1
> Call Trace:
> [<c102d101>] __might_sleep+0xe1/0x100
> [<c15a6cb7>] rt_spin_lock+0x27/0x70
> [<c159e4e7>] hotcpu_callback+0x13/0x102
> [<c1060155>] notifier_call_chain+0x35/0x70
> [<c106023a>] raw_notifier_call_chain+0x1a/0x20
> [<c15969ff>] take_cpu_down+0x2f/0x60
> [<c107ef25>] stop_cpu+0x95/0xd0
> [<c1056550>] worker_thread+0x110/0x230
> [<c15a4f9b>] ? __schedule+0x22b/0x6c0
> [<c106ccd2>] ? rt_mutex_adjust_prio+0x32/0x50
> [<c107ee90>] ? stop_cpu+0x0/0xd0
> [<c105aa30>] ? autoremove_wake_function+0x0/0x40
> [<c1056440>] ? worker_thread+0x0/0x230
> [<c105a71c>] kthread+0x6c/0x80
> [<c105a6b0>] ? kthread+0x0/0x80
> [<c1003336>] kernel_thread_helper+0x6/0x30
> CPU 1 is now offline
> ------
> 
> To track it as follows:
> ------
> stop_cpu()
>   local_irq_disable()
>   take_cpu_down()
>     raw_notifier_call_chain() <-- CPU_DYING
>           |
>           + hotcpu_callback()
>             {
>                 spin_lock(&async_tsc_lock);
>                 ......
>                 spin_unlock(&async_tsc_lock);
>             }
> ------
> 
> Since spin_lock is actually rt_spin_lock under preempt_rt, a call trace
> will be issued when it's trying to hold async_tsc_lock when interrupts
> are disabled.
> 
> The fix is to move async_tsc_lock into switch cases, allow the CPU_DYING
> handling fall through without holding the spin lock.
> 
> Signed-off-by: Ming Liu <[email protected]>
> ---
>  arch/x86/kernel/trace-clock.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/kernel/trace-clock.c b/arch/x86/kernel/trace-clock.c
> index 47539e2..a7a51ce 100644
> --- a/arch/x86/kernel/trace-clock.c
> +++ b/arch/x86/kernel/trace-clock.c
> @@ -145,7 +145,6 @@ static int __cpuinit hotcpu_callback(struct
> notifier_block *nb,
>       unsigned int hotcpu = (unsigned long)hcpu;
>       int cpu;
>  
> -     spin_lock(&async_tsc_lock);
>       switch (action) {
>       case CPU_UP_PREPARE:
>       case CPU_UP_PREPARE_FROZEN:
> @@ -159,6 +158,7 @@ static int __cpuinit hotcpu_callback(struct
> notifier_block *nb,
>                * the CPU_ONLINE notification. It's just there to give a
>                * maximum bound to the TSC error.
>                */
> +             spin_lock(&async_tsc_lock);
>               if (async_tsc_refcount && !trace_clock_is_sync()) {
>                       if (!async_tsc_enabled) {
>                               async_tsc_enabled = 1;
> @@ -168,12 +168,15 @@ static int __cpuinit hotcpu_callback(struct
> notifier_block *nb,
>                               enable_trace_clock(hotcpu);
>                       }
>               }
> +             spin_unlock(&async_tsc_lock);
>               break;
>  #ifdef CONFIG_HOTPLUG_CPU
>       case CPU_UP_CANCELED:
>       case CPU_UP_CANCELED_FROZEN:
> +             spin_lock(&async_tsc_lock);
>               if (!async_tsc_refcount && num_online_cpus() == 1)
>                       set_trace_clock_is_sync(1);
> +             spin_unlock(&async_tsc_lock);
>               break;
>       case CPU_DEAD:
>       case CPU_DEAD_FROZEN:
> @@ -182,14 +185,15 @@ static int __cpuinit hotcpu_callback(struct
> notifier_block *nb,
>                * active even if we go back to a synchronized state (1 CPU)
>                * because the CPU left could be the one lagging behind.
>                */
> +             spin_lock(&async_tsc_lock);
>               if (async_tsc_refcount && async_tsc_enabled)
>                       disable_trace_clock(hotcpu);
>               if (!async_tsc_refcount && num_online_cpus() == 1)
>                       set_trace_clock_is_sync(1);
> +             spin_unlock(&async_tsc_lock);
>               break;
>  #endif /* CONFIG_HOTPLUG_CPU */
>       }
> -     spin_unlock(&async_tsc_lock);
>  
>       return NOTIFY_OK;
>  }
> --
> 1.8.4.1
> 
> 
> _______________________________________________
> lttng-dev mailing list
> [email protected]
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to