From: Thomas Gleixner <tglx@linutronix.de>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>,
Esben Nielsen <nielsen.esben@googlemail.com>,
linux-kernel@vger.kernel.org
Subject: Re: rt_mutex_timed_lock() vs hrtimer_wakeup() race ?
Date: Tue, 01 Aug 2006 09:58:36 +0200 [thread overview]
Message-ID: <1154419117.5932.55.camel@localhost.localdomain> (raw)
In-Reply-To: <20060730043605.GA2894@oleg>
On Sun, 2006-07-30 at 08:36 +0400, Oleg Nesterov wrote:
> Another question, task_blocks_on_rt_mutex() does get_task_struct() and checks
> owner->pi_blocked_on != NULL under owner->pi_lock. Why ? RT_MUTEX_HAS_WAITERS
> bit is set, we are holding ->wait_lock, so the 'owner' can't go away until
> we drop ->wait_lock. I think we can drop owner->pi_lock right after
> __rt_mutex_adjust_prio(owner), we can't miss owner->pi_blocked_on != NULL
> if it was true before we take owner->pi_lock, and this is the case we should
> worry about, yes?
No.
We hold lock->wait_lock. The owner of this lock can be blocked itself,
which makes it necessary to do the chain walk. The indicator is
owner->pi_blocked_on. This field is only protected by owner->pi_lock.
If we look at this field outside of owner->pi_lock, then we might miss a
chain walk.
CPU 0 CPU 1
lock lock->wait_lock
block_on_rt_mutex()
lock current->pi_lock
current->pi_blocked_on = waiter(lock)
unlock current->pi_lock
boost = owner->pi_blocked_on
owner blocks on lock2
lock owner->pi_lock
owner->pi_blocked_on = waiter(lock2)
unlock owner->pi_lock
lock owner->pi_lock
enqueue waiter
adjust prio
unlock owner->pi_lock
unlock lock->wait_lock
if boost
do_chain_walk()
->pi_blocked_on is protected by ->pi_lock and has to be read/modified
under this lock. That way we can not miss a chain walk:
CPU 0 CPU 1
lock lock->wait_lock
block_on_rt_mutex()
lock current->pi_lock
current->pi_blocked_on = waiter(lock)
unlock current->pi_lock
owner blocks on lock2
lock owner->pi_lock
owner->pi_blocked_on = waiter(lock2)
unlock owner->pi_lock
lock owner->pi_lock
enqueue waiter
adjust prio
boost = owner->pi_blocked_on
unlock owner->pi_lock
unlock lock->wait_lock
if boost
do_chain_walk()
CPU 0 CPU 1
lock lock->wait_lock
block_on_rt_mutex()
lock current->pi_lock
current->pi_blocked_on = waiter(lock)
unlock current->pi_lock
lock owner->pi_lock
enqueue waiter
adjust prio of owner
boost = owner->pi_blocked_on
unlock owner->pi_lock
unlock lock->wait_lock
owner blocks on lock2
lock owner->pi_lock
owner->pi_blocked_on = waiter(lock2)
unlock owner->pi_lock
if boost
do_chain_walk()
owner propagates the priority to owner(lock2)
get_task_struct() is there for a different reason. We have to protect
the gap where we hold _no_ lock in rt_mutex_adjust_prio_chain:
retry:
lock task->pi_lock
block = task->pi_blocked_on->lock
if (! trylock block->wait_lock) {
unlock task->pi_lock
-> task could go away right here, if we do not hold a reference
cpu_relax()
goto retry
}
tglx
next prev parent reply other threads:[~2006-08-01 7:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-30 4:36 rt_mutex_timed_lock() vs hrtimer_wakeup() race ? Oleg Nesterov
2006-07-30 22:23 ` Steven Rostedt
2006-08-01 0:12 ` Oleg Nesterov
2006-07-31 20:47 ` Steven Rostedt
2006-08-01 7:58 ` Thomas Gleixner [this message]
2006-08-01 12:07 ` Steven Rostedt
2006-08-01 12:52 ` Thomas Gleixner
2006-08-01 13:21 ` Steven Rostedt
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=1154419117.5932.55.camel@localhost.localdomain \
--to=tglx@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=nielsen.esben@googlemail.com \
--cc=oleg@tv-sign.ru \
--cc=rostedt@goodmis.org \
/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.