[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. applied. > > 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.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |