Bug 812295 - qemu: domxml-from-native: error parsing -m 2G: internal error cannot parse memory level '2G'
qemu: domxml-from-native: error parsing -m 2G: internal error cannot parse me...
Product: Virtualization Tools
Classification: Community
Component: libvirt (Show other bugs)
x86_64 Linux
unspecified Severity high
: ---
: ---
Assigned To: Libvirt Maintainers
Depends On:
  Show dependency treegraph
Reported: 2012-04-13 06:25 EDT by pitnvrsk
Modified: 2016-05-20 08:52 EDT (History)
11 users (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Last Closed: 2016-05-20 08:52:18 EDT
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---

Attachments (Terms of Use)

  None (edit)
Description pitnvrsk 2012-04-13 06:25:14 EDT
Description of problem:
Trying to convert with domxml-from-native to xml:
/usr/local/bin/qemu-system-x86_64 -m 2G -cpu qemu64 -smp 4 -enable-kvm -no-reboot \
	-net nic,vlan=0,model=virtio \
	-net tap,vlan=0,ifname=tap745,script=/etc/qemu-ifup,downscript=no \
	-drive file=./rootfs_fedora_cd.img,media=cdrom \
	-drive file=./pilvi_step1.img,media=cdrom \
	-nographic \
	-kernel ./bzImage-2.6.38.fc15.r49745 \
	-append "root=/dev/sr0 ro ip= mounts=,/var,nfs,nolock,rw console=ttyS0 earlyprintk=ttyS0 selinux=0" \
	-name pilvi-vm
Got domxml-from-native: error - internal error cannot parse memory level '2G'

Version-Release number of selected component (if applicable):
Libvirt 0.9.6

How reproducible:

Steps to Reproduce:
Try to convert this config.
Actual results:
Got domxml-from-native: error - internal error cannot parse memory level '2G'

Expected results:
This config works from console, suppose it is expected that it should be converted without failures in domxml-from-native.

Additional info:
Comment 1 pitnvrsk 2012-04-13 07:11:41 EDT
Have changed -m 2G to -m 2048 - helped.
After conversion:
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
    <type arch='x86_64'>hvm</type>
  <cpu match='exact'>
  <clock offset='utc'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='sdl'/>
      <model type='cirrus' vram='9216' heads='1'/>
    <memballoon model='virtio'/>
    <qemu:arg value='-enable-kvm'/>
    <qemu:arg value='\
    <qemu:arg value='nic,vlan=0,model=virtio'/>
    <qemu:arg value='\
    <qemu:arg value='tap,vlan=0,ifname=tap745,script=/etc/qemu-ifup,downscript=no'/>
    <qemu:arg value='\
    <qemu:arg value='file=./rootfs_fedora_cd.img,media=cdrom'/>
    <qemu:arg value='\
    <qemu:arg value='file=./pilvi_step1.img,media=cdrom'/>
    <qemu:arg value='\
    <qemu:arg value='\
    <qemu:arg value='./bzImage-2.6.38.fc15.r49745'/>
    <qemu:arg value='\
    <qemu:arg value='root=/dev/sr0 ro ip= mounts=,/var,nfs,nolock,rw console=ttyS0 earlyprintk=ttyS0 selinux=0'/>
    <qemu:arg value='\
    <qemu:arg value='pilvi-vm'/>

Have not found :  xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0
Comment 2 pitnvrsk 2012-04-13 07:21:57 EDT
Have tried to bring up VM with this xml config and got:

libvir: QEMU error : internal error guest CPU is not compatible with host CPU

But again original native startup string successfuly bringing up VM.
Comment 3 pitnvrsk 2012-04-13 07:40:51 EDT
After removing all backslashes "\" from original native string: have got an error during domxml-from-native conversion: 
error: internal error missing index/unit/bus parameter in drive 'file=./rootfs_fedora_cd.img, media=cdrom'
Comment 4 Cole Robinson 2016-04-21 17:12:53 EDT
The index/unit/bus stuff is tracked in bug 1205925

We can use this just to track the memory 2G issue
Comment 5 Cole Robinson 2016-04-21 17:22:40 EDT
A super simple reproducer from libvirt.git:

$ cat cmd.sh
qemu-kvm -m 2G
$ sudo ./tools/virsh domxml-from-native qemu-argv cmd.sh
error: internal error: cannot parse memory level '2G'

The error comes from src/qemu/qemu_parse_command.c qemuParseCommandLine function. The parsing only expects a straight number, not any characters. However libvirt already has a function to help parse numbers like that:

/* Scale an integer VALUE in-place by an optional case-insensitive
 * SUFFIX, defaulting to SCALE if suffix is NULL or empty (scale is
 * typically 1 or 1024).  Recognized suffixes include 'b' or 'bytes',
 * as well as power-of-two scaling via binary abbreviations ('KiB',
 * 'MiB', ...) or their one-letter counterpart ('k', 'M', ...), and
 * power-of-ten scaling via SI abbreviations ('KB', 'MB', ...).
 * Ensure that the result does not exceed LIMIT.  Return 0 on success,
 * -1 with error message raised on failure.  */
virScaleInteger(unsigned long long *value, const char *suffix,
                unsigned long long scale, unsigned long long limit)

See tools/vsh.c vshCommandOptScaledInt function for an easy example of how to invoke that function. Then it just needs to be adapted for the qemu code. Also 
you'll want to add a tests/qemuargv2xmltest.c test case
Comment 6 Cole Robinson 2016-05-20 08:52:18 EDT
Fixed upstream now:

commit 701b0f1867055bce3b29d27d23c6935ce94086af
Author: Nishith Shah <nishithshah.2211@gmail.com>
Date:   Fri May 20 07:09:03 2016 +0000

    qemu: parse: Handle suffixes for -m memory
    According to QEMU docs, the '-m' option for specifying RAM is by default
    in MiB, and a suffix of "M" or "G" may be passed for values in MiB and
    GiB respectively. This commit adds support and a test for the same.
    Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=812295
    Signed-off-by: Nishith Shah <nishithshah.2211@gmail.com>

Note You need to log in before you can comment on or make changes to this bug.