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

Re: [Xen-devel] [PATCH] xenbus: Add support for xenbus backend in stub domain



On Thu, 2012-01-12 at 23:36 +0000, Daniel De Graaf wrote:
> This adds an ioctl 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.

Does this new ioctl need to be made oneshot? What happens if you call it
twice?

Also it should be disabled once a local xenstored has connected
shouldn't it?

Diego's original patch handled that sort of thing, any reason not to
simply forward port it?

> 
> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
> ---
>  drivers/xen/xenbus/xenbus_comms.c       |    6 ++++
>  drivers/xen/xenbus/xenbus_comms.h       |    1 +
>  drivers/xen/xenbus/xenbus_dev_backend.c |   44 
> +++++++++++++++++++++++++++++++
>  include/xen/grant_table.h               |    2 +
>  include/xen/xenbus_dev.h                |   14 ++++++++++
>  5 files changed, 67 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..854315c 100644
> --- a/drivers/xen/xenbus/xenbus_dev_backend.c
> +++ b/drivers/xen/xenbus/xenbus_dev_backend.c
> @@ -8,7 +8,11 @@
>  
>  #include <xen/xen.h>
>  #include <xen/page.h>
> +#include <xen/xenbus.h>
>  #include <xen/xenbus_dev.h>
> +#include <xen/grant_table.h>
> +#include <xen/events.h>
> +#include <asm/xen/hypervisor.h>
>  
>  #include "xenbus_comms.h"
>  
> @@ -22,6 +26,43 @@ static int xenbus_backend_open(struct inode *inode, struct 
> file *filp)
>       return nonseekable_open(inode, filp);
>  }
>  
> +static long xenbus_alloc(void __user * data)
> +{
> +     struct ioctl_xenbus_alloc op;
> +     struct evtchn_alloc_unbound arg;
> +     int err;
> +
> +     if (copy_from_user(&op, data, sizeof(op)))
> +             return -EFAULT;
> +
> +     gnttab_grant_foreign_access_ref(GNTTAB_RESERVED_XENSTORE, op.dom,
> +                     virt_to_mfn(xen_store_interface), 0 /* writable */);
> +
> +     arg.dom = DOMID_SELF;
> +     arg.remote_dom = op.dom;
> +
> +     err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &arg);
> +     if (err)
> +             return err;
> +
> +     op.port = arg.port;
> +     op.grant_ref = GNTTAB_RESERVED_XENSTORE;
> +
> +     xs_suspend();
> +
> +     if (xen_store_evtchn > 0)
> +             xb_deinit_comms();
> +
> +     xen_store_evtchn = arg.port;
> +
> +     xs_resume();
> +
> +     if (copy_to_user(data, &op, sizeof(op)))
> +             return -EFAULT;
> +
> +     return 0;
> +}
> +
>  static long xenbus_backend_ioctl(struct file *file, unsigned int cmd, 
> unsigned long data)
>  {
>       if (!capable(CAP_SYS_ADMIN))
> @@ -33,6 +74,9 @@ static long xenbus_backend_ioctl(struct file *file, 
> unsigned int cmd, unsigned l
>                               return xen_store_evtchn;
>                       return -ENODEV;
>  
> +             case IOCTL_XENBUS_ALLOC:
> +                     return xenbus_alloc((void __user *)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 <xen/features.h>
>  
> +#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..b107be9 100644
> --- a/include/xen/xenbus_dev.h
> +++ b/include/xen/xenbus_dev.h
> @@ -38,4 +38,18 @@
>  #define IOCTL_XENBUS_BACKEND_EVTCHN                  \
>       _IOC(_IOC_NONE, 'B', 0, 0)
>  
> +#define IOCTL_XENBUS_ALLOC                           \
> +     _IOC(_IOC_NONE, 'B', 1, sizeof(struct ioctl_xenbus_alloc))
> +struct ioctl_xenbus_alloc {
> +     /* IN */
> +     /* The domain ID (must exist) for xenstore */
> +     uint16_t dom;
> +     uint16_t pad;
> +     /* OUT */
> +     /* The port allocated for xenbus communication */
> +     uint32_t port;
> +     /* Always set to GNTTAB_RESERVED_XENSTORE */
> +     uint32_t grant_ref;
> +};
> +
>  #endif /* __LINUX_XEN_XENBUS_DEV_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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