From: Keir Fraser Date: Fri, 25 Nov 2011 20:27:11 +0000 (+0000) Subject: waitqueue: Implement wake_up_{nr,one,all}. X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6eb91524ed2f167bb31aeb7bbf8455e06e4f48b6;p=xen.git waitqueue: Implement wake_up_{nr,one,all}. Signed-off-by: Keir Fraser --- diff --git a/xen/common/wait.c b/xen/common/wait.c index d4feecb56e..a05ac4f57f 100644 --- a/xen/common/wait.c +++ b/xen/common/wait.c @@ -87,13 +87,13 @@ void init_waitqueue_head(struct waitqueue_head *wq) INIT_LIST_HEAD(&wq->list); } -void wake_up(struct waitqueue_head *wq) +void wake_up_nr(struct waitqueue_head *wq, unsigned int nr) { struct waitqueue_vcpu *wqv; spin_lock(&wq->lock); - while ( !list_empty(&wq->list) ) + while ( !list_empty(&wq->list) && nr-- ) { wqv = list_entry(wq->list.next, struct waitqueue_vcpu, list); list_del_init(&wqv->list); @@ -103,6 +103,16 @@ void wake_up(struct waitqueue_head *wq) spin_unlock(&wq->lock); } +void wake_up_one(struct waitqueue_head *wq) +{ + wake_up_nr(wq, 1); +} + +void wake_up_all(struct waitqueue_head *wq) +{ + wake_up_nr(wq, UINT_MAX); +} + #ifdef CONFIG_X86 static void __prepare_to_wait(struct waitqueue_vcpu *wqv) diff --git a/xen/include/xen/wait.h b/xen/include/xen/wait.h index dd3db9f872..f16eb6a114 100644 --- a/xen/include/xen/wait.h +++ b/xen/include/xen/wait.h @@ -28,8 +28,10 @@ struct waitqueue_head { /* Dynamically initialise a waitqueue. */ void init_waitqueue_head(struct waitqueue_head *wq); -/* Wake all VCPUs waiting on specified waitqueue. */ -void wake_up(struct waitqueue_head *wq); +/* Wake VCPU(s) waiting on specified waitqueue. */ +void wake_up_nr(struct waitqueue_head *wq, unsigned int nr); +void wake_up_one(struct waitqueue_head *wq); +void wake_up_all(struct waitqueue_head *wq); /* Wait on specified waitqueue until @condition is true. */ #define wait_event(wq, condition) \