[PATCH] pi-futex: scheduler support for pi
Add framework to boost/unboost the priority of RT tasks. This consists of: - caching the 'normal' priority in ->normal_prio - providing a functions to set/get the priority of the task - make sched_setscheduler() aware of boosting The effective_prio() cleanups also fix a priority-calculation bug pointed out by Andrey Gelman, in set_user_nice(). has_rt_policy() fix: Peter Williams <pwil3058@bigpond.net.au> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Cc: Andrey Gelman <agelman@012.net.il> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
77ba89c5cf
commit
b29739f902
@@ -495,8 +495,11 @@ struct signal_struct {
|
||||
|
||||
#define MAX_PRIO (MAX_RT_PRIO + 40)
|
||||
|
||||
#define rt_task(p) (unlikely((p)->prio < MAX_RT_PRIO))
|
||||
#define rt_prio(prio) unlikely((prio) < MAX_RT_PRIO)
|
||||
#define rt_task(p) rt_prio((p)->prio)
|
||||
#define batch_task(p) (unlikely((p)->policy == SCHED_BATCH))
|
||||
#define has_rt_policy(p) \
|
||||
unlikely((p)->policy != SCHED_NORMAL && (p)->policy != SCHED_BATCH)
|
||||
|
||||
/*
|
||||
* Some day this will be a full-fledged user tracking system..
|
||||
@@ -725,7 +728,7 @@ struct task_struct {
|
||||
#endif
|
||||
#endif
|
||||
int load_weight; /* for niceness load balancing purposes */
|
||||
int prio, static_prio;
|
||||
int prio, static_prio, normal_prio;
|
||||
struct list_head run_list;
|
||||
prio_array_t *array;
|
||||
|
||||
@@ -852,6 +855,9 @@ struct task_struct {
|
||||
/* Protection of (de-)allocation: mm, files, fs, tty, keyrings */
|
||||
spinlock_t alloc_lock;
|
||||
|
||||
/* Protection of the PI data structures: */
|
||||
spinlock_t pi_lock;
|
||||
|
||||
#ifdef CONFIG_DEBUG_MUTEXES
|
||||
/* mutex deadlock detection */
|
||||
struct mutex_waiter *blocked_on;
|
||||
@@ -1018,6 +1024,17 @@ static inline void idle_task_exit(void) {}
|
||||
#endif
|
||||
|
||||
extern void sched_idle_next(void);
|
||||
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
extern int rt_mutex_getprio(task_t *p);
|
||||
extern void rt_mutex_setprio(task_t *p, int prio);
|
||||
#else
|
||||
static inline int rt_mutex_getprio(task_t *p)
|
||||
{
|
||||
return p->normal_prio;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern void set_user_nice(task_t *p, long nice);
|
||||
extern int task_prio(const task_t *p);
|
||||
extern int task_nice(const task_t *p);
|
||||
|
Reference in New Issue
Block a user