From: Yimin Deng <yimin11.deng@gmail.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-rt-users@vger.kernel.org
Subject: Re: kernel BUG at kernel/rtmutex_common.h:75
Date: Sun, 8 Nov 2015 11:31:53 +0800 [thread overview]
Message-ID: <CAAh1qt=9nrxxHdWyk_TwjqfF=qiMU2=AJwpXN6NE4sFjGaJeFA@mail.gmail.com> (raw)
In-Reply-To: <alpine.DEB.2.11.1511071908340.4032@nanos>
2015-11-08 2:09 GMT+08:00 Thomas Gleixner <tglx@linutronix.de>:
> On Fri, 6 Nov 2015, Thomas Gleixner wrote:
> Btw, please update to 3.12.48-rt66. It contains quite some bugfixes in
> the area of futex/rtmutex.
>
> Thanks,
>
> tglx
On Fri, 6 Nov 2015, Thomas Gleixner wrote:
>> diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
>> index 7601c1332a88..0e6505d5ce4a 100644
>> --- a/kernel/rtmutex.c
>> +++ b/kernel/rtmutex.c
>> @@ -1003,11 +1003,18 @@ static void wakeup_next_waiter(struct rt_mutex *lock)
>> static void remove_waiter(struct rt_mutex *lock,
>> struct rt_mutex_waiter *waiter)
>> {
>> - bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
>> struct task_struct *owner = rt_mutex_owner(lock);
>> struct rt_mutex *next_lock = NULL;
>> + bool is_top_waiter = false;
>> unsigned long flags;
>>
>> + /*
>> + * @waiter might be not queued when task_blocks_on_rt_mutex()
>> + * returned early so @lock might not have any waiters.
>> + */
>> + if (rt_mutex_has_waiters())
>> + is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
>> +
>> raw_spin_lock_irqsave(¤t->pi_lock, flags);
>> rt_mutex_dequeue(lock, waiter);
>> current->pi_blocked_on = NULL;
Sincerely appreciate for your answers!
Could it be modified as below? It seems not necessary to call
rt_mutex_dequeue() and clear the current->pi_blocked_on if there's no
waiter on the lock. And the waiter->task is not the 'current' when the
remove_waiter() is called in the function rt_mutex_start_proxy_lock().
static void remove_waiter(struct rt_mutex *lock,
struct rt_mutex_waiter *waiter)
{
- bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
struct task_struct *owner = rt_mutex_owner(lock);
struct rt_mutex *next_lock = NULL;
+ bool is_top_waiter;
+ struct task_struct *task = waiter->task;
unsigned long flags;
+ /*
+ * @waiter might be not queued when task_blocks_on_rt_mutex()
+ * returned early so @lock might not have any waiters.
+ */
+ if (unlikely(!rt_mutex_has_waiters()))
+ return;
+
+ is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
+
- raw_spin_lock_irqsave(¤t->pi_lock, flags);
- rt_mutex_dequeue(lock, waiter);
- current->pi_blocked_on = NULL;
- raw_spin_unlock_irqrestore(¤t->pi_lock, flags);
+ raw_spin_lock_irqsave(&task->pi_lock, flags);
+ rt_mutex_dequeue(lock, waiter);
+ task->pi_blocked_on = NULL;
+ __rt_mutex_adjust_prio(task); <-- I'm not sure if it is necessary.
+ raw_spin_unlock_irqrestore(&task->pi_lock, flags);
......
- rt_mutex_adjust_prio_chain(owner, 0, lock, next_lock, NULL, current);
+ rt_mutex_adjust_prio_chain(owner, 0, lock, next_lock, NULL, task);
......
}
I'm sorry for so many questions.
Thanks ahead!
B.R.
Yimin Deng
next prev parent reply other threads:[~2015-11-08 3:31 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-04 14:35 kernel BUG at kernel/rtmutex_common.h:75 Yimin Deng
2015-11-06 14:41 ` Thomas Gleixner
2015-11-07 18:09 ` Thomas Gleixner
2015-11-08 3:31 ` Yimin Deng [this message]
2018-03-12 14:28 [PATCH] kernel/rtmutex: Handle non enqueued waiters gracefully in remove_waiter() Sebastian Andrzej Siewior
2018-03-16 12:20 ` Peter Zijlstra
2018-03-19 15:11 ` Thomas Gleixner
2018-03-27 12:14 ` [PATCH v2] locking/rtmutex: " Sebastian Andrzej Siewior
2018-03-28 21:07 ` [tip:locking/core] " tip-bot for Peter Zijlstra
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='CAAh1qt=9nrxxHdWyk_TwjqfF=qiMU2=AJwpXN6NE4sFjGaJeFA@mail.gmail.com' \
--to=yimin11.deng@gmail.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.