Re: is printk() safe within a timekeeper_seq write section?

From: Peter Zijlstra
Date: Wed Mar 12 2014 - 05:18:54 EST


On Thu, Mar 06, 2014 at 06:45:31PM +0100, Jiri Bohac wrote:
> Hi,
>
> I'm looking at the printk call in
> __timekeeping_inject_sleeptime(), introduced in cb5de2f8
> (time: Catch invalid timespec sleep values in __timekeeping_inject_sleeptime)
>
> Is it safe to call printk() while timekeeper_seq is held for
> writing?
>
> What about this call chain?
> printk
> vprintk_emit
> console_unlock
> up(&console_sem)
> __up
> wake_up_process
> try_to_wake_up
> ttwu_do_activate
> ttwu_activate
> activate_task
> enqueue_task
> enqueue_task_fair
> hrtick_update
> hrtick_start_fair
> hrtick_start_fair
> get_time
> ktime_get
> --> endless loop on
> read_seqcount_retry(&timekeeper_seq, ...)
>
>
> It looks like an unlikely but possible deadlock.
> Or did I overlook something?

So HRTICK is disabled by default; but yes this is a problem when you
enable it.

The problem is that our timers are in an entirely different clock base
than our (scheduler) clocks.

On SNB+ hardware with TSC deadline timers we have the same clockbase I
suppose but I'm not sure that's something we can (and want) to rely on.

Now, I've long had the idea to mess up the hrtimer code to optimize this
particular timer, but I'm not entirely sure we can get around having to
use the timerkeeper_seq thing, we simply have to get into timer clock
space :/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/