From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: [PATCH] xenbus: Add support for xenbus backend in stub domain Date: Thu, 12 Jan 2012 08:59:33 +0000 Message-ID: <4F0EAF05020000780006C061@nat28.tlf.novell.com> References: <1326302490-19428-1-git-send-email-dgdegra@tycho.nsa.gov> <1326302529-19476-1-git-send-email-dgdegra@tycho.nsa.gov> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1326302529-19476-1-git-send-email-dgdegra@tycho.nsa.gov> Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Daniel De Graaf Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org >>> On 11.01.12 at 18:22, Daniel De Graaf wrote: > This adds two ioctls to the /dev/xen/xenbus_backend device allowing the > xenbus backend to be started after the kernel has booted. This is > intended to allow dom0 to start another domain to run xenstore. > > IOCTL_XENBUS_BACKEND_REMOTE_SETUP requires that the xenstore domain be > started; the domain ID is passed as the ioctl argument. This sets up a > listening event channel and grant reference to xenbus, but does not > start using this interface. It returns the local event channel port. Any chance to get at least the setup part matched with the legacy Linux implementation (defining IOCTL_XENBUS_ALLOC)? Jan > IOCTL_XENBUS_BACKEND_REMOTE_COMMIT causes the kernel to begin using the > event channel set up in the previous ioctl, reregistering all watches > and deallocating the previous xenstored event channel. > > Signed-off-by: Daniel De Graaf > --- > drivers/xen/xenbus/xenbus_comms.c | 6 +++ > drivers/xen/xenbus/xenbus_comms.h | 1 + > drivers/xen/xenbus/xenbus_dev_backend.c | 57 > +++++++++++++++++++++++++++++++ > include/xen/grant_table.h | 2 + > include/xen/xenbus_dev.h | 6 +++ > 5 files changed, 72 insertions(+), 0 deletions(-) > > diff --git a/drivers/xen/xenbus/xenbus_comms.c > b/drivers/xen/xenbus/xenbus_comms.c > index 2eff7a6..52fe7ad 100644 > --- a/drivers/xen/xenbus/xenbus_comms.c > +++ b/drivers/xen/xenbus/xenbus_comms.c > @@ -234,3 +234,9 @@ int xb_init_comms(void) > > return 0; > } > + > +void xb_deinit_comms(void) > +{ > + unbind_from_irqhandler(xenbus_irq, &xb_waitq); > + xenbus_irq = 0; > +} > diff --git a/drivers/xen/xenbus/xenbus_comms.h > b/drivers/xen/xenbus/xenbus_comms.h > index 6e42800..c8abd3b 100644 > --- a/drivers/xen/xenbus/xenbus_comms.h > +++ b/drivers/xen/xenbus/xenbus_comms.h > @@ -35,6 +35,7 @@ > > int xs_init(void); > int xb_init_comms(void); > +void xb_deinit_comms(void); > > /* Low level routines. */ > int xb_write(const void *data, unsigned len); > diff --git a/drivers/xen/xenbus/xenbus_dev_backend.c > b/drivers/xen/xenbus/xenbus_dev_backend.c > index 3d3be78..4138ba2 100644 > --- a/drivers/xen/xenbus/xenbus_dev_backend.c > +++ b/drivers/xen/xenbus/xenbus_dev_backend.c > @@ -8,7 +8,11 @@ > > #include > #include > +#include > #include > +#include > +#include > +#include > > #include "xenbus_comms.h" > > @@ -22,6 +26,53 @@ static int xenbus_backend_open(struct inode *inode, struct > file *filp) > return nonseekable_open(inode, filp); > } > > +static int pending_xsd_port; > + > +static long xenbus_backend_remote_setup(domid_t domid) > +{ > + struct evtchn_alloc_unbound arg; > + int err; > + > + gnttab_grant_foreign_access_ref(GNTTAB_RESERVED_XENSTORE, domid, > + virt_to_mfn(xen_store_interface), 0 /* writable */); > + > + if (pending_xsd_port) { > + struct evtchn_close close; > + close.port = pending_xsd_port; > + err = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close); > + WARN_ON(err); > + } > + > + arg.dom = DOMID_SELF; > + arg.remote_dom = domid; > + > + err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &arg); > + if (err) > + return err; > + > + pending_xsd_port = arg.port; > + > + return arg.port; > +} > + > +static long xenbus_backend_remote_commit(unsigned long data) > +{ > + if (!pending_xsd_port) > + return -EINVAL; > + > + xs_suspend(); > + > + if (xen_store_evtchn > 0) > + xb_deinit_comms(); > + > + xen_store_evtchn = pending_xsd_port; > + pending_xsd_port = 0; > + > + xs_resume(); > + > + return 0; > +} > + > static long xenbus_backend_ioctl(struct file *file, unsigned int cmd, > unsigned long data) > { > if (!capable(CAP_SYS_ADMIN)) > @@ -33,6 +84,12 @@ static long xenbus_backend_ioctl(struct file *file, > unsigned int cmd, unsigned l > return xen_store_evtchn; > return -ENODEV; > > + case IOCTL_XENBUS_BACKEND_REMOTE_SETUP: > + return xenbus_backend_remote_setup(data); > + > + case IOCTL_XENBUS_BACKEND_REMOTE_COMMIT: > + return xenbus_backend_remote_commit(data); > + > default: > return -ENOTTY; > } > diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h > index 15f8a00..11e27c3 100644 > --- a/include/xen/grant_table.h > +++ b/include/xen/grant_table.h > @@ -46,6 +46,8 @@ > > #include > > +#define GNTTAB_RESERVED_XENSTORE 1 > + > /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */ > #define NR_GRANT_FRAMES 4 > > diff --git a/include/xen/xenbus_dev.h b/include/xen/xenbus_dev.h > index ac5f0fe..24d5028 100644 > --- a/include/xen/xenbus_dev.h > +++ b/include/xen/xenbus_dev.h > @@ -38,4 +38,10 @@ > #define IOCTL_XENBUS_BACKEND_EVTCHN \ > _IOC(_IOC_NONE, 'B', 0, 0) > > +#define IOCTL_XENBUS_BACKEND_REMOTE_SETUP \ > + _IOC(_IOC_NONE, 'B', 1, 0) > + > +#define IOCTL_XENBUS_BACKEND_REMOTE_COMMIT \ > + _IOC(_IOC_NONE, 'B', 2, 0) > + > #endif /* __LINUX_XEN_XENBUS_DEV_H__ */ > -- > 1.7.7.5 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel