1. 18 1月, 2012 5 次提交
    • O
      qemu: Prohibit reattaching node device if it is in use · 7aeb9794
      Osier Yang 提交于
      It doesn't make sense to reattach a device to host while it's
      still in use, e.g, by a domain.
      7aeb9794
    • O
      qemu: Introduce inactive PCI device list · 6be610bf
      Osier Yang 提交于
      pciTrySecondaryBusReset checks if there is active device on the
      same bus, however, qemu driver doesn't maintain an effective
      list for the inactive devices, and it passes meaningless argument
      for parameter "inactiveDevs". e.g. (qemuPrepareHostdevPCIDevices)
      
      if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs)))
          return -1;
      
      ..skipped...
      
      if (pciResetDevice(dev, driver->activePciHostdevs, pcidevs) < 0)
          goto reattachdevs;
      
      NB, the "pcidevs" used above are extracted from domain def, and
      thus one won't be able to attach a device of which bus has other
      device even detached from host (nodedev-detach). To see more
      details of the problem:
      
      RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=773667
      
      This patch is to resolve the problem by introducing an inactive
      PCI device list (just like qemu_driver->activePciHostdevs), and
      the whole logic is:
      
        * Add the device to inactive list during nodedev-dettach
        * Remove the device from inactive list during nodedev-reattach
        * Remove the device from inactive list during attach-device
          (for non-managed device)
        * Add the device to inactive list after detach-device, only
          if the device is not managed
      
      With the above, we have a sufficient inactive PCI device list, and thus
      we can use it for pciResetDevice. e.g.(qemuPrepareHostdevPCIDevices)
      
      if (pciResetDevice(dev, driver->activePciHostdevs,
                         driver->inactivePciHostdevs) < 0)
          goto reattachdevs;
      6be610bf
    • D
      Add new attribute wrpolicy to <driver> element · d9e0d820
      Deepak C Shetty 提交于
      This introduces new attribute wrpolicy with only supported
      value as immediate. This will be an optional
      attribute with no defaults. This helps specify whether
      to skip the host page cache.
      
      When wrpolicy is specified, meaning when wrpolicy=immediate
      a writeback is explicitly initiated for the dirty pages in
      the host page cache as part of the guest file write operation.
      
      Usage:
      <filesystem type='mount' accessmode='passthrough'>
        <driver type='path' wrpolicy='immediate'/>
        <source dir='/export/to/guest'/>
        <target dir='mount_tag'/>
      </filesystem>
      
      Currently this only works with type='mount' for the QEMU/KVM driver.
      Signed-off-by: NDeepak C Shetty <deepakcs@linux.vnet.ibm.com>
      d9e0d820
    • J
      qemu: Don't break domain with 0:0:2.0 assigned to anything but VGA · 9619d8a6
      Jiri Denemark 提交于
      In the past we didn't reserve 0:0:2.0 PCI address if there was no video
      device assigned to a domain, which made it impossible to add a video
      device later on. So we fixed it (commit v0.9.0-37-g7b2cac12) by always
      reserving that address. However, that breaks existing domains without
      video devices that already have another device assigned to the
      problematic address.
      
      This patch reserves address 0:0:2.0 only in case it was not explicitly
      assigned to another device, which means libvirt will try to keep this
      address free and will not automatically assign it new devices. But
      existing domains for which older libvirt already assigned the address to
      a non-video device will keep working as they used to work before 0.9.1.
      Moreover, users who want to create a domain without a video device and
      use its address for another device may do so by explicitly configuring
      the PCI address in domain XML.
      9619d8a6
    • M
      Fixed dumpxml of <iotune> parameters · e1eb9347
      Martin Kletzander 提交于
      The output of dumpxml for <iotune> settings was misformatted, this
      patch just adds missing newlines.
      e1eb9347
  2. 17 1月, 2012 6 次提交
    • J
      qemu: Add support for host CPU modes · e7201afd
      Jiri Denemark 提交于
      This adds support for host-model and host-passthrough CPU modes to qemu
      driver. The host-passthrough mode is mapped to -cpu host.
      e7201afd
    • J
      Taint domains configured with cpu mode=host-passthrough · c8506d66
      Jiri Denemark 提交于
      There are several reasons for doing this:
      
      - the CPU specification is out of libvirt's control so we cannot
        guarantee stable guest ABI
      - not every feature of a CPU may actually work as expected when
        advertised directly to a guest
      - migration between two machines with exactly the same CPU may work but
        no guarantees can be made
      - this mode is not supported and its use is at one's own risk
      c8506d66
    • J
      cpu: Update guest CPU in host-* mode · 277bc0dc
      Jiri Denemark 提交于
      VIR_DOMAIN_XML_UPDATE_CPU flag for virDomainGetXMLDesc may be used to
      get updated custom mode guest CPU definition in case it depends on host
      CPU. This patch implements the same behavior for host-model and
      host-passthrough CPU modes.
      277bc0dc
    • J
      Add support for cpu mode attribute · f7dd3a4e
      Jiri Denemark 提交于
      The mode can be either of "custom" (default), "host-model",
      "host-passthrough". The semantics of each mode is described in the
      following examples:
      
      - guest CPU is a default model with specified topology:
          <cpu>
            <topology sockets='1' cores='2' threads='1'/>
          </cpu>
      
      - guest CPU matches selected model:
          <cpu mode='custom' match='exact'>
            <model>core2duo</model>
          </cpu>
      
      - guest CPU should be a copy of host CPU as advertised by capabilities
        XML (this is a short cut for manually copying host CPU specification
        from capabilities to domain XML):
          <cpu mode='host-model'/>
      
        In case a hypervisor does not support the exact host model, libvirt
        automatically falls back to a closest supported CPU model and
        removes/adds features to match host. This behavior can be disabled by
          <cpu mode='host-model'>
            <model fallback='forbid'/>
          </cpu>
      
      - the same as previous returned by virDomainGetXMLDesc with
        VIR_DOMAIN_XML_UPDATE_CPU flag:
          <cpu mode='host-model' match='exact'>
            <model fallback='allow'>Penryn</model>       --+
            <vendor>Intel</vendor>                         |
            <topology sockets='2' cores='4' threads='1'/>  + copied from
            <feature policy='require' name='dca'/>         | capabilities XML
            <feature policy='require' name='xtpr'/>        |
            ...                                          --+
          </cpu>
      
      - guest CPU should be exactly the same as host CPU even in the aspects
        libvirt doesn't model (such domain cannot be migrated unless both
        hosts contain exactly the same CPUs):
          <cpu mode='host-passthrough'/>
      
      - the same as previous returned by virDomainGetXMLDesc with
        VIR_DOMAIN_XML_UPDATE_CPU flag:
          <cpu mode='host-passthrough' match='minimal'>
            <model>Penryn</model>                        --+ copied from caps
            <vendor>Intel</vendor>                         | XML but doesn't
            <topology sockets='2' cores='4' threads='1'/>  | describe all
            <feature policy='require' name='dca'/>         | aspects of the
            <feature policy='require' name='xtpr'/>        | actual guest CPU
            ...                                          --+
          </cpu>
      f7dd3a4e
    • J
      cpu: Optionally forbid fallback CPU models · a6f88cbd
      Jiri Denemark 提交于
      In case a hypervisor doesn't support the exact CPU model requested by a
      domain XML, we automatically fallback to a closest CPU model the
      hypervisor supports (and make sure we add/remove any additional features
      if needed). This patch adds 'fallback' attribute to model element, which
      can be used to disable this automatic fallback.
      a6f88cbd
    • J
      Clarify semantics of virDomainMigrate{,ToURI}2 · 5e31e713
      Jiri Denemark 提交于
      Commit 5d784bd6 was a nice attempt to
      clarify the semantics by requiring domain name from dxml to either match
      original name or dname. However, setting dxml domain name to dname
      doesn't really work since destination host needs to know the original
      domain name to be able to use it in migration cookies. This patch
      requires domain name in dxml to match the original domain name. The
      change should be safe and backward compatible since migration would fail
      just a bit later in the process.
      5e31e713
  3. 14 1月, 2012 5 次提交
    • M
      conf: Remove do-nothing validation functions · bfbbc496
      Michael Ellerman 提交于
      There are three address validation routines that do nothing:
        virDomainDeviceDriveAddressIsValid()
        virDomainDeviceUSBAddressIsValid()
        virDomainDeviceVirtioSerialAddressIsValid()
      
      Remove them, and replace their call sites with "1" which is what they
      currently return. In some cases this means we can remove an entire
      if block.
      Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
      bfbbc496
    • M
      tests: Teach qemuxml2argvtest about spapr-vio addresses · 69dde2e6
      Michael Ellerman 提交于
      We can't call qemuCapsExtractVersionInfo() from test code, because it
      expects to be able to call the emulator, and for testing we have fake
      emulators that can't be executed. For that reason qemuxml2argvtest.c
      doesn't call qemuDomainAssignPCIAddresses(), instead it open codes its
      own version.
      
      That means we can't call qemuDomainAssignAddresses() from the test code,
      instead we need to manually call qemuDomainAssignSpaprVioAddresses().
      
      Also add logic to cope with qemuDomainAssignSpaprVioAddresses() failing,
      so that we can write a test that checks for a known failure in there.
      Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
      69dde2e6
    • P
      qemu: add virtio-scsi controller model · c9abfadf
      Paolo Bonzini 提交于
      Adding a new model for virtio-scsi roughly follows the same scheme
      as the previous patch.
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      c9abfadf
    • P
      qemu: add ibmvscsi controller model · 7b345b69
      Paolo Bonzini 提交于
      KVM will be able to use a PCI SCSI controller even on POWER.  Let
      the user specify the vSCSI controller by other means than a default.
      
      After this patch, the QEMU driver will actually look at the model
      and reject anything but auto, lsilogic and ibmvscsi.
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      7b345b69
    • A
      events: Return the correct number of registered events · c972237e
      Adam Litke 提交于
      Commit d09f6ba5 introduced a regression in event
      registration.  virDomainEventCallbackListAddID() will only return a positive
      integer if the type of event being registered is VIR_DOMAIN_EVENT_ID_LIFECYCLE.
      For other event types, 0 is always returned on success.  This has the
      unfortunate side effect of not enabling remote event callbacks because
      remoteDomainEventRegisterAny() uses the return value from the local call to
      determine if an event callback needs to be registered on the remote end.
      
      Make sure virDomainEventCallbackListAddID() returns the callback count for the
      eventID being registered.
      Signed-off-by: NAdam Litke <agl@us.ibm.com>
      c972237e
  4. 13 1月, 2012 6 次提交
    • P
      export virNetDevGetVirtualFunctions as a private symbol · ed6bd4bc
      Paolo Bonzini 提交于
      This avoids a linking error.
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      ed6bd4bc
    • O
      qemu: Support copy on read for disk · 5edfcaae
      Osier Yang 提交于
      The new introduced optional attribute "copy_on_read</code> controls
      whether to copy read backing file into the image file. The value can
      be either "on" or "off". Copy-on-read avoids accessing the same backing
      file sectors repeatedly and is useful when the backing file is over a
      slow network. By default copy-on-read is off.
      5edfcaae
    • M
      Added check for maximum number of vcpus exceeding topology limit · b54de083
      Martin Kletzander 提交于
      Earlier, when the number of vcpus was greater than the topology allowed,
      libvirt didn't raise an error and continued, resulting in running qemu
      with parameters making no sense. Even though qemu did not report any
      error itself, the number of vcpus was set to maximum allowed by the
      topology.
      b54de083
    • E
      uuid: fix off-by-one · 0327ff07
      Eric Blake 提交于
      Detected by Coverity.  Although unlikely, if we are ever started
      with stdin closed, we could reach a situation where we open a
      uuid file but then fail to close it, making that file the new
      stdin for the rest of the process.
      
      * src/util/uuid.c (getDMISystemUUID): Allow for stdin.
      0327ff07
    • D
      Rsync keymaps.csv file with GTK-VNC · 08272dc8
      Daniel P. Berrange 提交于
      08272dc8
    • D
      Re-write LXC controller end-of-file I/O handling yet again · 91303962
      Daniel P. Berrange 提交于
      Currently the LXC controller attempts to deal with EOF on a
      tty by spawning a thread to do an edge triggered epoll_wait().
      This avoids the normal event loop spinning on POLLHUP. There
      is a subtle mistake though - even after seeing POLLHUP on a
      master PTY, it is still perfectly possible & valid to write
      data to the PTY. There is a buffer that can be filled with
      data, even when no client is present.
      
      The second mistake is that the epoll_wait() thread was not
      looking for the EPOLLOUT condition, so when a new client
      connects to the LXC console, it had to explicitly send a
      character before any queued output would appear.
      
      Finally, there was in fact no need to spawn a new thread to
      deal with epoll_wait(). The epoll file descriptor itself
      can be poll()'d on normally.
      
      This patch attempts to deal with all these problems.
      
       - The blocking epoll_wait() thread is replaced by a poll
         on the epoll file descriptor which then does a non-blocking
         epoll_wait() to handle events
       - Even if POLLHUP is seen, we continue trying to write
         any pending output until getting EAGAIN from write.
       - Once write returns EAGAIN, we modify the epoll event
         mask to also look for EPOLLOUT
      
      * src/lxc/lxc_controller.c: Avoid stalled I/O upon
        connected to an LXC console
      91303962
  5. 12 1月, 2012 7 次提交
    • M
      stream: Check for stream EOF · 833b901c
      Michal Privoznik 提交于
      If client stream does not have any data to sink and neither received
      EOF, a dummy packet is sent to the daemon signalising client is ready to
      sink some data. However, after we added event loop to client a race may
      occur:
      
      Thread 1 calls virNetClientStreamRecvPacket and since no data are cached
      nor stream has EOF, it decides to send dummy packet to server which will
      sent some data in turn. However, during this decision and actual message
      exchange with server -
      
      Thread 2 receives last stream data from server. Therefore an EOF is set
      on stream and if there is a call waiting (which is not yet) it is woken
      up. However, Thread 1 haven't sent anything so far, so there is no call
      to be woken up. So this thread sent dummy packet to daemon, which
      ignores that as no stream is associated with such packet and therefore
      no reply will ever come.
      
      This race causes client to hang indefinitely.
      833b901c
    • D
      Do not generate security_model when fs driver is anything but 'path' · 99fbb386
      Deepak C Shetty 提交于
      QEMU does not support security_model for anything but 'path' fs driver type.
      Currently in libvirt, when security_model ( accessmode attribute) is not
      specified it auto-generates it irrespective of the fs driver type, which
      can result in a qemu error for drivers other than path. This patch ensures
      that the qemu cmdline is correctly generated by taking into account the
      fs driver type.
      Signed-off-by: NDeepak C Shetty <deepakcs@linux.vnet.ibm.com>
      99fbb386
    • S
      Added new option to virsh net-dumpxml called --inactive · 52d064f4
      Shradha Shah 提交于
      The above option helps to differentiate between implicit and explicit
      interface pools.
      52d064f4
    • S
      Functionality to implicitly get interface pool from SR-IOV PF. · 42c81d18
      Shradha Shah 提交于
      If a system has 64 or more VF's, it is quite tedious to mention each VF
      in the interface pool.
      The following modification will implicitly create an interface pool from
      the SR-IOV PF.
      42c81d18
    • S
      Adding the element pf to network xml. · b01b53de
      Shradha Shah 提交于
      This element will help the user to just specify the SR-IOV physical
      function in order to access all the Virtual functions attached to it.
      b01b53de
    • S
      Added Function virNetDevGetVirtualFunctions · 3a0c717b
      Shradha Shah 提交于
      This functions enables us to get the Virtual Functions attached to
      a Physical function given the name of a SR-IOV physical functio.
      
      In order to accomplish the task, added a getter function pciGetDeviceAddrString
      to get the BDF of the Virtual Function in a char array.
      3a0c717b
    • S
  6. 11 1月, 2012 11 次提交
    • E
      build: fix build on mingw with netcf available · 90cd1480
      Eric Blake 提交于
      The autobuilder pointed out an odd failure on mingw:
      ../../src/interface/netcf_driver.c:644:5: error: unknown field 'close_used_without_including_unistd_h' specified in initializer
      cc1: warnings being treated as errors
      
      This is because the gnulib headers #define close to different strings,
      according to which headers are included, in order to work around some
      odd mingw problems with close(), and these defines happen to also
      affect field members declared with a name of struct foo.close. As long
      as all headers are included before both the definition and use of the
      struct, the various #define doesn't matter, but the netcf file hit
      an instance where things were included in a different order.  Fix this
      for all clients that use a struct member named 'close'.
      
      * src/driver.h: Include <unistd.h> before using 'close'.
      90cd1480
    • E
      build: avoid spurious compiler warning · 18262b55
      Eric Blake 提交于
      For some weird reason, i686-pc-mingw32-gcc version 4.6.1 at -O2 complained:
      ../../src/conf/nwfilter_params.c: In function 'virNWFilterVarCombIterCreate':
      ../../src/conf/nwfilter_params.c:346:23: error: 'minValue' may be used uninitialized in this function [-Werror=uninitialized]
      ../../src/conf/nwfilter_params.c:319:28: note: 'minValue' was declared here
      ../../src/conf/nwfilter_params.c:344:23: error: 'maxValue' may be used uninitialized in this function [-Werror=uninitialized]
      ../../src/conf/nwfilter_params.c:319:18: note: 'maxValue' was declared here
      cc1: all warnings being treated as errors
      
      even though all paths of the preceding switch statement either
      assign the variables or return.
      
      * src/conf/nwfilter_params.c (virNWFilterVarCombIterAddVariable):
      Initialize variables.
      18262b55
    • S
      Address side effects of accessing vars via index · 64484d55
      Stefan Berger 提交于
      Address side effect of accessing a variable via an index: Filters
      accessing a variable where an element is accessed that is beyond the
      size of the list (for example $TEST[10] and only 2 elements are available)
      cannot instantiate that filter. Test for this and report proper error
      to user.
      64484d55
    • S
      Add access to elements of variables via index · caa6223a
      Stefan Berger 提交于
      This patch adds access to single elements of variables via index. Example:
      
        <rule action='accept' direction='in' priority='500'>
          <tcp srcipaddr='$ADDR[1]' srcportstart='$B[2]'/>
        </rule>
      
      caa6223a
    • S
      Introduce possibility to have an iterator per variable · 80e9a5cd
      Stefan Berger 提交于
      This patch introduces the capability to use a different iterator per
      variable.
      
      The currently supported notation of variables in a filtering rule like
      
        <rule action='accept' direction='out'>
           <tcp  srcipaddr='$A' srcportstart='$B'/>
        </rule>
      
      processes the two lists 'A' and 'B' in parallel. This means that A and B
      must have the same number of 'N' elements and that 'N' rules will be 
      instantiated (assuming all tuples from A and B are unique).
      
      In this patch we now introduce the assignment of variables to different
      iterators. Therefore a rule like
      
        <rule action='accept' direction='out'>
           <tcp  srcipaddr='$A[@1]' srcportstart='$B[@2]'/>
        </rule>
      
      will now create every combination of elements in A with elements in B since
      A has been assigned to an iterator with Id '1' and B has been assigned to an
      iterator with Id '2', thus processing their value independently.
      
      The first rule has an equivalent notation of
      
        <rule action='accept' direction='out'>
           <tcp  srcipaddr='$A[@0]' srcportstart='$B[@0]'/>
        </rule>
      80e9a5cd
    • S
      Optimize the elements the iterator visits. · 134c5676
      Stefan Berger 提交于
      In this patch we introduce testing whether the iterator points to a
      unique set of entries that have not been seen before at one of the previous
      iterations. The point is to eliminate duplicates and with that unnecessary
      filtering rules by preventing identical filtering rules from being
      instantiated.
      Example with two lists:
      
      list1 = [1,2,1]
      list2 = [1,3,1]
      
      The 1st iteration would take the 1st items of each list -> 1,1
      The 2nd iteration would take the 2nd items of each list -> 2,3
      The 3rd iteration would take the 3rd items of each list -> 1,1 but
      skip them since this same pair has already been encountered in the 1st
      iteration
      
      Implementation-wise this is solved by taking the n-th element of list1 and
      comparing it against elements 1..n-1. If no equivalent is found, then there
      is no possibility of this being a duplicate. In case an equivalent element
      is found at position i, then the n-th element in the 2nd list is compared
      against the i-th element in the 2nd list and if that is not the same, then
      this is a unique pair, otherwise it is not unique and we may need to do
      the same comparison on the 3rd list.
      
      134c5676
    • J
      apparmor: Mark pid parameter as unused · d82ef7c3
      Jiri Denemark 提交于
      d82ef7c3
    • D
      Change security driver APIs to use virDomainDefPtr instead of virDomainObjPtr · 99be754a
      Daniel P. Berrange 提交于
      When sVirt is integrated with the LXC driver, it will be neccessary
      to invoke the security driver APIs using only a virDomainDefPtr
      since the lxc_container.c code has no virDomainObjPtr available.
      Aside from two functions which want obj->pid, every bit of the
      security driver code only touches obj->def. So we don't need to
      pass a virDomainObjPtr into the security drivers, a virDomainDefPtr
      is sufficient. Two functions also gain a 'pid_t pid' argument.
      
      * src/qemu/qemu_driver.c, src/qemu/qemu_hotplug.c,
        src/qemu/qemu_migration.c, src/qemu/qemu_process.c,
        src/security/security_apparmor.c,
        src/security/security_dac.c,
        src/security/security_driver.h,
        src/security/security_manager.c,
        src/security/security_manager.h,
        src/security/security_nop.c,
        src/security/security_selinux.c,
        src/security/security_stack.c: Change all security APIs to use a
        virDomainDefPtr instead of virDomainObjPtr
      99be754a
    • E
      snapshot: allow reuse of existing files in disk snapshot · 4e9953a4
      Eric Blake 提交于
      When disk snapshots were first implemented, libvirt blindly refused
      to allow an external snapshot destination that already exists, since
      qemu will blindly overwrite the contents of that file during the
      snapshot_blkdev monitor command, and we don't like a default of
      data loss by default.  But VDSM has a scenario where NFS permissions
      are intentionally set so that the destination file can only be
      created by the management machine, and not the machine where the
      guest is running, so that libvirt will necessarily see the destination
      file already existing; adding a flag will allow VDSM to force the file
      reuse without libvirt complaining of possible data loss.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=767104
      
      * include/libvirt/libvirt.h.in (virDomainSnapshotCreateFlags): Add
      VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT.
      * src/libvirt.c (virDomainSnapshotCreateXML): Document it.  Add
      note about partial failure.
      * tools/virsh.c (cmdSnapshotCreate, cmdSnapshotCreateAs): Add new
      flag.
      * tools/virsh.pod (snapshot-create, snapshot-create-as): Document
      it.
      * src/qemu/qemu_driver.c (qemuDomainSnapshotDiskPrepare)
      (qemuDomainSnapshotCreateXML): Implement the new flag.
      4e9953a4
    • E
      docs: standardize description of flags · 529e4a50
      Eric Blake 提交于
      We had loads of different styles in describing the @flags parameter
      for various APIs, as well as several APIs that didn't list which
      enums provided the bit values valid for the flags.
      
      The end result is one of two formats:
      @flags: bitwise-OR of vir...Flags
      @flags: extra flags; not used yet, so callers should always pass 0
      
      * src/libvirt.c: Use common sentences for flags.  Also,
      (virDomainGetBlockIoTune): Mention virTypedParameterFlags.
      (virConnectOpenAuth): Mention virConnectFlags.
      (virDomainMigrate, virDomainMigrate2, virDomainMigrateToURI)
      (virDomainMigrateToURI2): Mention virDomainMigrateFlags.
      (virDomainMemoryPeek): Mention virDomainMemoryFlags.
      (virStoragePoolBuild): Mention virStoragePoolBuildFlags.
      (virStoragePoolDelete): Mention virStoragePoolDeleteFlags.
      (virStreamNew): Mention virStreamFlags.
      (virDomainOpenGraphics): Mention virDomainOpenGraphicsFlags.
      529e4a50
    • L
      qemu: check for kvm availability before starting kvm guests · 32f63e91
      Laine Stump 提交于
      This *kind of* addresses:
      
        https://bugzilla.redhat.com/show_bug.cgi?id=772395
      
      (it doesn't eliminate the failure to start, but causes libvirt to give
      a better idea about the cause of the failure).
      
      If a guest uses a kvm emulator (e.g. /usr/bin/qemu-kvm) and the guest
      is started when kvm isn't available (either because virtualization is
      unavailable / has been disabled in the BIOS, or the kvm modules
      haven't been loaded for some reason), a semi-cryptic error message is
      logged:
      
        libvirtError: internal error Child process (LC_ALL=C
        PATH=/sbin:/usr/sbin:/bin:/usr/bin /usr/bin/qemu-kvm -device ? -device
        pci-assign,? -device virtio-blk-pci,? -device virtio-net-pci,?) status
        unexpected: exit status 1
      
      This patch notices at process start that a guest needs kvm, and checks
      for the presence of /dev/kvm (a reasonable indicator that kvm is
      available) before trying to execute the qemu binary. If kvm isn't
      available, a more useful (too verbose??) error is logged.
      32f63e91