1. 26 2月, 2014 12 次提交
    • E
      spec: make systemd_daemon usage configurable · dea81f40
      Eric Blake 提交于
      On Fedora 20, I added this to my '~/.rpmmacros':
      
      %_without_udev 1
      %_without_storage_mpath 1
      %_without_storage_disk 1
      
      and uninstalled systemd-devel (which also removed device-mapper-devel).
      Then I ran 'make rpm', and inspected the results:
      
      $ ldd ~/rpmbuild/BUILD/libvirt-1.2.2/daemon/.libs/libvirtd | grep syst
      $
      
      Then I reinstalled systemd-devel, where I now see:
      
      $ ldd ~/rpmbuild/BUILD/libvirt-1.2.2/daemon/.libs/libvirtd | grep syst
        libsystemd-daemon.so.0 => /lib64/libsystemd-daemon.so.0 (0x00007ffb858ba000)
      $
      
      Oops - the build is non-deterministic, where the final binary
      depends on my build environment.  The fix is to require
      systemd-devel in all situations where the code base uses it.
      Now ~/.rpmmacros can contain "%define _without_systemd_daemon 1"
      to explicitly disable use of the library, but the library is now
      a strict build requirement for normal builds; if systemd-devel
      is not installed, the user now gets an up-front warning:
      
      $ rpmbuild -ta libvirt-1.2.2.tar.gz
      error: Failed build dependencies:
             systemd-devel is needed by libvirt-1.2.2-1.fc20.x86_64
      
      * libvirt.spec.in (with_systemd_daemon): New variable.
      (BuildRequires): Require systemd-devel for more than just udev.
      (%configure): Make choice of systemd_daemon explicit.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      dea81f40
    • E
      spec: require device-mapper-devel for storage-disk · 7cac3afa
      Eric Blake 提交于
      On Fedora 20, with the following in my ~/.rpmmacros:
      
      %_without_udev 1
      %_without_storage_mpath 1
      
      and with device-mapper-devel uninstalled, 'make rpm' fails with:
      
      checking for libdevmapper.h... no
      configure: error: You must install device-mapper-devel/libdevmapper >= 1.0.0 to compile libvirt
      error: Bad exit status from /var/tmp/rpm-tmp.Wo9pOG (%build)
      
      This is a rather late point to be issuing an error; better is
      to flag missing packages up front.  The fix is to match the logic
      in configure.ac on when devmapper is required (for both mpath and
      storage).  While at it, rbd storage is not dependent on mpath.
      With this patch applied, I now get:
      
      $ rpmbuild -ta libvirt-1.2.2.tar.gz
      error: Failed build dependencies:
             device-mapper-devel is needed by libvirt-1.2.2-1.fc20.x86_64
      
      until either installing the package or further modifying
      ~/.rpmmacros to add "%_without_storage_disk 1".
      
      * libvirt.spec.in (BuildRequires): Fix build when mpath is
      disabled.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      7cac3afa
    • E
      spec: explicitly avoid bhyve on Linux · fa293998
      Eric Blake 提交于
      Generally, we try to make the spec file tweakable via user
      variables, so that they can select a different subset of sub-rpms
      to build.  We also try to explicitly list all driver config
      options, rather than leaving the chance that the rpm build may be
      non-deterministic based on what the user had installed locally.
      But in the case of the recent bhyve hypervisor driver, there is
      no port of bhyve to Linux, so it is easier to just blindly
      disable it for now.  If someone ever does try to port bhyve to
      Fedora, we can make the spec file conditional at that point.
      
      * libvirt.spec.in (%configure): Don't try to build bhyve.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      fa293998
    • E
      build: use --with-systemd-daemon as configure option · 25034b3c
      Eric Blake 提交于
      Commit 68954fb2 added a configure option --with-systemd_daemon,
      which violates the conventions of configure files preferring
      dash in all option names.  This fixes it, before we hit a
      release where the tarball is baked with an awkward name.
      
      * m4/virt-lib.m4 (LIBVIRT_CHECK_LIB, LIBVIRT_CHECK_LIB_ALT)
      (LIBVIRT_CHECK_PKG): Favor - over _ in configure option names.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      25034b3c
    • P
      spec: Use correct versions of libgfapi in RHEL builds · 72f7658b
      Peter Krempa 提交于
      RHEL still uses the 3.4.0 package of libgfapi and the package is built
      only for x86_64.
      72f7658b
    • L
      network: unplug bandwidth and call networkRunHook only when appropriate · eed46d4c
      Laine Stump 提交于
      According to commit b4e0299d if networkAllocateActualDevice() was
      successful, it will *always* allocate an iface->data.network.actual,
      so we can use this during networkReleaseActualDevice() to know if
      there is really anything to undo. We were properly using this
      information to only decrement the network connections counter if it
      had previously been incremented, but we were unconditionally
      unplugging bandwidth and calling the "unplugged" network hook for
      *all* interfaces (during qemuProcessStop()) whether they had been
      previously plugged or not. This caused problems if a domain failed to
      start at some time prior to all interfaces being allocated. (I
      encountered this when an interface had a bandwidth floor set but no
      inbound QoS).
      
      This patch changes both the call to networkUnplugBandwidth() and the
      call to networkRunHook() to only be called if there was a previous
      call to "plug" for the same interface.
      eed46d4c
    • L
      network: don't even call networkRunHook if there is no network · 0700a3da
      Laine Stump 提交于
      networkAllocateActualDevice() is called for *all* interfaces, not just
      those with type='network'. In that case, it will jump down to its
      validate: label immediately, without allocating anything. After
      validation is done, two counters are potentially updated (one for the
      network, and one for any particular physical device that is chosen),
      and then networkRunHook() is called.
      
      This patch refactors that code a slight bit so that networkRunHook()
      doesn't get called if netdef is NULL (i.e. type != network) and to
      place the conditional increment of dev->connections inside the "if
      (netdef)" as well - dev can never be non-null if netdef is null
      (because "dev" is the pointer to a device in a network's pool of
      devices), so this doesn't have any functional effect, it just makes
      the code clearer.
      0700a3da
    • N
      Fix memory leak in virSCSIDeviceListDel() · 969493f9
      Nehal J Wani 提交于
      While running virscsitest, it was found that valgrind pointed out the following
      memory leak:
      
      ==320== 5 bytes in 1 blocks are definitely lost in loss record 4 of 37
      ==320==    at 0x4A069EE: malloc (vg_replace_malloc.c:270)
      ==320==    by 0x3E6CE81171: strdup (strdup.c:43)
      ==320==    by 0x4CB28DF: virStrdup (virstring.c:554)
      ==320==    by 0x4CAC987: virSCSIDeviceSetUsedBy (virscsi.c:289)
      ==320==    by 0x402321: test2 (virscsitest.c:100)
      ==320==    by 0x403231: virtTestRun (testutils.c:199)
      ==320==    by 0x402121: mymain (virscsitest.c:180)
      ==320==    by 0x4039AD: virtTestMain (testutils.c:782)
      ==320==    by 0x3E6CE1ED1C: (below main) (libc-start.c:226)
      ==320==
      
      Introduced by commit fd243fc4.
      Signed-off-by: NJán Tomko <jtomko@redhat.com>
      969493f9
    • M
      virNetDevVethCreate: Serialize callers · c0d162c6
      Michal Privoznik 提交于
      Consider dozen of LXC domains, each of them having this type of interface:
      
          <interface type='network'>
            <mac address='52:54:00:a7:05:4b'/>
            <source network='default'/>
          </interface>
      
      When starting these domain in parallel, all workers may meet in
      virNetDevVethCreate() where a race starts. Race over allocating veth
      pairs because allocation requires two steps:
      
        1) find first nonexistent '/sys/class/net/vnet%d/'
        2) run 'ip link add ...' command
      
      Now consider two threads. Both of them find N as the first unused veth
      index but only one of them succeeds allocating it. The other one fails.
      For such cases, we are running the allocation in a loop with 10 rounds.
      However this is very flaky synchronization. It should be rather used
      when libvirt is competing with other process than when libvirt threads
      fight each other. Therefore, internally we should use mutex to serialize
      callers, and do the allocation in loop (just in case we are competing
      with a different process). By the way we have something similar already
      since 1cf97c87.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      c0d162c6
    • E
      build: avoid ld_preload tests on mingw · f2dc1f67
      Eric Blake 提交于
      Running ./autobuild.sh complained during the mingw cross-compile:
      
        CC       libvirportallocatormock_la-virportallocatortest.lo
      ../../tests/virportallocatortest.c:32:20: fatal error: dlfcn.h: No such file or directory
       # include <dlfcn.h>
                          ^
      compilation terminated.  With that fixed, the next failure was:
      
        CCLD     qemuxml2argvmock.la
      libtool: link: libtool library `qemuxml2argvmock.la' must begin with `lib'
      libtool: link: Try `libtool --help --mode=link' for more information.
      
      While we don't need to limit all LD_PRELOAD tests to just Linux, we
      do need to limit them to platforms that actually support loading;
      we also need to avoid building qemu tests when qemu is not enabled.
      
      * tests/virportallocatortest.c: Make conditional on <dlfcn.h>.
      * tests/Makefile.am (test_libraries): Only build qemu mock library
      when building qemu tests.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      f2dc1f67
    • E
      build: fix cgroups on non-Linux · fa2e4dbf
      Eric Blake 提交于
      Running ./autobuild.sh detected a mingw failure:
      
        CCLD     libvirt.la
      Cannot export virCgroupGetPercpuStats: symbol not defined
      Cannot export virCgroupSetOwner: symbol not defined
      
      * src/util/vircgroup.c (virCgroupGetPercpuStats)
      (virCgroupSetOwner): Implement stubs.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      fa2e4dbf
    • J
      libxl: queue domain event earlier in shutdown handler · 4d975ded
      Jim Fehlig 提交于
      The shutdown handler may restart a domain when handling a reboot
      event or when <on_*> is set to 'restart'.  Restarting consists of
      calling libxlVmCleanup followed by libxlVmStart.  libxlVmStart will
      emit a VIR_DOMAIN_EVENT_STARTED event, but the SHUTDOWN event is
      not emitted until exiting the shutdown handler, after the STARTED
      event.
      
      This patch changes the logic a bit to queue the event at the start
      of the shutdown action, ensuring it is queued before any subsequent
      events that may be generated while executing the shutdown action.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      4d975ded
  2. 25 2月, 2014 18 次提交
    • L
      network: include plugged interface XML in "plugged" network hook · 2122cf39
      Laine Stump 提交于
      The network hook script gets called whenever an interface is plugged
      into or unplugged from a network, but even though the full XML of both
      the network and the domain is included, there is no reasonable way to
      determine what exact resources the plugged interface is using:
      
      1) Prior to a recent patch which modified the status XML of interfaces
      to include the information about actual hardware resources used, it
      would be possible to scan through the domain XML output sent to the
      hook, and from there find the correct interface, but that interface
      definition would not include any runtime info (e.g. bandwidth or vlan
      taken from a portgroup, or which physdev was used in case of a macvtap
      network).
      
      2) After the patch modifying the status XML of interfaces, the network
      name would no longer be included in the domain XML, so it would be
      completely impossible to determine which interface was the one being
      plugged.
      
      To solve that problem, this patch includes a single <interface>
      element at the beginning of the XML sent to the network hook for
      "plugged" and "unplugged" (just inside <hookData>) that is the status
      XML of the interface being plugged. This XML will include all info
      gathered from the chosen network and portgroup.
      
      NB: due to hardcoded spaces in all of the device *Format() functions,
      the <interface> element inside the <hookData> will be indented by 6
      spaces rather than 2. I had intended to fix this, but it turns out
      that to make virDomainNetDefFormat() indentation relative, I would
      have to do the same to virDomainDeviceInfoFormat(), and that function
      is called from 19 places - making that a prerequisite of this patch
      would cause too many merge difficulties if we needed to backport
      network hooks, so I chose to ignore the problem here and fix the
      problem for *all* devices in a followup later.
      2122cf39
    • L
      conf: output actual netdev status in <interface> XML · 7d5bf484
      Laine Stump 提交于
      Until now, the "live" XML status of an <interface type='network'>
      device would always show the network information, rather than the
      exact hardware device that was used. It would also show the name of
      any portgroup the interface belonged to, rather than providing the
      configuration that was derived from that portgroup. As an example,
      given the following network definition:
      
      [A]
        <network>
          <name>testnet</name>
          <forward type='bridge' dev='p4p1_0'>
            <interface dev='p4p1_0'/>
            <interface dev='p4p1_1'/>
            <interface dev='p4p1_2'/>
            <interface dev='p4p1_3'/>
          </forward>
          <portgroup name='admin'>
            <bandwidth>
                <inbound average='1000' peak='5000' burst='1024'/>
                <outbound average='128' peak='256' burst='256'/>
            </bandwidth>
          </portgroup>
        </network>
      
      and the following domain <interface>:
      
      [B]
        <interface type='network'>
          <source network='testnet' portgroup='admin'/>
        </interface>
      
      the output of "virsh dumpxml $domain" while the domain was running
      would yield something like this:
      
      [C]
        <interface type='network'>
          <source network='testnet' portgroup='admin'/>
          <target dev='macvtap0'/>
          <alias name='net0'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
      
      In order to learn the exact bandwidth information of the interface, a
      management application would need to retrieve the XML for testnet,
      then search for the portgroup named "admin". Even worse, there was no
      simple and standard way to learn which host physdev the macvtap0
      device is attached to.
      
      Internally, libvirt has always kept this information in the
      virDomainDef that is held in memory, as well as storing it in the
      (libvirt-internal-only) domain status XML (in
      /var/run/libvirt/qemu/$domain.xml). In order to not confuse the runtime
      "actual state" with the config of the device, it's internally stored
      like this:
      
      [D]
        <interface type='network'>
          <source network='testnet' portgroup='admin'/>
          <actual type='direct'>
            <source dev='p4p1_0' mode='bridge'/>
            <bandwidth>
                <inbound average='1000' peak='5000' burst='1024'/>
                <outbound average='128' peak='256' burst='256'/>
            </bandwidth>
          </actual>
          <target dev='macvtap0'/>
          <alias name='net0'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
      
      This was never exposed outside of libvirt though, because I thought it
      would be too awkward for a management application to need to look in
      two places for the same information, but I also wasn't sure that it
      would be okay to overwrite the config info (in this case "<source
      network='testnet' portgroup='admin'/>") with the actual runtime info
      (everything inside <actual> above).
      
      Now we have a need for this information to be made available to
      management applications (in particular, so that a network "plugged"
      hook will have full information about the device that is being plugged
      in), so it's time to take the leap and decide that it is acceptable
      for the config info to be replaced with actual runtime state (but
      *only* when reporting domain live status, *not* when saving state in
      /var/run/libvirt/qemu/$domain.xml - that remains the same so that
      there is no loss of information). That is what this patch does - once
      applied, the output of "virsh dumpxml $domain" when the domain is
      running will contain something like this:
      
      [E]
        <interface type='direct'>
          <source dev='p4p1_0' mode='bridge'/>
          <bandwidth>
              <inbound average='1000' peak='5000' burst='1024'/>
              <outbound average='128' peak='256' burst='256'/>
          </bandwidth>
          <target dev='macvtap0'/>
          <alias name='net0'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
      
      In effect, everything that is internally stored within <actual> is
      moved up a level to where a management application will expect
      it. This means that the management application will only look in a
      single place to learn - the type of interface in use, the name of the
      physdev (if relevant), the <bandwidth>, <vlan>, and <virtualport>
      settings in use.
      
      The potential downside is that a management app looking at this output
      will not see that the physdev 'p4p1_0' was actually allocated from the
      network named 'testnet', or that the bandwidth numbers were taken from
      the portgroup 'admin'. However, if they are interested in that info,
      they can always get the "inactive" XML for the domain.
      
      An example of where this could cause problems is in virt-manager's
      network device display, which shows the status of the device, but
      allows you to edit that status info and save it as the new
      config. Previously virt-manager would always display the information
      in example [C] above, and allow editing that. With this patch, it will
      instead display what is in [E] and allow editing it directly, which
      could lead to some confusion. I would suggest that virt-manager have
      an "edit" button which would change the display from the "live" xml to
      the "inactive" xml, so that editing would be done on that; such a
      change would both handle the new situation, and also be compatible
      with older releases.
      7d5bf484
    • L
      conf: new function virDomainActualNetDefContentsFormat · 9da98aa5
      Laine Stump 提交于
      This function is currently only called from one place, but in a
      subsequent patch will be called from a 2nd place.
      
      The new function exactly replicates the original behavior of the part
      of virDomainActualNetDefFormat() that it replaces, but takes a
      virDomainNetDefPtr instead of virDomainActualNetDefPtr, and uses the
      virDomainNetGetActual*() functions whenever possible, rather than
      reaching into def->data.network.actual - this is to be sure that we
      are reporting exactly what is being used internally, just in case
      there are any discrepancies (there shouldn't be).
      9da98aa5
    • L
      conf: re-situate <bandwidth> element in <interface> · 65487c0f
      Laine Stump 提交于
      This moves the call to virNetDevBandwidthFormat() in
      virDomainNetDefFormat() to be called right after the call to
      virNetDevVPortProfileFormat(), so that a single chunk of that function
      can be placed inside an if that conditionally calls
      virDomainActualNetDefContentsFormat() instead (next patch). The
      re-ordering necessitates modifying a couple of test data files.
      65487c0f
    • L
      conf: make virDomainNetDefFormat a public function · 7c39214c
      Laine Stump 提交于
      We will need to call virDomainNetDefFormat() from the network hook (in
      the network driver).
      7c39214c
    • L
      conf: handle null pointer in virNetDevVlanFormat · 79358733
      Laine Stump 提交于
      Other *Format() functions (e.g. virNetDevBandwidthFormat()) return
      with no action when called with a NULL *Def pointer. This makes
      virNetDevVlanFormat() consistent with that behavior.
      79358733
    • L
      conf: clarify what is returned for actual bandwidth and vlan · 6d4ffae4
      Laine Stump 提交于
      In practice, if a virDomainNetDef has a virDomainActualNetDef
      allocated, the ActualNetDef will *always* contain the bandwidth and
      vlan data from the NetDef (unless there was also a portgroup involved
      - see networkAllocateActualDevice()).
      
      However, virDomainNetGetActual(Bandwidth|Vlan)() were coded to make it
      appear as if it might be possible to have a valid bandwidth/vlan in
      the NetDef, but a NULL in the ActualNetDef. Believing this un-truth
      could lead to writing unnecessarily defensive code when dealing with
      the virDomainGetActual*() functions, so this patch makes it more
      obvious:
      
         If there is an ActualNetDef, it will always have a copy of the
         various appropriate bits from its parent NetDef, and the
         virDomainGetActual* function will *always* return the data from the
         ActualNetDef, not from the NetDef.
      
      The reason for this effective-NOP patch is that a subsequent patch to
      change virDomainNetDefFormat will rely on the above rule.
      6d4ffae4
    • W
      rbd: Set timeout options for librados · 60f70542
      Wido den Hollander 提交于
      These timeout values make librados/librbd return -ETIMEDOUT when a
      operation is blocking due to a failing/unreachable Ceph cluster.
      
      By having the operations time out libvirt will not block.
      60f70542
    • W
      rbd: Include return statuses from librados/librbd in logging · 761491eb
      Wido den Hollander 提交于
      With this information it's easier for the user to debug what is
      going wrong.
      761491eb
    • J
      virsh: mark CPU usage field names as translatable · 723e2f84
      Ján Tomko 提交于
      My commit ac758012 removed the translation markers when
      moving the field names into an array.
      723e2f84
    • C
      virsh: initialize str to NULL to solve a build issue · 7a8d7af6
      Chen Hanxiao 提交于
      Fix a -Werror=maybe-uninitialized issue.
      Signed-off-by: NChen Hanxiao <chenhanxiao@cn.fujitsu.com>
      Signed-off-by: NJán Tomko <jtomko@redhat.com>
      7a8d7af6
    • E
      virsh: kill over-engineered asprintf failure recovery · 50f7960d
      Eric Blake 提交于
      I noticed this while shortening switch statements via VIR_ENUM.
      Basically, the only ways virAsprintf can fail are if we pass a
      bogus format string (but we're not THAT bad) or if we run out
      of memory (but it already warns on our behalf in that case).
      Throw away the cruft that tries too hard to diagnose a printf
      failure.
      
      * tools/virsh-volume.c (cmdVolList): Simplify.
      * tools/virsh-pool.c (cmdPoolList): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      50f7960d
    • E
      virsh: use more compact VIR_ENUM_IMPL · 466b12ab
      Eric Blake 提交于
      Dan Berrange suggested that using VIR_ENUM_IMPL is more compact
      than open-coding switch statements, and still just as forceful
      at making us remember to update lists if we add enum values
      in the future.  Make this change throughout virsh.
      
      Sure enough, doing this change caught that we missed at least
      VIR_STORAGE_VOL_NETDIR.
      
      * tools/virsh-domain-monitor.c (vshDomainIOErrorToString)
      (vshDomainControlStateToString, vshDomainStateToString)
      (vshDomainStateReasonToString): Change switch to enum lookup.
      (cmdDomControl, cmdDominfo): Update caller.
      * tools/virsh-domain.c (vshDomainVcpuStateToString)
      (vshDomainEventToString, vshDomainEventDetailToString): Change
      switch to enum lookup.
      (vshDomainBlockJobToString, vshDomainJobToString): New functions.
      (cmdVcpuinfo, cmdBlockJob, cmdDomjobinfo, cmdEvent): Update
      callers.
      * tools/virsh-network.c (vshNetworkEventToString): Change switch
      to enum lookup.
      * tools/virsh-pool.c (vshStoragePoolStateToString): New function.
      (cmdPoolList, cmdPoolInfo): Update callers.
      * tools/virsh-volume.c (vshVolumeTypeToString): Change switch to
      enum lookup.
      (cmdVolInfo, cmdVolList): Update callers.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      466b12ab
    • J
      Document the keyboard as a valid input type · 19845402
      Ján Tomko 提交于
      Commit bc183733 added a new input type, but didn't change the
      documentation.
      19845402
    • J
      virsh: Don't leak buffer if GetFDs fails in cmdCreate · fe1b6e72
      Ján Tomko 提交于
      Change the logic of the function to return false by default
      and move the freeing of the buffer to the cleanup section.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1067338
      fe1b6e72
    • J
      libxl: handle on_crash coredump actions · cfad607b
      Jim Fehlig 提交于
      Add support for coredump-{destroy,restart} actions of <on_crash> event.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      cfad607b
    • J
      libxl: add dump dir to libxlDriverConfig object · c2de456e
      Jim Fehlig 提交于
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      c2de456e
    • J
      libxl: honor domain lifecycle event configuration · 51b9b391
      Jim Fehlig 提交于
      The libxl driver was ignoring the <on_*> domain event configuration,
      causing e.g. a domain to be rebooted even when on_reboot is set to
      destroy.
      
      This patch honors the <on_*> configuration in the shutdown event
      handler.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      51b9b391
  3. 24 2月, 2014 7 次提交
  4. 22 2月, 2014 2 次提交
  5. 21 2月, 2014 1 次提交