1. 17 8月, 2009 1 次提交
    • C
      Compressed save image format for Qemu. · 2d6a5819
      Chris Lalancette 提交于
      Implement a compressed save image format for qemu.  While ideally
      we would have the choice between compressed/non-compressed
      available to the libvirt API, unfortunately there is no "flags"
      parameter to the virDomainSave() API.  Therefore, implement this
      as a qemu.conf option.  gzip, bzip2, and lzma are implemented, and
      it should be very easy to implement additional compression
      methods.
      
      One open question is if/how we should detect the compression
      binaries.  One way to do it is to do compile-time setting of the
      paths (via configure.in), but that doesn't seem like a great thing
      to do.  My preferred solution is not to detect at all;
      when we go to run the commands that need them, if they
      aren't available, or aren't available in one of the standard paths,
      then we'll fail.  That's also the solution implemented in this patch.
      
      In the future, we'll have a more robust (managed) save/restore API,
      at which time we can expose this functionality properly in the API.
      
      V2: get rid of redundant dd command and just use >> to append data.
      V3: Add back the missing pieces for the enum and bumping the save version.
      V4: Make the compressed field in the save_header an int.
          Implement LZMA compression.
      Signed-off-by: NChris Lalancette <clalance@redhat.com>
      2d6a5819
  2. 14 8月, 2009 6 次提交
    • M
      Check active domain hostdevs before allowing PCI reset · c106c8a1
      Mark McLoughlin 提交于
      If a PCI device reset causes other devices to be reset, allow it so long
      as those other devices are note assigned to another active domain.
      
      Note, we need to take the driver lock qemudNodeDeviceReset() because the
      check function will iterate over the domain list.
      
      * src/qemu_conf.c: add qemuCheckPciHostDevice() to iterate over active
        domains checking whether the affected device is assigned
      
      * src/pci.[ch]: add pciDeviceEquals() helper
      c106c8a1
    • M
      Allow pciResetDevice() to reset multiple devices · 63188082
      Mark McLoughlin 提交于
      When using a Secondary Bus Reset, all devices on the bus are reset.
      
      Extend the pciResetDevice() API so that a 'check' callback can be
      supplied which will verify that it is safe to reset the other devices
      on the bus.
      
      The virDomainObjPtr parameter is needed so that when the check function
      iterates over the domain list, it can avoid double locking.
      
      * src/pci.[ch]: add a 'check' callback to pciResetDevice(), re-work
        pciIterDevices() to pass the check function to the iter functions,
        use the check function in the bus iterator, return the first unsafe
        device from pciBusCheckOtherDevices() and include its details in
        the bus reset error message.
      
      * src/qemu_driver.c, src/xen_uninified.c: just pass NULL as the
        check function for now
      63188082
    • M
      Improve PCI host device reset error message · ebea3418
      Mark McLoughlin 提交于
      Currently, if we are unable to reset a PCI device we return a fairly
      generic 'No PCI reset capability available' error message.
      
      Fix that by returning an error from the individual reset messages and
      using that error to construct the higher level error mesage.
      
      * src/pci.c: set errors in pciTryPowerManagementReset() and
        pciTrySecondaryBusReset() on failure; use those error messages
        in pciResetDevice(), or explain that no reset support is available
      ebea3418
    • M
      Reset and re-attach PCI host devices on guest shutdown · 4035152a
      Mark McLoughlin 提交于
      When the guest shuts down, we should attempt to restore all PCI host
      devices to a sane state.
      
      In the case of managed hostdevs, we should reset and re-attach the
      devices. In the case of unmanaged hostdevs, we should just reset them.
      
      Note, KVM will already reset assigned devices when the guest shuts
      down using whatever means it can, so we are only doing it to cover the
      cases the kernel can't handle.
      
      * src/qemu_driver.c: add qemuDomainReAttachHostDevices() and call
        it from qemudShutdownVMDaemon()
      4035152a
    • M
      Add host PCI device hotplug support · 0c5b7b93
      Mark McLoughlin 提交于
      Attaching a host PCI device to a qemu guest is done with a
      straightforward 'pci_add auto host host=XX:XX.X' command.
      
      Like with NIC and disk hotplug, we need to retain the guest PCI address
      assigned by qemu so that we can use it for hot-unplug.
      
      Identifying a device for detach is done using the host PCI address.
      
      Managed mode is handled by detaching/resetting the device before
      attaching it to the guest and re-attaching it after detaching it from
      the guest.
      
      * src/qemu_driver.c: add qemudDomainAttachHostPciDevice() and
        qemudDomainDetachHostPciDevice()
      
      * src/domain_conf.h: add somewhere to store the guest PCI address
      
      * src/domain_conf.c: handle formatting and parsing the guest PCI
        address
      0c5b7b93
    • M
      Re-factor hostdev hotplug · 7636ef46
      Mark McLoughlin 提交于
      Re-factor the hostdev hotplug code so that we can easily add PCI
      hostdev hotplug to qemudDomainAttachHostDevice().
      
      * src/qemu_driver.c: rename qemudDomainAttachHostDevice() to
        qemudDomainAttachHostUsbDevice(); make qemudDomainAttachHostDevice()
        handle all hostdev types
      
      * src/libvirt_private.syms: export a couple of hostdev related
        ToString() functions
      7636ef46
  3. 11 8月, 2009 2 次提交
  4. 10 8月, 2009 1 次提交
    • M
      chown kernel/initrd before spawning qemu · c42b3978
      Mark McLoughlin 提交于
      If we're running qemu unprivileged, we need to chown any supplied kernel
      or initrd before spawning it.
      
      * src/qemu_driver.c: rename qemuDomainSetDiskOwnership() to
        qemuDomainSetFileOwnership(), pass it a path string instead of a disk
        definition and use it for chowning the kernel/initrd in
        qemuDomainSetAllDeviceOwnership()
      c42b3978
  5. 02 8月, 2009 5 次提交
  6. 01 8月, 2009 2 次提交
  7. 31 7月, 2009 1 次提交
    • D
      Fix problem writing QEMU pidfile · 9a152d48
      Daniel P. Berrange 提交于
      * src/util.c: Don't drop capabilities until after the PID file has
        been written. Kill off child if writing the PID file fails
      * src/qemu_driver.c: Remove bogus trailing '/' in state dir
      9a152d48
  8. 29 7月, 2009 1 次提交
    • R
      qemu: fix monitor socket reconnection · abe3ee9c
      Ryota Ozaki 提交于
      * src/qemu_driver.c: fix qemudOpenMonitorUnix() to retry on ENOENT
        instead of EACCES which is the error one receive when the socket
        error hasn't shown up yet
      abe3ee9c
  9. 27 7月, 2009 11 次提交
    • D
      Fill in vCPU <-> pCPU current mapping, and vCPU cpuTime for QEMU · c4a04dc0
      Daniel P. Berrange 提交于
      * src/qemu_driver.c: implement missing features in qemudDomainGetVcpus
        for 'cpu' and 'cpuTime' fields
      c4a04dc0
    • M
      Add support for attaching network/bridge NICs in QEMU driver · 85453c42
      Mark McLoughlin 提交于
      In order to hotplug a network/bridge backed NIC, we need to first create
      the tap file descriptor, add the tap interface to the bridge and then
      pass the file descriptor to the qemu process using the 'getfd' monitor
      command.
      
      Once the tapfd has been accepted, we create the network backend using
      host_net_add, supplying the name assigned to the tapfd. If this fails,
      we need to close the tapfd in qemu using the 'closefd' monitor command.
      
      If the version of qemu does not support the getfd/closefd monitor
      commands we detect "unknown command" in the getfd reply and fail the
      attach operation.
      
      * src/qemu_driver.c: add support for tapfd based hotplug in
        qemudDomainAttachNetDevice()
      85453c42
    • M
      Add SCM_RIGHTS support to QEMU monitor code · 1daaebfa
      Mark McLoughlin 提交于
      Add qemudMonitorCommandWithFd() which allows a file descriptor to be
      sent to qemu over a unix monitor socket using SCM_RIGHTS. See the
      unix(7) and cmsg(3) man pages.
      
      * src/qemu_conf.c: add a scm_fd param to qemudMonitorCommandExtra(),
        add qemudMonitorCommandWithFd(), implement SCM_RIGHTS support in
        qemudMonitorSendUnix()
      1daaebfa
    • M
      Use sendmsg() on QEMU monitor socket · 7d9576ed
      Mark McLoughlin 提交于
      Switch from using write() to using sendmsg() on QEMU's monitor socket
      so that we can add support for SCM_RIGHTS.
      
      * src/qemu_driver.c: add sendmsg() based qemudMonitorSendUnix() and use
        it when the monitor fd is a unix socket
      7d9576ed
    • M
      Factor qemudMonitorSend() out of qemudMonitorCommandExtra() · 9de2972c
      Mark McLoughlin 提交于
      Add a little helper function to write the monitor command followed by
      carriage return in a single write.
      
      This doesn't make any real difference, but allows us to more easily
      switch to using sendmsg() when using the monitor over a unix socket.
      
      * src/qemu_conf.c: split qemudMonitorSend() out
      9de2972c
    • M
      Clean up error handling in qemudDomainAttachNetDevice() · be44cabd
      Mark McLoughlin 提交于
      In subsequent patches we're going to have a file descriptor to close
      too, so centralize the error handling cleanups to make things easier.
      
      * src/qemu_conf.c: in qemudDomainAttachNetDevice() consolidate the
        error handling cleanups together
      be44cabd
    • M
      Make qemuBuildHostNetStr() take tapfd as a string · 32db8dd7
      Mark McLoughlin 提交于
      With hotplug, we're going to want to pass a tapfd name rather than an
      actual file descriptor, so prepare the way by passing a string tapfd to
      qemuBuildHostNetStr().
      
      * src/qemu_conf.h: qemuBuildHostNetStr() takes a string tapfd now
      
      * src/qemu_conf.c: pass qemuBuildHostNetStr() a string rather than an
        actual file descriptor
      
      * src/qemu_driver.c: update qemudDomainAttachNetDevice() for change
      32db8dd7
    • M
      Only probe qemu for machine types when binary changes · 707302b2
      Mark McLoughlin 提交于
      By probing for qemu machine types, we increased the time of a
      GetCapabilities call from 100us to a whopping 60ms.
      
      This patch takes the approach of only probing for machine types
      when the mtime of the emulator binary changed since the last time
      the capabilities were generated.
      
      * src/capabilities.h: cache the emulator binary mtime
      
      * src/qemu_conf.c: add qemudGetOldMachines() to copy the machine
        types from the old caps struct if the mtime for the binary hasn't
        changed
      
      * src/qemu_conf.h, src/qemu_driver.c: pass the old caps pointer to
        qemudCapsInit()
      707302b2
    • M
      Probe QEMU directly for machine aliases if not found in capabilties · c14c6b08
      Mark McLoughlin 提交于
      Not all possible emulators are actually in the capabilities, so if we
      don't find the supplied emulator we should probe it directly for machine
      types.
      
      * src/qemu_driver.c: add qemudCanonicalizeMachineDirect() to directly
        probe an emulator for the canonical machine type
      c14c6b08
    • M
      Canonicalize qemu machine types · be291b33
      Mark McLoughlin 提交于
      In qemu-0.11 there is a 'pc-0.10' machine type which allows you to run
      guests with a machine which is compatible with the pc machine in
      qemu-0.10 - e.g. using the original PCI class for virtio-blk and
      virtio-console and disabling MSI support in virtio-net. The idea here
      is that we don't want to suprise guests by changing the hardware when
      qemu is updated.
      
      I've just posted some patches for qemu-0.11 which allows libvirt to
      canonicalize the 'pc' machine alias to the latest machine version.
      
      This patches makes us use that so that when a guest is configured to
      use the 'pc' machine type, we resolve that to 'pc-0.11' machine and
      save that in the guest XML.
      
      See also:
      
        https://fedoraproject.org/wiki/Features/KVM_Stable_Guest_ABI
      
      * src/qemu_conf.c: add qemudCanonicalizeMachine() to canonicalize
        the machine type according to the machine aliases in capabilities
      
      * src/qemu_driver.c: parse aliases in qemudParseMachineTypesStr()
      be291b33
    • C
      Don't allow NULL paths for BlockStats and InterfaceStats · 13f3d40c
      Cole Robinson 提交于
      Do the check in libvirt.c, to save drivers from the burden. This changes
      behavior slightly in the qemu driver: we no longer explictly error if
      passed an empty string. An error will still be thrown when the device
      lookup fails.
      13f3d40c
  10. 24 7月, 2009 5 次提交
    • D
      Make QEMU cgroups use configurable · f4c3acdf
      Daniel P. Berrange 提交于
       * qemud/libvirtd_qemu.aug, qemud/test_libvirtd_qemu.aug,
         src/qemu.conf: Add 'cgroups_controllers' and 'cgroups_device_acl'
         parameters
       * src/qemu_conf.h, src/qemu_conf.c: Load & parse configuration params
         for cgroups
       * src/qemu_driver.c: Only use cgroups controllers that are activated,
         and use configured device whitelist instead of default, if set.
      f4c3acdf
    • D
      Use cgroups for block device whitelisting in QEMU guests · e88d638a
      Daniel P. Berrange 提交于
      * src/qemu_driver.c: Set a restrictive block device whitelist for
        all QEMU guests. Update whitelist when hotplugging disks.
      * src/cgroup.h, src/cgroup.c: Add some more convenience methods
        for dealing with block device whitelists.
      e88d638a
    • D
      Implement schedular tunables API using cgroups · 55bc5090
      Daniel P. Berrange 提交于
      * src/qemu_driver.c:  Add driver methods qemuGetSchedulerType,
        qemuGetSchedulerParameters, qemuSetSchedulerParameters
      * src/lxc_driver.c: Fix to use unsigned long long consistently
        for schedular parameters
      * src/cgroup.h, src/cgroup.c: Fix cpu_shares to take unsigned
        long long
      * src/util.c, src/util.h, src/libvirt_private.syms: Add a
        virStrToDouble helper
      * src/virsh.c: Fix handling of --set arg to schedinfo command
        to honour the designated data type of each schedular tunable
        as declared by the driver
      55bc5090
    • D
      Place every QEMU guest in a private cgroup · 38f6f47b
      Daniel P. Berrange 提交于
      * src/qemu_driver.c: Place guest in cgroup upon startup. Remove
        cgroup upon shutdown
      38f6f47b
    • L
      Add bare format string to printf-derivatives troubles · 165ed4a0
      Laine Stump 提交于
      * src/datatypes.c src/domain_conf.c src/interface_conf.c
        src/lxc_driver.c src/qemu_driver.c src/storage_backend.c src/virsh.c:
        add bare %s format string to printf-derivatives called with no format
        string
      165ed4a0
  11. 22 7月, 2009 5 次提交
    • N
      Add support for physical memory access for QEmu · e4c48e02
      Nguyen Anh Quynh 提交于
      * include/libvirt/libvirt.h include/libvirt/libvirt.h.in: adds the new
        flag VIR_MEMORY_PHYSICAL for virDomainMemoryPeek
      * src/libvirt.c: update the front-end checking
      * src/qemu_driver.c: extend the QEmu driver
      e4c48e02
    • M
      Add support for network device detach · c2709cda
      Mark McLoughlin 提交于
      qemu network devices are hot-unplugged in two stages - first the PCI NIC
      is removed using 'pci_del <pci_addr>' and then the backend is removed
      using 'host_net_remove <vlan> <name>'.
      
      In order to perform these operations we need to have retained the
      PCI address, backend name and vlan number.
      
      * src/qemu_driver.c: add qemudDomainDetachNetDevice()
      c2709cda
    • M
      Retain PCI address from NIC attach · 4e21a95a
      Mark McLoughlin 提交于
      When we pci_add a NIC, we need to retain the PCI address assigned by
      qemu for using during detach.
      
      * src/qemu_driver.c: use qemudParsePciAddReply() to pull the PCI
        address from the pci_add reply
      
      * src/domain_conf.c: handle storing and parsing the PCI address in the
        domain state XML file
      4e21a95a
    • M
      Re-factor pci_add reply parsing and parse domain/bus numbers · ffec099e
      Mark McLoughlin 提交于
      The current code for parsing pci_add replies ignores the the domain and
      bus numbers. Re-write the code to rectify that.
      
      Also, since pci_add is used for NIC hotplug as well ask disk hotplug,
      re-factor the code into a separate function.
      
      * src/qemu_driver.c: add qemudParsePciAddReply() function which can
        handle parsing domain and bus numbers
      ffec099e
    • M
      Remove the network backend if NIC hotplug fails · d06f261c
      Mark McLoughlin 提交于
      If we fail to pci_add a NIC, we should remove the network backend and
      leave things the way we found them. To do that, we pre-allocate a
      host_net_remove monitor command and issue that if the pci_add fails.
      If the remove fails, we just log a warning.
      
      We can only do this if we have a name for the network backend and
      we know the vlan number its associated with.
      
      * src/qemu_driver.c: host_net_remove the network backend if the
        pci_add fails
      d06f261c