[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v4 4/7] plat/xen: Introduce Xenbus watch
Introduce the abstraction for Xenbus watches. Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> --- plat/xen/include/xenbus/client.h | 21 +++++++++++++++++++++ plat/xen/include/xenbus/xenbus.h | 16 ++++++++++++++++ plat/xen/xenbus/client.c | 40 ++++++++++++++++++++++++++++++++++++++++ plat/xen/xenbus/exportsyms.uk | 2 +- 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/plat/xen/include/xenbus/client.h b/plat/xen/include/xenbus/client.h index 964592d..f3540b7 100644 --- a/plat/xen/include/xenbus/client.h +++ b/plat/xen/include/xenbus/client.h @@ -65,4 +65,25 @@ const char *xenbus_devtype_to_str(enum xenbus_dev_type devtype); */ enum xenbus_dev_type xenbus_str_to_devtype(const char *devtypestr); + +/* + * Watches + */ + +/* + * Waits for a watch event. Called by a client driver. + * + * @param watch Xenbus watch + * @return 0 on success, a negative errno value on error. + */ +int xenbus_watch_wait_event(struct xenbus_watch *watch); + +/* + * Notifies a client driver waiting for watch events. + * + * @param watch Xenbus watch + * @return 0 on success, a negative errno value on error. + */ +int xenbus_watch_notify_event(struct xenbus_watch *watch); + #endif /* __XENBUS_CLIENT_H__ */ diff --git a/plat/xen/include/xenbus/xenbus.h b/plat/xen/include/xenbus/xenbus.h index 970b96a..230dcd4 100644 --- a/plat/xen/include/xenbus/xenbus.h +++ b/plat/xen/include/xenbus/xenbus.h @@ -88,6 +88,22 @@ void _xenbus_register_driver(struct xenbus_driver *drv); typedef unsigned long xenbus_transaction_t; #define XBT_NIL ((xenbus_transaction_t) 0) +/* + * Xenbus watch + */ + +struct xenbus_watch { + /**< in use internally */ + UK_TAILQ_ENTRY(struct xenbus_watch) watch_list; + /**< Lock */ + spinlock_t lock; + /**< Number of pending events */ + int pending_events; + /**< Watch waiting queue */ + struct uk_waitq wq; +}; +UK_TAILQ_HEAD(xenbus_watch_list, struct xenbus_watch); + /* * Xenbus device diff --git a/plat/xen/xenbus/client.c b/plat/xen/xenbus/client.c index 3ddae5e..3dbca0f 100644 --- a/plat/xen/xenbus/client.c +++ b/plat/xen/xenbus/client.c @@ -90,3 +90,43 @@ enum xenbus_dev_type xenbus_str_to_devtype(const char *devtypestr) return xenbus_dev_none; } + +/* + * Watches + */ + +int xenbus_watch_wait_event(struct xenbus_watch *watch) +{ + if (watch == NULL) + return -EINVAL; + + while (1) { + ukarch_spin_lock(&watch->lock); + + if (watch->pending_events > 0) + break; + + ukarch_spin_unlock(&watch->lock); + + uk_waitq_wait_event(&watch->wq, + (watch->pending_events > 0)); + } + + watch->pending_events--; + ukarch_spin_unlock(&watch->lock); + + return 0; +} + +int xenbus_watch_notify_event(struct xenbus_watch *watch) +{ + if (watch == NULL) + return -EINVAL; + + ukarch_spin_lock(&watch->lock); + watch->pending_events++; + uk_waitq_wake_up(&watch->wq); + ukarch_spin_unlock(&watch->lock); + + return 0; +} diff --git a/plat/xen/xenbus/exportsyms.uk b/plat/xen/xenbus/exportsyms.uk index e58bcf8..6fb2e04 100644 --- a/plat/xen/xenbus/exportsyms.uk +++ b/plat/xen/xenbus/exportsyms.uk @@ -24,4 +24,4 @@ xs_get_self_id xenbus_state_to_str xenbus_devtype_to_str xenbus_str_to_devtype - +xenbus_watch_wait_event -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |