Priority-based real-time futexes
PATCH 1/1 Priority-based real-time futexes
So, I really screwed up, my scripts failed to pick up the patch.
Really sorry for that and flooding your inboxes :)
linux/prioarray.h new file +57 -0
@@ -0,0 +1,57 @@ +/* +* O(1) priority arrays +* +* Modified from code (C) 2002 Ingo Molnar <[email protected]> in +* sched.c by Iñaky Pérez-González <[email protected]> so +* that other parts of the kernel can use the same constructs. +*/ + +#ifndef _LINUX_PRIOARRAY_ +#define _LINUX_PRIOARRAY_ + +/* This inclusion is kind of recursive ... hmmm */ + +#include <linux/sched.h> + +struct prio_array { +int nr_active; +unsigned long bitmap[BITMAP_SIZE ]; +struct list_head queue[MAX_PRIO ]; +}; + +typedef struct prio_array prio_array_t ; + +static inline +void pa_init (prio_array_t *array) +{ +unsigned cnt; + array->nr_active =0 ; +memset (array->bitmap,0 ,sizeof (array->bitmap)); +for (cnt =0 ; cnt <MAX_PRIO ; cnt++) +INIT_LIST_HEAD (&array->queue[cnt]); +} + +/* +* Adding/removing a node to/from a priority array: +*/ + +static inline +void pa_dequeue (struct list_head *p,unsigned prio,prio_array_t *array) +{ + array->nr_active--; +list_del (p); +if (list_empty (array->queue + prio)) +__clear_bit (prio, array->bitmap); +} + +static inline +void pa_enqueue (struct list_head *p,unsigned prio,prio_array_t *array) +{ +list_add_tail (p, array->queue + prio); +__set_bit (prio, array->bitmap); + array->nr_active++; +} + + + +#endif /* #ifndef _LINUX_PRIOARRAY_ */
linux/sched.h renamed from linux/sched.h:1.1.1.3 +3 -1
@@ -241,6 +241,9 @@#define MAX_RT_PRIO MAX_USER_RT_PRIO#define MAX_PRIO (MAX_RT_PRIO + 40) +#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long)) + +#include <linux/prioarray.h> /* Okay, this is ugly, but needs MAX_PRIO */ /* * Some day this will be a full-fledged user tracking system..
@@ -265,7 +268,6 @@extern struct user_struct root_user;#define INIT_USER (&root_user) -typedef struct prio_array prio_array_t ;struct backing_dev_info ;struct task_struct {
linux/vcache.h renamed from linux/vcache.h:1.1.1.2 +18 -0
@@ -17,8 +17,26 @@unsigned long address, struct mm_struct *mm, void (*callback)(struct vcache_s *data, struct page *new_page)); +static inline +void attach_vcache (vcache_t *vcache, +unsigned long address, +struct mm_struct *mm, +void (*callback)(struct vcache_s *data,struct page *new_page)) +{ +spin_lock (&vcache_lock); +__attach_vcache (vcache, address, mm, callback); +spin_unlock (&vcache_lock); +}extern void __detach_vcache (vcache_t *vcache); + +static inline +void detach_vcache (vcache_t *vcache) +{ +spin_lock (&vcache_lock); +__detach_vcache (vcache); +spin_unlock (&vcache_lock); +}extern void invalidate_vcache (unsigned long address,struct mm_struct *mm,struct page *new_page);
futex.c renamed from futex.c:1.1.1.3 +411 -152
755 lines not on this page · raw message
sched.c renamed from sched.c:1.1.1.3 +2 -14
@@ -129,15 +129,8 @@* These are the runqueue data structures: */ -#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long)) -typedef struct runqueue runqueue_t ; -struct prio_array { -int nr_active; -unsigned long bitmap[BITMAP_SIZE ]; -struct list_head queue[MAX_PRIO ]; -};/* * This is the main, per-CPU runqueue data structure.
@@ -225,17 +218,12 @@*/ static inline void dequeue_task (struct task_struct *p,prio_array_t *array) { - array->nr_active--; -list_del (&p->run_list); -if (list_empty (array->queue + p->prio)) -__clear_bit (p->prio, array->bitmap); +pa_dequeue (&p->run_list, p->prio, array); }static inline void enqueue_task (struct task_struct *p,prio_array_t *array) { -list_add_tail (&p->run_list, array->queue + p->prio); -__set_bit (p->prio, array->bitmap); - array->nr_active++; +pa_enqueue (&p->run_list, p->prio, array); p->array = array; }
Signature · 1 line
Inaky Perez-Gonzalez -- Not speaking for Intel - opinions are my own [or my fault]