From: Juri Lelli <juri.lelli@gmail.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: peterz@infradead.org, tglx@linutronix.de, mingo@redhat.com,
oleg@redhat.com, fweisbec@gmail.com, darren@dvhart.com,
johan.eker@ericsson.com, p.faure@akatech.ch,
linux-kernel@vger.kernel.org, claudio@evidence.eu.com,
michael@amarulasolutions.com, fchecconi@gmail.com,
tommaso.cucinotta@sssup.it, nicola.manica@disi.unitn.it,
luca.abeni@unitn.it, dhaval.giani@gmail.com, hgu1972@gmail.com,
paulmck@linux.vnet.ibm.com, raistlin@linux.it,
insop.song@gmail.com, liming.wang@windriver.com,
jkacur@redhat.com, harald.gustafsson@ericsson.com,
vincent.guittot@linaro.org, bruce.ashfield@windriver.com
Subject: Re: [PATCH] rtmutex: Fix compare of waiter prio and task prio
Date: Fri, 22 Nov 2013 11:37:45 +0100 [thread overview]
Message-ID: <528F33F9.9000806@gmail.com> (raw)
In-Reply-To: <20131121125212.142f2786@gandalf.local.home>
On 11/21/2013 06:52 PM, Steven Rostedt wrote:
> The conversion of the rt_mutex from using plist to rbtree eliminated
> the use of the waiter->list_entry.prio, and instead used directly the
> waiter->task->prio.
>
> The problem with this is that the priority inheritance code relies on
> the prio of the waiter being stored is different from the task's prio.
> The change didn't take into account waiter->task == task, which makes
> the compares of:
>
> if (waiter->task->prio == task->prio)
>
> rather pointless, since they will always be the same:
>
> task->pi_blocked_on = waiter;
> waiter->task = task;
>
> When deadlock detection is not being used (for internal users of
> rt_mutex_lock(); things other than futex), the code relies on
> the prio associated to the waiter being different than the prio
> associated to the task.
>
> Another use case where this is critical, is when a task that is
> blocked on an rt_mutex has its priority increased by a separate task.
> Then the compare in rt_mutex_adjust_pi() (called from
> sched_setscheduler()), returns without doing anything. This is because
> it checks if the priority of the task is different than the priority of
> its waiter.
>
> The simple solution is to add a prio member to the rt_mutex_waiter
> structure that associates the priority to the waiter that is separate
> from the task.
>
> I created a test program that tests this case:
>
> http://rostedt.homelinux.com/code/pi_mutex_test.c
>
> (too big to include in a change log) I'll work on getting this test
> into other projects like LTP and the kernel (perf test?)
>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
>
> Index: linux-rt.git/kernel/rtmutex.c
> ===================================================================
> --- linux-rt.git.orig/kernel/rtmutex.c
> +++ linux-rt.git/kernel/rtmutex.c
> @@ -197,7 +197,7 @@ int rt_mutex_getprio(struct task_struct
> if (likely(!task_has_pi_waiters(task)))
> return task->normal_prio;
>
> - return min(task_top_pi_waiter(task)->task->prio,
> + return min(task_top_pi_waiter(task)->prio,
> task->normal_prio);
> }
>
> @@ -336,7 +336,7 @@ static int rt_mutex_adjust_prio_chain(st
> * When deadlock detection is off then we check, if further
> * priority adjustment is necessary.
> */
> - if (!detect_deadlock && waiter->task->prio == task->prio)
> + if (!detect_deadlock && waiter->prio == task->prio)
> goto out_unlock_pi;
>
> lock = waiter->lock;
> @@ -358,7 +358,7 @@ static int rt_mutex_adjust_prio_chain(st
>
> /* Requeue the waiter */
> rt_mutex_dequeue(lock, waiter);
> - waiter->task->prio = task->prio;
> + waiter->prio = task->prio;
> rt_mutex_enqueue(lock, waiter);
>
> /* Release the task */
> @@ -456,7 +456,7 @@ static int try_to_take_rt_mutex(struct r
> * 3) it is top waiter
> */
> if (rt_mutex_has_waiters(lock)) {
> - if (task->prio >= rt_mutex_top_waiter(lock)->task->prio) {
> + if (task->prio >= rt_mutex_top_waiter(lock)->prio) {
> if (!waiter || waiter != rt_mutex_top_waiter(lock))
> return 0;
> }
> @@ -516,7 +516,8 @@ static int task_blocks_on_rt_mutex(struc
> __rt_mutex_adjust_prio(task);
> waiter->task = task;
> waiter->lock = lock;
> -
> + waiter->prio = task->prio;
> +
> /* Get the top priority waiter on the lock */
> if (rt_mutex_has_waiters(lock))
> top_waiter = rt_mutex_top_waiter(lock);
> @@ -661,7 +662,7 @@ void rt_mutex_adjust_pi(struct task_stru
> raw_spin_lock_irqsave(&task->pi_lock, flags);
>
> waiter = task->pi_blocked_on;
> - if (!waiter || (waiter->task->prio == task->prio &&
> + if (!waiter || (waiter->prio == task->prio &&
> !dl_prio(task->prio))) {
> raw_spin_unlock_irqrestore(&task->pi_lock, flags);
> return;
> Index: linux-rt.git/kernel/rtmutex_common.h
> ===================================================================
> --- linux-rt.git.orig/kernel/rtmutex_common.h
> +++ linux-rt.git/kernel/rtmutex_common.h
> @@ -54,6 +54,7 @@ struct rt_mutex_waiter {
> struct pid *deadlock_task_pid;
> struct rt_mutex *deadlock_lock;
> #endif
> + int prio;
> };
>
> /*
>
Thanks! But, now that waiters have their own prio, don't we need to
enqueue them using that?
Something like:
rtmutex: enqueue waiters by their prio
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
index a2c8ee8..2e960a2 100644
--- a/kernel/locking/rtmutex.c
+++ b/kernel/locking/rtmutex.c
@@ -96,13 +96,16 @@ static inline int
rt_mutex_waiter_less(struct rt_mutex_waiter *left,
struct rt_mutex_waiter *right)
{
- if (left->task->prio < right->task->prio)
+ if (left->prio < right->prio)
return 1;
/*
- * If both tasks are dl_task(), we check their deadlines.
+ * If both waiters have dl_prio(), we check the deadlines of the
+ * associated tasks.
+ * If left waiter has a dl_prio(), and we didn't return 1 above,
+ * then right waiter has a dl_prio() too.
*/
- if (dl_prio(left->task->prio) && dl_prio(right->task->prio))
+ if (dl_prio(left->prio))
return (left->task->dl.deadline < right->task->dl.deadline);
return 0;
Thanks,
- Juri
next prev parent reply other threads:[~2013-11-22 10:37 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-07 13:43 [PATCH 00/14] sched: SCHED_DEADLINE v9 Juri Lelli
2013-11-07 13:43 ` [PATCH 01/14] sched: add sched_class->task_dead Juri Lelli
2013-11-12 4:17 ` Paul Turner
2013-11-12 17:19 ` Steven Rostedt
2013-11-12 17:53 ` Juri Lelli
2013-11-27 14:10 ` [tip:sched/core] sched: Add sched_class->task_dead() method tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 02/14] sched: add extended scheduling interface Juri Lelli
2013-11-12 17:23 ` Steven Rostedt
2013-11-13 8:43 ` Juri Lelli
2013-11-12 17:32 ` Steven Rostedt
2013-11-13 9:07 ` Juri Lelli
2013-11-27 13:23 ` [PATCH 02/14] sched: add extended scheduling interface. (new ABI) Ingo Molnar
2013-11-27 13:30 ` Peter Zijlstra
2013-11-27 14:01 ` Ingo Molnar
2013-11-27 14:13 ` Peter Zijlstra
2013-11-27 14:17 ` Ingo Molnar
2013-11-28 11:14 ` Juri Lelli
2013-11-28 11:28 ` Peter Zijlstra
2013-11-30 14:06 ` Ingo Molnar
2013-12-03 16:13 ` Juri Lelli
2013-12-03 16:41 ` Steven Rostedt
2013-12-03 17:04 ` Juri Lelli
2014-01-13 15:53 ` [tip:sched/core] sched: Add new scheduler syscalls to support an extended scheduling parameters ABI tip-bot for Dario Faggioli
2014-01-15 16:22 ` [RFC][PATCH] sched: Move SCHED_RESET_ON_FORK into attr::sched_flags Peter Zijlstra
2014-01-16 13:40 ` [tip:sched/core] sched: Move SCHED_RESET_ON_FORK into attr:: sched_flags tip-bot for Peter Zijlstra
2014-01-17 17:29 ` [tip:sched/core] sched: Add new scheduler syscalls to support an extended scheduling parameters ABI Stephen Warren
2014-01-17 18:04 ` Stephen Warren
2013-11-07 13:43 ` [PATCH 03/14] sched: SCHED_DEADLINE structures & implementation Juri Lelli
2013-11-13 2:31 ` Steven Rostedt
2013-11-13 9:54 ` Juri Lelli
2013-11-20 20:23 ` Steven Rostedt
2013-11-21 14:15 ` Juri Lelli
2014-01-13 15:53 ` [tip:sched/core] sched/deadline: Add " tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 04/14] sched: SCHED_DEADLINE SMP-related data structures & logic Juri Lelli
2013-11-20 18:51 ` Steven Rostedt
2013-11-21 14:13 ` Juri Lelli
2013-11-21 14:41 ` Steven Rostedt
2013-11-21 16:08 ` Paul E. McKenney
2013-11-21 16:16 ` Juri Lelli
2013-11-21 16:26 ` Paul E. McKenney
2013-11-21 16:47 ` Steven Rostedt
2013-11-21 19:38 ` Paul E. McKenney
2014-01-13 15:53 ` [tip:sched/core] sched/deadline: Add " tip-bot for Juri Lelli
2013-11-07 13:43 ` [PATCH 05/14] sched: SCHED_DEADLINE avg_update accounting Juri Lelli
2014-01-13 15:53 ` [tip:sched/core] sched/deadline: Add " tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 06/14] sched: add period support for -deadline tasks Juri Lelli
2014-01-13 15:53 ` [tip:sched/core] sched/deadline: Add period support for SCHED_DEADLINE tasks tip-bot for Harald Gustafsson
2013-11-07 13:43 ` [PATCH 07/14] sched: add schedstats for -deadline tasks Juri Lelli
2013-11-07 13:43 ` [PATCH 08/14] sched: add latency tracing " Juri Lelli
2013-11-20 21:33 ` Steven Rostedt
2013-11-27 13:43 ` Juri Lelli
2013-11-27 14:16 ` Steven Rostedt
2013-11-27 14:19 ` Juri Lelli
2013-11-27 14:26 ` Peter Zijlstra
2013-11-27 14:34 ` Ingo Molnar
2013-11-27 14:58 ` Peter Zijlstra
2013-11-27 15:35 ` Ingo Molnar
2013-11-27 15:40 ` Peter Zijlstra
2013-11-27 15:46 ` Ingo Molnar
2013-11-27 15:54 ` Peter Zijlstra
2013-11-27 15:56 ` Steven Rostedt
2013-11-27 16:01 ` Peter Zijlstra
2013-11-27 16:02 ` Steven Rostedt
2013-11-27 16:13 ` Ingo Molnar
2013-11-27 16:33 ` Steven Rostedt
2013-11-27 16:24 ` Oleg Nesterov
2013-11-27 15:42 ` Ingo Molnar
2013-11-27 15:00 ` Steven Rostedt
2014-01-13 15:54 ` [tip:sched/core] sched/deadline: Add latency tracing for SCHED_DEADLINE tasks tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 09/14] rtmutex: turn the plist into an rb-tree Juri Lelli
2013-11-21 3:07 ` Steven Rostedt
2013-11-21 17:52 ` [PATCH] rtmutex: Fix compare of waiter prio and task prio Steven Rostedt
2013-11-22 10:37 ` Juri Lelli [this message]
2014-01-13 15:54 ` [tip:sched/core] rtmutex: Turn the plist into an rb-tree tip-bot for Peter Zijlstra
2013-11-07 13:43 ` [PATCH 10/14] sched: drafted deadline inheritance logic Juri Lelli
2014-01-13 15:54 ` [tip:sched/core] sched/deadline: Add SCHED_DEADLINE " tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 11/14] sched: add bandwidth management for sched_dl Juri Lelli
2014-01-13 15:54 ` [tip:sched/core] sched/deadline: Add bandwidth management for SCHED_DEADLINE tasks tip-bot for Dario Faggioli
2013-11-07 13:43 ` [PATCH 12/14] sched: make dl_bw a sub-quota of rt_bw Juri Lelli
2013-11-07 13:43 ` [PATCH 13/14] sched: speed up -dl pushes with a push-heap Juri Lelli
2014-01-13 15:54 ` [tip:sched/core] sched/deadline: speed up SCHED_DEADLINE " tip-bot for Juri Lelli
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=528F33F9.9000806@gmail.com \
--to=juri.lelli@gmail.com \
--cc=bruce.ashfield@windriver.com \
--cc=claudio@evidence.eu.com \
--cc=darren@dvhart.com \
--cc=dhaval.giani@gmail.com \
--cc=fchecconi@gmail.com \
--cc=fweisbec@gmail.com \
--cc=harald.gustafsson@ericsson.com \
--cc=hgu1972@gmail.com \
--cc=insop.song@gmail.com \
--cc=jkacur@redhat.com \
--cc=johan.eker@ericsson.com \
--cc=liming.wang@windriver.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luca.abeni@unitn.it \
--cc=michael@amarulasolutions.com \
--cc=mingo@redhat.com \
--cc=nicola.manica@disi.unitn.it \
--cc=oleg@redhat.com \
--cc=p.faure@akatech.ch \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=raistlin@linux.it \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tommaso.cucinotta@sssup.it \
--cc=vincent.guittot@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).