Skip to content
  • Markus Armbruster's avatar
    Fix -machine options accel, kernel_irqchip, kvm_shadow_mem · 36ad0e94
    Markus Armbruster authored
    
    
    Multiple -machine options with the same ID are merged.  All but the
    one without an ID are to be silently ignored.
    
    In most places, we query these options with a null ID.  This is
    correct.
    
    In some places, we instead query whatever options come first in the
    list.  This is wrong.  When the -machine processed first happens to
    have an ID, options are taken from that ID, and the ones specified
    without ID are silently ignored.
    
    Example:
    
        $ upstream-qemu -nodefaults -S -display none -monitor stdio -machine id=foo -machine accel=kvm,usb=on
        $ upstream-qemu -nodefaults -S -display none -monitor stdio -machine id=foo,accel=kvm,usb=on -machine accel=xen
        $ upstream-qemu -nodefaults -S -display none -monitor stdio -machine accel=xen -machine id=foo,accel=kvm,usb=on
    
        $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -machine accel=kvm,usb=on
        QEMU 1.5.50 monitor - type 'help' for more information
        (qemu) info kvm
        kvm support: enabled
        (qemu) info usb
        (qemu) q
        $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -machine id=foo -machine accel=kvm,usb=on
        QEMU 1.5.50 monitor - type 'help' for more information
        (qemu) info kvm
        kvm support: disabled
        (qemu) info usb
        (qemu) q
        $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -machine id=foo,accel=kvm,usb=on -machine accel=xen
        QEMU 1.5.50 monitor - type 'help' for more information
        (qemu) info kvm
        kvm support: enabled
        (qemu) info usb
        USB support not enabled
        (qemu) q
        $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -machine accel=xen -machine id=foo,accel=kvm,usb=on
        xc: error: Could not obtain handle on privileged command interface (2 = No such file or directory): Internal error
        xen be core: can't open xen interface
        failed to initialize Xen: Operation not permitted
    
    Option usb is queried correctly, and the one without an ID wins,
    regardless of option order.
    
    Option accel is queried incorrectly, and which one wins depends on
    option order and ID.
    
    Affected options are accel (and its sugared forms -enable-kvm and
    -no-kvm), kernel_irqchip, kvm_shadow_mem.
    
    Additionally, option kernel_irqchip is normally on by default, except
    it's off when no -machine options are given.  Bug can't bite, because
    kernel_irqchip is used only when KVM is enabled, KVM is off by
    default, and enabling always creates -machine options.  Downstreams
    that enable KVM by default do get bitten, though.
    
    Use qemu_get_machine_opts() to fix these bugs.
    
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Message-id: 1372943363-24081-5-git-send-email-armbru@redhat.com
    Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
    36ad0e94