From f38714089f210c9e240a941a08b66f0e83941d6d Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Fri, 16 Sep 2016 15:22:17 -0400 Subject: [PATCH] sched: get effective policy and rt_prio Helper functions to get the effective policy and rt_priority from the prio and policy values. This is useful in PI situations because these fields are not updated in the task, only the sched_class is temporarily modified. Cc: Peter Zijlstra Cc: Steven Rostedt (Red Hat) Cc: Thomas Gleixner Cc: Ingo Molnar Signed-off-by: Mathieu Desnoyers Signed-off-by: Julien Desfossez --- include/linux/sched/rt.h | 10 ++++++++++ kernel/locking/rtmutex.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h index a30b172df6e1..42b37ce43402 100644 --- a/include/linux/sched/rt.h +++ b/include/linux/sched/rt.h @@ -25,6 +25,8 @@ static inline bool tsk_is_pi_blocked(struct task_struct *tsk) { return tsk->pi_blocked_on != NULL; } +extern int rt_mutex_get_effective_policy(int policy, int prio); +extern int rt_mutex_get_effective_rt_prio(int prio); #else static inline int rt_mutex_getprio(struct task_struct *p) { @@ -46,6 +48,14 @@ static inline bool tsk_is_pi_blocked(struct task_struct *tsk) { return false; } +static inline int rt_mutex_get_effective_policy(int policy, int prio); +{ + return policy; +} +static inline int rt_mutex_get_effective_rt_prio(int prio) +{ + return task->rt_priority; +} #endif extern void normalize_rt_tasks(void); diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 1ec0f48962b3..b66954f75953 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -293,6 +293,42 @@ int rt_mutex_get_effective_prio(struct task_struct *task, int newprio) return newprio; } +/* + * Get the effective policy based on the current prio value. + */ +int rt_mutex_get_effective_policy(int policy, int prio) +{ + if (dl_prio(prio)) + return SCHED_DEADLINE; + + /* With RT, the default class is SCHED_FIFO. */ + if (rt_prio(prio)) { + if (policy == SCHED_RR) + return SCHED_RR; + return SCHED_FIFO; + } + + /* With fair, the default class is SCHED_NORMAL. */ + switch (policy) { + case SCHED_NORMAL: + case SCHED_IDLE: + case SCHED_BATCH: + return policy; + } + return SCHED_NORMAL; +} + +/* + * Get the effective rt priority based on the current prio value. + */ +int rt_mutex_get_effective_rt_prio(int prio) +{ + if (!rt_prio(prio)) + return 0; + + return MAX_RT_PRIO - 1 - prio; +} + /* * Adjust the priority of a task, after its pi_waiters got modified. * -- 2.34.1