|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 07/10] plat/xen: Introduce Xenbus watch
Introduce the abstraction for Xenbus watches.
Signed-off-by: Costin Lupu <costin.lupu@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, 79 insertions(+)
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..2352a82 100644
--- a/plat/xen/xenbus/exportsyms.uk
+++ b/plat/xen/xenbus/exportsyms.uk
@@ -24,4 +24,6 @@ xs_get_self_id
xenbus_state_to_str
xenbus_devtype_to_str
xenbus_str_to_devtype
+xenbus_watch_wait_event
+xenbus_watch_notify_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 |