[libvirt] [PATCH LIBVIRT] libxl: Recognise ARM architectures

Only tested on v7 but the v8 equivalent seems pretty obvious. XEN_CAP_REGEX already accepts more than it should (e.g. x86_64p or x86_32be) but I have stuck with the existing pattern. With this I can create a guest from: <domain type='xen'> <name>libvirt-test</name> <uuid>6343998e-9eda-11e3-98f6-77252a7d02f3</uuid> <memory>393216</memory> <currentMemory>393216</currentMemory> <vcpu>1</vcpu> <os> <type arch='armv7l' machine='xenpv'>linux</type> <kernel>/boot/vmlinuz-arm-native</kernel> <cmdline>console=hvc0 earlyprintk debug root=/dev/xvda1</cmdline> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <disk type='block' device='disk'> <source dev='/dev/marilith-n0/debian-disk'/> <target dev='xvda1'/> </disk> <interface type='bridge'> <mac address='8e:a7:8e:3c:f4:f6'/> <source bridge='xenbr0'/> </interface> </devices> </domain> Using virsh create and I can destroy it too. Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null> I haven't investigated yet. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- src/libxl/libxl_conf.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4cefadf..7ed692d 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -61,7 +61,7 @@ struct guest_arch { int ia64_be; }; -#define XEN_CAP_REGEX "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x86_64|ia64|powerpc64)(p|be)?" +#define XEN_CAP_REGEX "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(aarch64|armv7l|x86_32|x86_64|ia64|powerpc64)(p|be)?" static virClassPtr libxlDriverConfigClass; @@ -319,8 +319,11 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps) } else if (STRPREFIX(&token[subs[2].rm_so], "powerpc64")) { arch = VIR_ARCH_PPC64; + } else if (STRPREFIX(&token[subs[2].rm_so], "armv7l")) { + arch = VIR_ARCH_ARMV7L; + } else if (STRPREFIX(&token[subs[2].rm_so], "aarch64")) { + arch = VIR_ARCH_AARCH64; } else { - /* XXX arm ? */ continue; } -- 1.7.10.4

On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote:
Only tested on v7 but the v8 equivalent seems pretty obvious.
XEN_CAP_REGEX already accepts more than it should (e.g. x86_64p or x86_32be) but I have stuck with the existing pattern.
With this I can create a guest from: <domain type='xen'> <name>libvirt-test</name> <uuid>6343998e-9eda-11e3-98f6-77252a7d02f3</uuid> <memory>393216</memory> <currentMemory>393216</currentMemory> <vcpu>1</vcpu> <os> <type arch='armv7l' machine='xenpv'>linux</type> <kernel>/boot/vmlinuz-arm-native</kernel> <cmdline>console=hvc0 earlyprintk debug root=/dev/xvda1</cmdline> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <disk type='block' device='disk'> <source dev='/dev/marilith-n0/debian-disk'/> <target dev='xvda1'/> </disk> <interface type='bridge'> <mac address='8e:a7:8e:3c:f4:f6'/> <source bridge='xenbr0'/> </interface> </devices> </domain>
Using virsh create and I can destroy it too.
Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null>
I haven't investigated yet.
That'll be because no <console> or <serial> device is listed in your config above I expect. Also looks like bogus error handling in the console API, not checking for <null>. ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Wed, 2014-02-26 at 12:37 +0000, Daniel P. Berrange wrote:
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote:
Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null>
I haven't investigated yet.
That'll be because no <console> or <serial> device is listed in your config above I expect. Also looks like bogus error handling in the console API, not checking for <null>.
Thanks. I've just tried (inside <devices>...</...>): <console tty='/dev/pts/5'/> and <console type='pty'> <target port='0'/> </console> which I gleaned from http://libvirt.org/drvxen.html but neither seem to do the trick (and the first ones use of an explicit pts looks odd to me...).
ACK
Thanks. Ian.

On Wed, Feb 26, Ian Campbell wrote:
On Wed, 2014-02-26 at 12:37 +0000, Daniel P. Berrange wrote:
Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null> That'll be because no <console> or <serial> device is
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote: listed in your config above I expect. Also looks like bogus error handling in the console API, not checking for <null>. Thanks. I've just tried (inside <devices>...</...>): <console tty='/dev/pts/5'/> and <console type='pty'> <target port='0'/> </console> which I gleaned from http://libvirt.org/drvxen.html but neither seem to do the trick (and the first ones use of an explicit pts looks odd to me...).
I learned yesterday this should be "serial" instead of "console", maybe it fixes also your case. Olaf

On Wed, 2014-02-26 at 15:00 +0100, Olaf Hering wrote:
On Wed, Feb 26, Ian Campbell wrote:
On Wed, 2014-02-26 at 12:37 +0000, Daniel P. Berrange wrote:
Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null> That'll be because no <console> or <serial> device is
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote: listed in your config above I expect. Also looks like bogus error handling in the console API, not checking for <null>. Thanks. I've just tried (inside <devices>...</...>): <console tty='/dev/pts/5'/> and <console type='pty'> <target port='0'/> </console> which I gleaned from http://libvirt.org/drvxen.html but neither seem to do the trick (and the first ones use of an explicit pts looks odd to me...).
I learned yesterday this should be "serial" instead of "console", maybe it fixes also your case.
My understanding was that this was for HVM guests, whereas ARM has a PV console but I suppose I should try it anyway. I've got a flight to catch so it'll be a few days I expect. Thanks, Ian.

On Wed, Feb 26, 2014 at 02:55:13PM +0000, Ian Campbell wrote:
On Wed, 2014-02-26 at 15:00 +0100, Olaf Hering wrote:
On Wed, Feb 26, Ian Campbell wrote:
On Wed, 2014-02-26 at 12:37 +0000, Daniel P. Berrange wrote:
Currently virsh console fails with: Connected to domain libvirt-test Escape character is ^] error: internal error: cannot find character device <null> That'll be because no <console> or <serial> device is
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote: listed in your config above I expect. Also looks like bogus error handling in the console API, not checking for <null>. Thanks. I've just tried (inside <devices>...</...>): <console tty='/dev/pts/5'/> and <console type='pty'> <target port='0'/> </console> which I gleaned from http://libvirt.org/drvxen.html but neither seem to do the trick (and the first ones use of an explicit pts looks odd to me...).
I learned yesterday this should be "serial" instead of "console", maybe it fixes also your case.
My understanding was that this was for HVM guests, whereas ARM has a PV console but I suppose I should try it anyway. I've got a flight to catch so it'll be a few days I expect.
Yep, if ARM has a PV console, then we'd need to add tiny bit to the XML to allow us to configure that explicitly, similar to how we do for KVM's virtio-console support. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Wed, 2014-02-26 at 15:01 +0000, Daniel P. Berrange wrote:
Yep, if ARM has a PV console, then we'd need to add tiny bit to the XML to allow us to configure that explicitly, similar to how we do for KVM's virtio-console support.
Do you mean I need to add something to the XML config snippet, or I need to add some special handling in the XML parser/consumer? I've grepped around the virtio-console stuff and I'm none the wiser. Thanks, Ian.

On Fri, Feb 28, 2014 at 02:12:30AM +0000, Ian Campbell wrote:
On Wed, 2014-02-26 at 15:01 +0000, Daniel P. Berrange wrote:
Yep, if ARM has a PV console, then we'd need to add tiny bit to the XML to allow us to configure that explicitly, similar to how we do for KVM's virtio-console support.
Do you mean I need to add something to the XML config snippet, or I need to add some special handling in the XML parser/consumer?
I've grepped around the virtio-console stuff and I'm none the wiser.
Opps, yes, I should have explained this better, since our docs here are about as clear as mud. With traditional x86 paravirt Xen, we just have the plain paravirt console devices <console type='pty'> <target type='xen'/> </console> With x86 fullvirt Xen/KVM/QEMU, the console type just defaults to being a serial port so you would usually just add <serial type='pty'> </serial> and then libvirt would automatically add a <console> with <console type='pty'> <target type='serial'/> </console> With x86 fullvirt KVM, we also have support for virtio which is done using <console type='pty'> <target type='virtio'/> </console> So actually this leads me to ask what kind of console Arm fullvirt Xen guests actually have ? If they just use the traditional Xen paravirt console, then we just need to make sure that this works for them by default: <console type='pty'> <target type='xen'/> </console> If there's a different type of console device that's not related to the Xen paravirt console device, then we'd need to invent a new <target type='xxx'/> value for Arm. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Fri, 28 Feb 2014, Daniel P. Berrange wrote:
On Fri, Feb 28, 2014 at 02:12:30AM +0000, Ian Campbell wrote:
On Wed, 2014-02-26 at 15:01 +0000, Daniel P. Berrange wrote:
Yep, if ARM has a PV console, then we'd need to add tiny bit to the XML to allow us to configure that explicitly, similar to how we do for KVM's virtio-console support.
Do you mean I need to add something to the XML config snippet, or I need to add some special handling in the XML parser/consumer?
I've grepped around the virtio-console stuff and I'm none the wiser.
Opps, yes, I should have explained this better, since our docs here are about as clear as mud.
With traditional x86 paravirt Xen, we just have the plain paravirt console devices
<console type='pty'> <target type='xen'/> </console>
With x86 fullvirt Xen/KVM/QEMU, the console type just defaults to being a serial port so you would usually just add
<serial type='pty'> </serial>
and then libvirt would automatically add a <console> with
<console type='pty'> <target type='serial'/> </console>
With x86 fullvirt KVM, we also have support for virtio which is done using
<console type='pty'> <target type='virtio'/> </console>
So actually this leads me to ask what kind of console Arm fullvirt Xen guests actually have ? If they just use the traditional Xen paravirt console, then we just need to make sure that this works for them by default:
<console type='pty'> <target type='xen'/> </console>
If there's a different type of console device that's not related to the Xen paravirt console device, then we'd need to invent a new <target type='xxx'/> value for Arm.
It is just the traditional Xen paravirt console.

On Fri, 2014-02-28 at 14:29 +0000, Stefano Stabellini wrote:
On Fri, 28 Feb 2014, Daniel P. Berrange wrote:
So actually this leads me to ask what kind of console Arm fullvirt Xen guests actually have ? If they just use the traditional Xen paravirt console, then we just need to make sure that this works for them by default:
<console type='pty'> <target type='xen'/> </console>
If there's a different type of console device that's not related to the Xen paravirt console device, then we'd need to invent a new <target type='xxx'/> value for Arm.
It is just the traditional Xen paravirt console.
I tried the above,which AIUI should work, but it fails with the same "cannot find character device <null>" error. I'll investigate properly next week. Ian.

On 02/26/2014 05:37 AM, Daniel P. Berrange wrote:
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote:
Only tested on v7 but the v8 equivalent seems pretty obvious.
XEN_CAP_REGEX already accepts more than it should (e.g. x86_64p or x86_32be) but I have stuck with the existing pattern.
With this I can create a guest from: <domain type='xen'> <name>libvirt-test</name> <uuid>6343998e-9eda-11e3-98f6-77252a7d02f3</uuid> <memory>393216</memory> <currentMemory>393216</currentMemory> <vcpu>1</vcpu> <os> <type arch='armv7l' machine='xenpv'>linux</type> <kernel>/boot/vmlinuz-arm-native</kernel> <cmdline>console=hvc0 earlyprintk debug root=/dev/xvda1</cmdline> </os>
ACK
I've gone ahead and pushed the patch. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Wed, 2014-02-26 at 06:34 -0700, Eric Blake wrote:
On 02/26/2014 05:37 AM, Daniel P. Berrange wrote:
On Wed, Feb 26, 2014 at 12:34:17PM +0000, Ian Campbell wrote:
Only tested on v7 but the v8 equivalent seems pretty obvious.
XEN_CAP_REGEX already accepts more than it should (e.g. x86_64p or x86_32be) but I have stuck with the existing pattern.
With this I can create a guest from: <domain type='xen'> <name>libvirt-test</name> <uuid>6343998e-9eda-11e3-98f6-77252a7d02f3</uuid> <memory>393216</memory> <currentMemory>393216</currentMemory> <vcpu>1</vcpu> <os> <type arch='armv7l' machine='xenpv'>linux</type> <kernel>/boot/vmlinuz-arm-native</kernel> <cmdline>console=hvc0 earlyprintk debug root=/dev/xvda1</cmdline> </os>
ACK
I've gone ahead and pushed the patch.
Wow, that was quick, thanks! Ian.
participants (6)
-
Daniel P. Berrange
-
Eric Blake
-
Ian Campbell
-
Ian Campbell
-
Olaf Hering
-
Stefano Stabellini