Messages in this thread Patch in this message | | | Subject | Re: [RFC][PATCH 3/3] ipc/sem: Rework wakeup scheme | From | Peter Zijlstra <> | Date | Fri, 16 Sep 2011 14:39:42 +0200 |
| |
On Fri, 2011-09-16 at 14:18 +0200, Peter Zijlstra wrote: > Currently the wake-list is a FILO, although making it FIFO isn't really > hard (in fact, I've got the patch).
might as well post it too
--- Subject: From: Peter Zijlstra <a.p.zijlstra@chello.nl> Date: Thu Sep 15 15:32:06 CEST 2011
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-mus5f94zr5rckytoysdn4pqd@git.kernel.org --- include/linux/sched.h | 11 ++++++++--- ipc/sem.c | 11 +++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) Index: linux-2.6/include/linux/sched.h =================================================================== --- linux-2.6.orig/include/linux/sched.h +++ linux-2.6/include/linux/sched.h @@ -1067,6 +1067,7 @@ struct sched_domain; struct wake_list_head { struct wake_list_node *first; + struct wake_list_node *last; }; struct wake_list_node { @@ -1076,7 +1077,7 @@ struct wake_list_node { #define WAKE_LIST_TAIL ((struct wake_list_node *)0x01) #define WAKE_LIST(name) \ - struct wake_list_head name = { WAKE_LIST_TAIL } + struct wake_list_head name = { WAKE_LIST_TAIL, WAKE_LIST_TAIL } /* * wake flags @@ -2174,11 +2175,15 @@ wake_list_add(struct wake_list_head *hea * This cmpxchg() implies a full barrier, which pairs with the write * barrier implied by the wakeup in wake_up_list(). */ - if (cmpxchg(&n->next, 0, head->first)) + if (cmpxchg(&n->next, 0, WAKE_LIST_TAIL)) return; get_task_struct(p); - head->first = n; + if (head->first == WAKE_LIST_TAIL) + head->first = n; + else + head->last->next = n; + head->last = n; } extern void wake_up_list(struct wake_list_head *head, unsigned int state);
| |