1 /****************************************************************************** 2 * wait.h 3 * 4 * Sleep in hypervisor context for some event to occur. 5 * 6 * Copyright (c) 2010, Keir Fraser <keir@xen.org> 7 */ 8 9 #ifndef __XEN_WAIT_H__ 10 #define __XEN_WAIT_H__ 11 12 #include <xen/types.h> 13 #include <xen/list.h> 14 #include <xen/spinlock.h> 15 16 struct waitqueue_head { 17 spinlock_t lock; 18 struct list_head list; 19 }; 20 21 /* Statically define and initialise a waitqueue. */ 22 #define DEFINE_WAITQUEUE_HEAD(name) \ 23 struct waitqueue_head name = { \ 24 .lock = SPIN_LOCK_UNLOCKED, \ 25 .list = LIST_HEAD_INIT((name).list) \ 26 } 27 28 /* Dynamically initialise/destroy a waitqueue. */ 29 void init_waitqueue_head(struct waitqueue_head *wq); 30 void destroy_waitqueue_head(struct waitqueue_head *wq); 31 32 /* Wake VCPU(s) waiting on specified waitqueue. */ 33 void wake_up_nr(struct waitqueue_head *wq, unsigned int nr); 34 void wake_up_one(struct waitqueue_head *wq); 35 void wake_up_all(struct waitqueue_head *wq); 36 37 /* Wait on specified waitqueue until @condition is true. */ 38 #define wait_event(wq, condition) \ 39 do { \ 40 if ( condition ) \ 41 break; \ 42 for ( ; ; ) { \ 43 prepare_to_wait(&wq); \ 44 if ( condition ) \ 45 break; \ 46 wait(); \ 47 } \ 48 finish_wait(&wq); \ 49 } while (0) 50 51 /* Private functions. */ 52 int init_waitqueue_vcpu(struct vcpu *v); 53 void destroy_waitqueue_vcpu(struct vcpu *v); 54 void prepare_to_wait(struct waitqueue_head *wq); 55 void wait(void); 56 void finish_wait(struct waitqueue_head *wq); 57 void check_wakeup_from_wait(void); 58 59 #endif /* __XEN_WAIT_H__ */ 60