From: Matt Cowell <matt.cowell@nsn.com>
To: ext Thomas Gleixner <tglx@linutronix.de>
Cc: "linux-rt-users@vger.kernel.org" <linux-rt-users@vger.kernel.org>
Subject: Re: [PATCH RT] rtmutex: fix deadlock in spin_trylock
Date: Wed, 06 Nov 2013 14:22:18 -0600 [thread overview]
Message-ID: <527AA4FA.2000208@nsn.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1311061832020.23353@ionos.tec.linutronix.de>
>> There is a deadlock condition with RT spin_locks that may use trylock in
>> hardirq context. The main user of this is get_next_timer_interrupt, which
>> will deadlock if an IRQ preempts a timer wheel modification.
>
> Errm. No.
Are you saying that spin_trylock will/should not be called from hardirq
context, or that it is not possible for spin_trylock to deadlock in the
situation I described? With PREEMPT_RT_FULL and NO_HZ_FULL on v3.10,
spin_trylock will definitely will be called from hardirq context. This
seems like a valid usage to me as well, as an optimization to prevent
disabling IRQs and preemption in code that holds the timer spinlock.
Even if this code did not cause a deadlock, is there a reason that
rt_mutex_slowtrylock is using raw_spin_lock instead of raw_spin_trylock?
I would think that we would want to ensure that any *trylock call
would return as fast as possible without spinning or blocking.
> The cpu is in thread context and therefor not idle.
>
> void tick_nohz_irq_exit(void)
> {
> if (!ts->inidle)
> return;
> ....
> }
>
> So you are papering over the real issue:
>
> Why is ts->inidle true, if the CPU is not in idle?
The code you cited is from pre-v3.10 (without NO_HZ_FULL changes). This
was changed in commit 5811d99 (nohz: Prepare to stop the tick on irq
exit). When ts->idle is false (as it was in my trace), this code now
calls tick_nohz_full_stop_tick(). This leads to the following trace:
do_raw_spin_lock
rt_spin_trylock
spin_do_trylock
get_next_timer_interrupt
tick_nohz_stop_sched_tick
tick_nohz_full_stop_tick
tick_nohz_irq_exit
irq_exit
I see two ways to fix this:
1) The way I did in the patch to ensure that spin_trylock never can spin
on any locks internally.
2) Converting the timer base lock to a raw_spinlock_t so that it
actually disables hardirqs in lock_timer_base(). I don't think this
would be a good idea though.
Thanks,
-Matt
next prev parent reply other threads:[~2013-11-06 20:22 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-30 15:53 [PATCH RT] rtmutex: fix deadlock in spin_trylock Cowell, Matt (NSN - US/Arlington Heights)
2013-11-06 17:39 ` Thomas Gleixner
2013-11-06 20:22 ` Matt Cowell [this message]
2013-11-16 13:12 ` Sebastian Andrzej Siewior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=527AA4FA.2000208@nsn.com \
--to=matt.cowell@nsn.com \
--cc=linux-rt-users@vger.kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.