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

Re: [Xen-devel] [PATCH] hvc_xen: introduce HVC_XEN_FRONTEND



On Tue, Feb 21, 2012 at 11:30:42AM +0000, Stefano Stabellini wrote:
> Introduce a new config option HVC_XEN_FRONTEND to enable/disable the
> xenbus based pv console frontend.

One concern I have - not with this patch - but rather with the whole
PV consoel functionality - is how it is going to work with older 
hypervisors/QEMU.

I am specifically thinking about Amazon EC2 or 3.4 Xen installations.
I recall that a patch was required to QEMU to make this work flawlessly - so
perhaps all of this code should be gated on checking fora version (so Xen 4.2?)
or by looking for a 'feature-pv-on-hvm-console' XenBus attribute?


> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> ---
>  drivers/tty/hvc/Kconfig   |    8 +++
>  drivers/tty/hvc/hvc_xen.c |  116 
> ++++++++++++++++++++++++---------------------
>  2 files changed, 70 insertions(+), 54 deletions(-)
> 
> diff --git a/drivers/tty/hvc/Kconfig b/drivers/tty/hvc/Kconfig
> index 4222035..192e21e 100644
> --- a/drivers/tty/hvc/Kconfig
> +++ b/drivers/tty/hvc/Kconfig
> @@ -76,6 +76,14 @@ config HVC_XEN
>       help
>         Xen virtual console device driver
>  
> +config HVC_XEN_FRONTEND
> +     bool "Xen Hypervisor Multiple Consoles support"
> +     depends on HVC_XEN
> +     select XEN_XENBUS_FRONTEND
> +     default y
> +     help
> +       Xen driver for secondary virtual consoles
> +
>  config HVC_UDBG
>         bool "udbg based fake hypervisor console"
>         depends on PPC && EXPERIMENTAL
> diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
> index 26090c7..83d5c88 100644
> --- a/drivers/tty/hvc/hvc_xen.c
> +++ b/drivers/tty/hvc/hvc_xen.c
> @@ -55,7 +55,6 @@ struct xencons_info {
>  
>  static LIST_HEAD(xenconsoles);
>  static DEFINE_SPINLOCK(xencons_lock);
> -static struct xenbus_driver xencons_driver;
>  
>  /* ------------------------------------------------------------------ */
>  
> @@ -298,53 +297,6 @@ static int xen_initial_domain_console_init(void)
>       return 0;
>  }
>  
> -static int __init xen_hvc_init(void)
> -{
> -     int r;
> -     struct xencons_info *info;
> -     const struct hv_ops *ops;
> -
> -     if (!xen_domain())
> -             return -ENODEV;
> -
> -     if (xen_initial_domain()) {
> -             ops = &dom0_hvc_ops;
> -             r = xen_initial_domain_console_init();
> -             if (r < 0)
> -                     return r;
> -             info = vtermno_to_xencons(HVC_COOKIE);
> -     } else {
> -             ops = &domU_hvc_ops;
> -             if (xen_hvm_domain())
> -                     r = xen_hvm_console_init();
> -             else
> -                     r = xen_pv_console_init();
> -             if (r < 0)
> -                     return r;
> -
> -             info = vtermno_to_xencons(HVC_COOKIE);
> -             info->irq = bind_evtchn_to_irq(info->evtchn);
> -     }
> -     if (info->irq < 0)
> -             info->irq = 0; /* NO_IRQ */
> -     else
> -             irq_set_noprobe(info->irq);
> -
> -     info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256);
> -     if (IS_ERR(info->hvc)) {
> -             r = PTR_ERR(info->hvc);
> -             spin_lock(&xencons_lock);
> -             list_del(&info->list);
> -             spin_unlock(&xencons_lock);
> -             if (info->irq)
> -                     unbind_from_irqhandler(info->irq, NULL);
> -             kfree(info);
> -             return r;
> -     }
> -
> -     return xenbus_register_frontend(&xencons_driver);
> -}
> -
>  void xen_console_resume(void)
>  {
>       struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
> @@ -392,6 +344,9 @@ static int xen_console_remove(struct xencons_info *info)
>       return 0;
>  }
>  
> +#ifdef CONFIG_HVC_XEN_FRONTEND
> +static struct xenbus_driver xencons_driver;
> +
>  static int xencons_remove(struct xenbus_device *dev)
>  {
>       return xen_console_remove(dev_get_drvdata(&dev->dev));
> @@ -543,6 +498,65 @@ static const struct xenbus_device_id xencons_ids[] = {
>  };
>  
>  
> +static DEFINE_XENBUS_DRIVER(xencons, "xenconsole",
> +     .probe = xencons_probe,
> +     .remove = xencons_remove,
> +     .resume = xencons_resume,
> +     .otherend_changed = xencons_backend_changed,
> +);
> +#endif /* CONFIG_HVC_XEN_FRONTEND */
> +
> +static int __init xen_hvc_init(void)
> +{
> +     int r;
> +     struct xencons_info *info;
> +     const struct hv_ops *ops;
> +
> +     if (!xen_domain())
> +             return -ENODEV;
> +
> +     if (xen_initial_domain()) {
> +             ops = &dom0_hvc_ops;
> +             r = xen_initial_domain_console_init();
> +             if (r < 0)
> +                     return r;
> +             info = vtermno_to_xencons(HVC_COOKIE);
> +     } else {
> +             ops = &domU_hvc_ops;
> +             if (xen_hvm_domain())
> +                     r = xen_hvm_console_init();
> +             else
> +                     r = xen_pv_console_init();
> +             if (r < 0)
> +                     return r;
> +
> +             info = vtermno_to_xencons(HVC_COOKIE);
> +             info->irq = bind_evtchn_to_irq(info->evtchn);
> +     }
> +     if (info->irq < 0)
> +             info->irq = 0; /* NO_IRQ */
> +     else
> +             irq_set_noprobe(info->irq);
> +
> +     info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256);
> +     if (IS_ERR(info->hvc)) {
> +             r = PTR_ERR(info->hvc);
> +             spin_lock(&xencons_lock);
> +             list_del(&info->list);
> +             spin_unlock(&xencons_lock);
> +             if (info->irq)
> +                     unbind_from_irqhandler(info->irq, NULL);
> +             kfree(info);
> +             return r;
> +     }
> +
> +     r = 0;
> +#ifdef CONFIG_HVC_XEN_FRONTEND
> +     r = xenbus_register_frontend(&xencons_driver);
> +#endif
> +     return r;
> +}
> +
>  static void __exit xen_hvc_fini(void)
>  {
>       struct xencons_info *entry, *next;
> @@ -580,12 +594,6 @@ static int xen_cons_init(void)
>       return 0;
>  }
>  
> -static DEFINE_XENBUS_DRIVER(xencons, "xenconsole",
> -     .probe = xencons_probe,
> -     .remove = xencons_remove,
> -     .resume = xencons_resume,
> -     .otherend_changed = xencons_backend_changed,
> -);
>  
>  module_init(xen_hvc_init);
>  module_exit(xen_hvc_fini);
> -- 
> 1.7.2.5

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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