[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 25/29] tools/xenstored: map stubdom interface



Hi Juergen,

On 10/11/2023 16:08, Juergen Gross wrote:
When running as stubdom, map the stubdom's Xenstore ring page in order
to support using the 9pfs frontend.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
  tools/xenstored/core.c   |  2 ++
  tools/xenstored/domain.c | 27 ++++++++++++++++++++++++++-
  tools/xenstored/domain.h |  1 +
  3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c
index b9ec50b34c..4a9d874f17 100644
--- a/tools/xenstored/core.c
+++ b/tools/xenstored/core.c
@@ -2991,6 +2991,8 @@ int main(int argc, char *argv[])
                lu_read_state();
  #endif
+ stubdom_init();
+
        check_store();
/* Get ready to listen to the tools. */
diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c
index fa17f68618..162b87b460 100644
--- a/tools/xenstored/domain.c
+++ b/tools/xenstored/domain.c
@@ -37,6 +37,10 @@
  #include <xenctrl.h>
  #include <xen/grant_table.h>
+#ifdef __MINIOS__
+#include <mini-os/xenbus.h>
+#endif
+
  static xc_interface **xc_handle;
  xengnttab_handle **xgt_handle;
  static evtchn_port_t virq_port;
@@ -500,6 +504,11 @@ static void *map_interface(domid_t domid)
        if (domid == xenbus_master_domid())
                return xenbus_map();
+#ifdef __MINIOS__
+       if (domid == stub_domid)
+               return xenstore_buf;
+#endif
+
        return xengnttab_map_grant_ref(*xgt_handle, domid,
                                       GNTTAB_RESERVED_XENSTORE,
                                       PROT_READ|PROT_WRITE);
@@ -509,7 +518,7 @@ static void unmap_interface(domid_t domid, void *interface)
  {
        if (domid == xenbus_master_domid())
                unmap_xenbus(interface);
-       else
+       else if (domid != stub_domid)
                xengnttab_unmap(*xgt_handle, interface, 1);
  }
@@ -1214,6 +1223,22 @@ void dom0_init(void)
        xenevtchn_notify(xce_handle, dom0->port);
  }
+void stubdom_init(void)
+{
+#ifdef __MINIOS__
+       struct domain *stubdom;
+
+       if (stub_domid < 0)
+               return;
+
+       stubdom = introduce_domain(NULL, stub_domid, xenbus_evtchn, false);
+       if (!stubdom)
+               barf_perror("Failed to initialize stubdom");
+
+       xenevtchn_notify(xce_handle, stubdom->port);

If I compare to introduce_domain(), it is not entirely clear to me why the notification is done unconditionally here. Can you clarify?

+#endif
+}
+
  static unsigned int domhash_fn(const void *k)
  {
        return *(const unsigned int *)k;
diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h
index 6c00540311..49c60c56bf 100644
--- a/tools/xenstored/domain.h
+++ b/tools/xenstored/domain.h
@@ -85,6 +85,7 @@ int do_reset_watches(const void *ctx, struct connection *conn,
  void domain_static_init(void);
  void domain_init(int evtfd);
  void dom0_init(void);
+void stubdom_init(void);
  void domain_deinit(void);
  void ignore_connection(struct connection *conn, unsigned int err);

Cheers,

--
Julien Grall



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.