| 
    
 [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  |