changeset: 24231:2a81ce2b2b93 user: Keir Fraser date: Fri Nov 25 20:27:11 2011 +0000 files: xen/common/wait.c xen/include/xen/wait.h description: waitqueue: Implement wake_up_{nr,one,all}. Signed-off-by: Keir Fraser --- xen/common/wait.c | 14 ++++++++++++-- xen/include/xen/wait.h | 6 ++++-- 2 files changed, 16 insertions(+), 4 deletions(-) Index: xen-4.1.2-testing/xen/common/wait.c =================================================================== --- xen-4.1.2-testing.orig/xen/common/wait.c +++ xen-4.1.2-testing/xen/common/wait.c @@ -87,13 +87,13 @@ void init_waitqueue_head(struct waitqueu 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) Index: xen-4.1.2-testing/xen/include/xen/wait.h =================================================================== --- xen-4.1.2-testing.orig/xen/include/xen/wait.h +++ xen-4.1.2-testing/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) \