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 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.