1. 18 11月, 2013 4 次提交
    • J
      Return -1 in virPortAllocatorAcquire if all ports are used · 8c41794a
      Ján Tomko 提交于
      Report the error in virPortAllocatorAcquire instead
      of doing it in every caller.
      
      The error contains the port range name instead of the intended
      use for the port, e.g.:
      Unable to find an unused port in range 'display' (65534-65535)
      instead of:
      Unable to find an unused port for SPICE
      
      This also adds error reporting when the QEMU driver could not
      find an unused port for VNC, VNC WebSockets or NBD migration.
      8c41794a
    • J
      Add a name to virPortAllocator · d16d90fd
      Ján Tomko 提交于
      This allows its error messages to be more specific.
      d16d90fd
    • J
      Don't release spice port twice when no TLS port is available · 28ea39a0
      Ján Tomko 提交于
      Introduced by 7b4a6304.
      28ea39a0
    • J
      Properly unref a connection with a close callback · e68432e4
      Ján Tomko 提交于
      The connection pointer in the closeCallback data was never
      initialized, making the unref in remoteClientCloseFunc a no-op.
      
      This fixes the following leak in virsh when the daemon closes
      the connection unexpectedly:
      
      1,179 (288 direct, 891 indirect) bytes in 1 blocks are
         definitely lost in loss record 745 of 792
        at 0x4C2A6D0: calloc (in vgpreload_memcheck-amd64-linux.so)
        by 0x4E9643D: virAllocVar (viralloc.c:558)
        by 0x4ED2425: virObjectNew (virobject.c:190)
        by 0x4F675AC: virGetConnect (datatypes.c:116)
        by 0x4F6EA06: do_open (libvirt.c:1136)
        by 0x4F71017: virConnectOpenAuth (libvirt.c:1481)
        by 0x129FFA: vshReconnect (virsh.c:337)
        by 0x128310: main (virsh.c:2470)
      e68432e4
  2. 15 11月, 2013 8 次提交
    • E
      docs: improve job info details · 6385283a
      Eric Blake 提交于
      Noticed while revieweing the patches for qemu's new migration state.
      
      * include/libvirt/libvirt.h.in (_virDomainJobInfo): Fix typo,
      grammar.
      * src/libvirt.c (virDomainGetJobInfo): Add cross reference.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      6385283a
    • M
      Fix migration with QEMU 1.6 · d35ae414
      Michael Avdienko 提交于
      QEMU 1.6.0 introduced new migration status: setup
      Libvirt does not expect such string in QMP and refuses to migrate with error
      "unexpected migration status in setup"
      
      This patch fixes it.
      Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
      d35ae414
    • J
      qemu: Call qemuSetupHostdevCGroup later during hotplug · 05e149f9
      Jiri Denemark 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1025108
      
      So far qemuSetupHostdevCGroup was called very early during hotplug, even
      before we knew the device we were about to hotplug was actually
      available. By calling the function later, we make sure QEMU won't be
      allowed to access devices used by other domains.
      
      Another important effect of this change is that hopluging USB devices
      specified by vendor and product (but not by their USB address) works
      again. This was broken since v1.0.5-171-g7d763aca, when the call to
      qemuFindHostdevUSBDevice was moved after the call to
      qemuSetupHostdevCGroup, which then used an uninitialized USB address.
      05e149f9
    • M
      qemuMonitorIO: Don't use @mon after it's unrefed · f417ad07
      Michal Privoznik 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1018267
      
      The aim of virObject refing and urefing is to tell where the object is
      to be used and when is no longer needed. Hence any object shouldn't be
      used after it has been unrefed, as we might be the last to hold the
      reference. The better way is to call virObjectUnref() *after* the last
      object usage. In this specific case, the monitor EOF handler was called
      after the qemuMonitorIO called virObjectUnref. Not only that @mon was
      disposed (which is not used in the handler anyway) but the @mon->vm
      which is causing a SIGSEGV:
      
      2013-11-15 10:17:54.425+0000: 20110: error : qemuMonitorIO:688 : internal error: early end of file from monitor: possible problem:
      qemu-kvm: -incoming tcp:01.01.01.0:49152: Failed to bind socket: Cannot assign requested address
      
      Program received signal SIGSEGV, Segmentation fault.
      qemuProcessHandleMonitorEOF (mon=<optimized out>, vm=0x7fb728004170) at qemu/qemu_process.c:299
      299         if (priv->beingDestroyed) {
      (gdb) p *priv
      Cannot access memory at address 0x0
      (gdb) p vm
      $1 = (virDomainObj *) 0x7fb728004170
      (gdb) p *vm
      $2 = {parent = {parent = {magic = 3735928559, refs = 0, klass = 0xdeadbeef}, lock = {lock = {__data = {__lock = 2, __count = 0, __owner = 20110, __nusers = 1, __kind = 0, __spins = 0, __list = {__prev = 0x0,
                  __next = 0x0}}, __size = "\002\000\000\000\000\000\000\000\216N\000\000\001", '\000' <repeats 26 times>, __align = 2}}}, pid = 0, state = {state = 0, reason = 0}, autostart = 0, persistent = 0,
        updated = 0, def = 0x0, newDef = 0x0, snapshots = 0x0, current_snapshot = 0x0, hasManagedSave = false, privateData = 0x0, privateDataFreeFunc = 0x0, taint = 304}
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      f417ad07
    • M
      qemuProcessReconnectHelper: Don't create joinable thread · 3367c21d
      Michal Privoznik 提交于
      In the qemuProcessReconnectHelper() a new thread that does all the
      interesting work is spawned. The rationale is to not block the daemon
      startup process in case of unresponsive qemu. However, the thread
      handler is a local variable which gets lost once the control goes out of
      scope. Hence the thread gets leaked. We can avoid this if the thread
      isn't made joinable.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      3367c21d
    • M
      virDomainEventCallbackListFree: Don't leak @list->callbacks · ea13a759
      Michal Privoznik 提交于
      The @list->callbacks is an array that is inflated whenever a new event
      is added, e.g. via virDomainEventCallbackListAddID(). However, when we
      are freeing the array, we free the items within it but forgot to
      actually free it.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      ea13a759
    • M
      virPCIDeviceBindToStub: Remove unused @oldDriverPath and @oldDriverName · a5936755
      Michal Privoznik 提交于
      These two chunks had to be part of df4283a5. But for some unclear
      reason, the weren't. Anyway, these two variables are not used anywhere
      within function. They're initialized to NULL and then VIR_FREE()-d. And
      there's no reason do do two NOPs, right?
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      a5936755
    • M
  3. 13 11月, 2013 4 次提交
    • J
      Disable nwfilter driver when running unprivileged · b7829f95
      Ján Tomko 提交于
      When opening a new connection to the driver, nwfilterOpen
      only succeeds if the driverState has been allocated.
      
      Move the privilege check in driver initialization before
      the state allocation to disable the driver.
      
      This changes the nwfilter-define error from:
      error: cannot create config directory (null): Bad address
      To:
      this function is not supported by the connection driver:
      virNWFilterDefineXML
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1029266
      b7829f95
    • J
      libxl: Fix Xen 4.4 libxlVmStart logic · 7d58c7fc
      Jason Andryuk 提交于
      ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS hides a multi-line body
      for a brace-less else.  Add braces to ensure proper logic is applied.
      
      Without this fix, new domains cannot be started.  Both
      libxl_domain_create_new and libxl_domain_create_restore are called when
      starting a new domain leading to this error:
      libxl: error: libxl.c:324:libxl__domain_rename: domain with name "guest" already exists.
      libxl: error: libxl_create.c:800:initiate_domain_create: cannot make domain: -6
      7d58c7fc
    • P
      qemu: Check for presence of device and properities when getting CPUID · 84f69602
      Peter Krempa 提交于
      The QOM path in qemu that contains the CPUID registers of a running VM
      may not be present (introduced in QEMU 1.5).
      
      Since commit d94b7817 we have a regression with QEMU that don't
      support reporting of the CPUID register state via the monitor as the
      process startup code expects the path to exist.
      
      This patch adds code that checks with the monitor if the requested path
      already exists and uses it only in this case.
      84f69602
    • P
      qemu: Change return type of qemuMonitorGetGuestCPU() · a6a6f84a
      Peter Krempa 提交于
      To allow returning more granular errors, change the error type to an
      integer.
      a6a6f84a
  4. 12 11月, 2013 7 次提交
  5. 11 11月, 2013 1 次提交
    • M
      virSecurityLabelDefParseXML: Don't parse label on model='none' · 9fb3f957
      Michal Privoznik 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1027096
      
      If there's the following snippet in the domain XML, the domain will be
      lost upon the daemon restart (if the domain is started prior restart):
      
          <seclabel type='dynamic' relabel='yes'/>
      
      The problem is, the 'label', 'imagelabel' and 'baselabel' are parsed
      whenever the VIR_DOMAIN_XML_INACTIVE is *not* present or the label is
      static. The latter is not our case, obviously. So, when libvirtd starts
      up, it finds domain state xml and parse it. During parsing, many XML
      flags are enabled but VIR_DOMAIN_XML_INACTIVE. Hence, our parser tries
      to extract 'label', 'imagelabel' and 'baselabel' from the XML which
      fails for model='none'. Err, this model - even though not specified in
      XML - can be taken from qemu wide config file: /etc/libvirtd/qemu.conf.
      
      However, in order to know we are dealing with model='none' the code in
      question must be moved forward a bit. Then a new check must be
      introduced. This is what the first two chunks are doing.
      
      But this alone is not sufficient. The domain state XML won't contain the
      model attribute without slight modification. The model should be
      inserted into the XML even if equal to 'none' and the state XML is being
      generated - what if the origin (the @security_driver variable in
      qemu.conf) changes during libvirtd restarts?
      
      At the end, a test to catch this scenario is introduced.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      9fb3f957
  6. 09 11月, 2013 2 次提交
  7. 08 11月, 2013 14 次提交
    • V
      qemu: Fix SCSI hotplug on pseries guests · efdd591d
      Vitor de Lima 提交于
      This patch moves some code in the qemuDomainAttachSCSIDisk
      function. The check for the existence of a PCI address assigned
      to the SCSI controller was moved in order to be executed only
      when needed. The PCI address of a controller is not necessary
      if QEMU_CAPS_DEVICE is supported.
      
      This fixes issues with the hotplug of SCSI disks on pseries guests.
      efdd591d
    • L
      pci: properly handle out-of-order SRIOV virtual functions · 88c1fcd5
      Laine Stump 提交于
      This resolves:
      
        https://bugzilla.redhat.com/show_bug.cgi?id=1025397
      
      When virPCIGetVirtualFunctions created the list of an SRIOV Physical
      Function's (PF) Virtual Functions (VF), it had assumed that the order
      of "virtfn*" links returned by readdir() from the PF's sysfs directory
      was already in the correct order. Experience has shown that this is
      not always the case - it can be in alphabetical order (which would
      e.g. place virtfn11 before virtfn2) or even some seemingly random
      order (see the example in the bugzilla report)
      
      This results in 1) incorrect assumptions made by consumers of the
      output of the virt_functions list of virsh nodedev-dumpxml, and 2)
      setting MAC address and vlan tag on the wrong VF (since libvirt uses
      netlink to set mac address and vlan tag, netlink requires the VF#, and
      the function virPCIGetVirtualFunctionIndex() returns the wrong index
      due to the improperly ordered VF list).
      
      The solution provided by this patch is for virPCIGetVirtualFunctions
      to no longer scan the entire device directory in its natural order,
      but instead to check for links individually by name "virtfn%d" where
      %d starts at 0 and increases with each success. Since VFs are created
      contiguously by the kernel, this will guarantee that all VFs are
      found, and placed in the arry in the correct order.
      
      One note of use to the uninitiated is that VIR_APPEND_ELEMENT always
      either increments *num_virtual_functions or fails, so no this isn't an
      endless loop.
      
      (NB: the SRIOV_* defines at the top of virpci.c were removed
      because they are unnecessary and/or not used.)
      88c1fcd5
    • L
      util: use size_t instead of unsigned int for num_virtual_functions · 89e2a6c8
      Laine Stump 提交于
      This is a prerequisite to the fix for the fix to:
      
        https://bugzilla.redhat.com/show_bug.cgi?id=1025397
      
      num_virtual_functions needs to be size_t in order to use the
      VIR_APPEND_ELEMENT macro.
      89e2a6c8
    • V
      qemu: assign PCI address to primary video card · 54e4d9d0
      Vitor de Lima 提交于
      When adding support for Q35 guests, the code to assign a PCI address
      to the primary video card was moved into Q35 and i440fx(PIIX3)
      specific functions, but no fallback was kept for other machine types
      that might have a video card.
      
      This patch remedies that by assigning a PCI address to the primary
      video card if it does not have any kind of address.  In particular,
      this fixes issues with pseries guests.
      Signed-off-by: NVitor de Lima <vitor.lima@eldorado.org.br>
      Signed-off-by: NLaine Stump <laine@laine.org>
      54e4d9d0
    • S
      util: use -w flag when calling iptables · ba95426d
      Serge Hallyn 提交于
      When supported, ask iptables to wait rather than fail if it is in use
      by another caller (like ufw).
      
      (See https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1245322)
      Signed-off-by: NSerge Hallyn <serge.hallyn@ubuntu.com>
      ba95426d
    • P
      qemu: process: Validate specific CPUID flags of a guest · d94b7817
      Peter Krempa 提交于
      When starting a VM the qemu process may filter out some requested
      features of a domain as it's not supported either by the host or by
      qemu. Libvirt didn't check if this happened which might end up in
      changing of the guest ABI when migrating.
      
      The proof of concept implementation adds the check for the recently
      introduced kvm_pv_unhalt cpuid feature bit. This feature depends on both
      qemu and host kernel support and thus increase the possibility of guest
      ABI breakage.
      d94b7817
    • P
      qemu: Add support for paravirtual spinlocks in the guest · e0dc8511
      Peter Krempa 提交于
      The linux kernel recently added support for paravirtual spinlock
      handling to avoid performance regressions on overcomitted hosts. This
      feature needs to be turned in the hypervisor so that the guest OS is
      notified about the possible support.
      
      This patch adds a new feature "paravirt-spinlock" to the XML and
      supporting code to enable the "kvm_pv_unhalt" pseudo CPU feature in
      qemu.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1008989
      e0dc8511
    • P
      conf: Refactor storing and usage of feature flags · de7b5faf
      Peter Krempa 提交于
      Currently we were storing domain feature flags in a bit field as the
      they were either enabled or disabled. New features such as paravirtual
      spinlocks however can be tri-state as the default option may depend on
      hypervisor version.
      
      To allow storing tri-state feature state in the same place instead of
      having to declare dedicated variables for each feature this patch
      refactors the bit field to an array.
      de7b5faf
    • P
      cpu: x86: Add internal CPUID features support and KVM feature bits · 2e8f9080
      Peter Krempa 提交于
      Some of the emulator features are presented in the <features> element in
      the domain XML although they are virtual CPUID feature bits when
      presented to the guest. To avoid confusing the users with these
      features, as they are not configurable via the <cpu> element, this patch
      adds an internal array where those can be stored privately instead of
      exposing them in the XML.
      
      Additionaly KVM feature bits are added as example usage of this code.
      2e8f9080
    • J
      qemu: Add monitor APIs to fetch CPUID data from QEMU · 3afde075
      Jiri Denemark 提交于
      The qemu monitor supports retrieval of actual CPUID bits presented to
      the guest using QMP monitor. Add APIs to extract these information and
      tests for them.
      Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
      3afde075
    • P
      cpu_x86: Refactor storage of CPUID data to add support for KVM features · f80a11c9
      Peter Krempa 提交于
      The CPUID functions were stored in multiple arrays according to a
      specified prefix of those. This made it very hard to add another prefix
      to store KVM CPUID features (0x40000000). Instead of hardcoding a third
      array this patch changes the approach used:
      
      The code is refactored to use a single array where the CPUID functions
      are stored ordered by the cpuid function so that they don't depend on
      the specific prefix and don't waste memory. The code is also less
      complex using this approach. A trateoff to this is the change from O(N)
      complexity to O(N^2) in x86DataAdd and x86DataSubtract. The rest of the
      functions were already using O(N^2) algorithms.
      f80a11c9
    • L
      storage: Fix a vol-clone bug on ppc64 · 4ffcb020
      Li Zhang 提交于
      vol-clone reports out of memory error with disk type on ppc64.
      
      Currently, wbytes is defined as size_t type (8 bytes), but
      args's value in ioctl(fd, args..) in kernel is int (4 bytes).
      This makes wbytes 2^32 times larger, causing an out of memory error.
      
      This patch changes size_t to int to synchronize with kernel.
      
      [1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/block/ioctl.c?id=5e01dc7b#n363
      [2] https://lkml.org/lkml/2013/11/1/620Signed-off-by: NLi Zhang <zhlcindy@linux.vnet.ibm.com>
      Signed-off-by: NJán Tomko <jtomko@redhat.com>
      4ffcb020
    • M
      qemu: Don't access vm->priv on unlocked domain · 1f2f879e
      Michal Privoznik 提交于
      Since 86d90b3a (yes, my patch; again) we are supporting NBD storage
      migration. However, on error recovery path we got the steps reversed.
      The correct order is: return NBD port to the virPortAllocator and then
      either unlock the vm or remove it from the driver. Not vice versa.
      
      ==11192== Invalid write of size 4
      ==11192==    at 0x11488559: qemuMigrationPrepareAny (qemu_migration.c:2459)
      ==11192==    by 0x11488EA6: qemuMigrationPrepareDirect (qemu_migration.c:2652)
      ==11192==    by 0x114D1509: qemuDomainMigratePrepare3Params (qemu_driver.c:10332)
      ==11192==    by 0x519075D: virDomainMigratePrepare3Params (libvirt.c:7290)
      ==11192==    by 0x1502DA: remoteDispatchDomainMigratePrepare3Params (remote.c:4798)
      ==11192==    by 0x12DECA: remoteDispatchDomainMigratePrepare3ParamsHelper (remote_dispatch.h:5741)
      ==11192==    by 0x5212127: virNetServerProgramDispatchCall (virnetserverprogram.c:435)
      ==11192==    by 0x5211C86: virNetServerProgramDispatch (virnetserverprogram.c:305)
      ==11192==    by 0x520A8FD: virNetServerProcessMsg (virnetserver.c:165)
      ==11192==    by 0x520A9E1: virNetServerHandleJob (virnetserver.c:186)
      ==11192==    by 0x50DA78F: virThreadPoolWorker (virthreadpool.c:144)
      ==11192==    by 0x50DA11C: virThreadHelper (virthreadpthread.c:161)
      ==11192==  Address 0x1368baa0 is 576 bytes inside a block of size 688 free'd
      ==11192==    at 0x4A07F5C: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==11192==    by 0x5079A2F: virFree (viralloc.c:580)
      ==11192==    by 0x11456C34: qemuDomainObjPrivateFree (qemu_domain.c:267)
      ==11192==    by 0x50F41B4: virDomainObjDispose (domain_conf.c:2034)
      ==11192==    by 0x50C2991: virObjectUnref (virobject.c:262)
      ==11192==    by 0x50F4CFC: virDomainObjListRemove (domain_conf.c:2361)
      ==11192==    by 0x1145C125: qemuDomainRemoveInactive (qemu_domain.c:2087)
      ==11192==    by 0x11488520: qemuMigrationPrepareAny (qemu_migration.c:2456)
      ==11192==    by 0x11488EA6: qemuMigrationPrepareDirect (qemu_migration.c:2652)
      ==11192==    by 0x114D1509: qemuDomainMigratePrepare3Params (qemu_driver.c:10332)
      ==11192==    by 0x519075D: virDomainMigratePrepare3Params (libvirt.c:7290)
      ==11192==    by 0x1502DA: remoteDispatchDomainMigratePrepare3Params (remote.c:4798)
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      1f2f879e
    • M
      qemu: Avoid double free of VM · 5a4c2374
      Michal Privoznik 提交于
      One of my previous patches (c7ac2519) did try to fix the issue when
      domain dies too soon during migration. However, this clumsy approach was
      missing removal of qemuProcessHandleMonitorDestroy resulting in double
      unrefing of mon->vm and hence producing the daemon crash:
      
      ==11843== Invalid read of size 4
      ==11843==    at 0x50C28C5: virObjectUnref (virobject.c:255)
      ==11843==    by 0x1148F7DB: qemuMonitorDispose (qemu_monitor.c:258)
      ==11843==    by 0x50C2991: virObjectUnref (virobject.c:262)
      ==11843==    by 0x50C2D13: virObjectFreeCallback (virobject.c:388)
      ==11843==    by 0x509C37B: virEventPollCleanupHandles (vireventpoll.c:583)
      ==11843==    by 0x509C711: virEventPollRunOnce (vireventpoll.c:652)
      ==11843==    by 0x509A620: virEventRunDefaultImpl (virevent.c:274)
      ==11843==    by 0x520D21C: virNetServerRun (virnetserver.c:1112)
      ==11843==    by 0x11F368: main (libvirtd.c:1513)
      ==11843==  Address 0x13b88864 is 4 bytes inside a block of size 136 free'd
      ==11843==    at 0x4A07F5C: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==11843==    by 0x5079A2F: virFree (viralloc.c:580)
      ==11843==    by 0x50C29E3: virObjectUnref (virobject.c:270)
      ==11843==    by 0x114770E4: qemuProcessHandleMonitorDestroy (qemu_process.c:1103)
      ==11843==    by 0x1148F7CB: qemuMonitorDispose (qemu_monitor.c:257)
      ==11843==    by 0x50C2991: virObjectUnref (virobject.c:262)
      ==11843==    by 0x50C2D13: virObjectFreeCallback (virobject.c:388)
      ==11843==    by 0x509C37B: virEventPollCleanupHandles (vireventpoll.c:583)
      ==11843==    by 0x509C711: virEventPollRunOnce (vireventpoll.c:652)
      ==11843==    by 0x509A620: virEventRunDefaultImpl (virevent.c:274)
      ==11843==    by 0x520D21C: virNetServerRun (virnetserver.c:1112)
      ==11843==    by 0x11F368: main (libvirtd.c:1513)
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      5a4c2374