1. 30 9月, 2014 1 次提交
  2. 23 9月, 2014 2 次提交
  3. 18 9月, 2014 2 次提交
  4. 16 9月, 2014 1 次提交
  5. 15 9月, 2014 2 次提交
  6. 12 9月, 2014 1 次提交
    • E
      blockcopy: add qemu implementation of new tunables · eef91f94
      Eric Blake 提交于
      Upstream qemu 1.4 added some drive-mirror tunables not present
      when it was first introduced in 1.3.  Management apps may want
      to set these in some cases (for example, without tuning
      granularity down to sector size, a copy may end up occupying
      more bytes than the original because an entire cluster is
      copied even when only a sector within the cluster is dirty,
      although tuning it down results in more CPU time to do the
      copy).  I haven't personally needed to use the parameters, but
      since they exist, and since the new API supports virTypedParams,
      we might as well expose them.
      
      Since the tuning parameters aren't often used, and omitted from
      the QMP command when unspecified, I think it is safe to rely on
      qemu 1.3 to issue an error about them being unsupported, rather
      than trying to create a new capability bit in libvirt.
      
      Meanwhile, all versions of qemu from 1.4 to 2.1 have a bug where
      a bad granularity (such as non-power-of-2) gives a poor message:
      error: internal error: unable to execute QEMU command 'drive-mirror': Invalid parameter 'drive-virtio-disk0'
      
      because of abuse of QERR_INVALID_PARAMETER (which is supposed to
      name the parameter that was given a bad value, rather than the
      value passed to some other parameter).  I don't see that a
      capability check will help, so we'll just live with it (and it
      has since been improved in upstream qemu).
      
      * src/qemu/qemu_monitor.h (qemuMonitorDriveMirror): Add
      parameters.
      * src/qemu/qemu_monitor.c (qemuMonitorDriveMirror): Likewise.
      * src/qemu/qemu_monitor_json.h (qemuMonitorJSONDriveMirror):
      Likewise.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONDriveMirror):
      Likewise.
      * src/qemu/qemu_driver.c (qemuDomainBlockCopyCommon): Likewise.
      (qemuDomainBlockRebase, qemuDomainBlockCopy): Adjust callers.
      * src/qemu/qemu_migration.c (qemuMigrationDriveMirror): Likewise.
      * tests/qemumonitorjsontest.c (qemuMonitorJSONDriveMirror): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      eef91f94
  7. 08 9月, 2014 1 次提交
    • J
      qemu: Propagate QEMU errors during incoming migrations · 03890605
      Jiri Denemark 提交于
      When QEMU fails during incoming migration after we successfully started
      it (i.e., during Perform or Finish phase), we report a rather unhelpful
      message
      
          Unable to read from monitor: Connection reset by peer
      
      We already have a code that takes error messages from QEMU's error
      output but we disable it once QEMU successfully starts. This patch
      postpones this until the end of Finish phase during incoming migration
      so that we can report a much better error message:
      
          internal error: early end of file from monitor: possible problem:
          Unknown savevm section or instance '0000:00:05.0/virtio-balloon' 0
          load of migration failed
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1090093Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
      03890605
  8. 06 9月, 2014 3 次提交
    • E
      blockjob: allow finer bandwidth tuning for query · db33cc24
      Eric Blake 提交于
      While reviewing the new virDomainBlockCopy API, Peter Krempa
      pointed out that our existing design of using MiB/s for block
      job bandwidth is rather coarse, especially since qemu tracks
      it in bytes/s; so virDomainBlockCopy only accepts bytes/s.
      But once the new API is implemented for qemu, we will be in
      the situation where it is possible to set a value that cannot
      be accurately reflected back to the user, because the existing
      virDomainGetBlockJobInfo defaults to the coarser units.
      
      Fortunately, we have an escape hatch; and one that has already
      served us well in the past: we can use the flags argument to
      specify which scale to use (see virDomainBlockResize for prior
      art).  This patch fixes the query side of the API; made easier
      by previous patches that split the query side out from the
      modification code.  Later patches will address the virsh
      interface, as well retrofitting all other blockjob APIs to
      also accept a flag for toggling bandwidth units.
      
      * include/libvirt/libvirt.h.in (_virDomainBlockJobInfo)
      (VIR_DOMAIN_BLOCK_COPY_BANDWIDTH): Document sizing issues.
      (virDomainBlockJobInfoFlags): New enum.
      * src/libvirt.c (virDomainGetBlockJobInfo): Document new flag.
      * src/qemu/qemu_monitor.h (qemuMonitorBlockJobInfo): Add parameter.
      * src/qemu/qemu_monitor.c (qemuMonitorBlockJobInfo): Likewise.
      * src/qemu/qemu_monitor_json.h (qemuMonitorJSONBlockJobInfo):
      Likewise.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockJobInfo)
      (qemuMonitorJSONGetBlockJobInfoOne): Likewise. Don't scale here.
      * src/qemu/qemu_migration.c (qemuMigrationDriveMirror): Update
      callers.
      * src/qemu/qemu_driver.c (qemuDomainBlockPivot)
      (qemuDomainBlockJobImpl): Likewise.
      (qemuDomainGetBlockJobInfo): Likewise, and support new flag.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      db33cc24
    • E
      blockjob: hoist bandwidth scaling out of monitor code · 08cc14f7
      Eric Blake 提交于
      qemu treats blockjob bandwidth as a 64-bit number, in the units
      of bytes/second.  But we stupidly modeled block job bandwidth
      after migration bandwidth, which in turn was an 'unsigned long'
      and therefore subject to 32-bit vs. 64-bit interpretations, and
      with a scale of MiB/s.  Our code already has to convert between
      the two scales, and report overflow as appropriate; although
      this conversion currently lives in the monitor code.  In fact,
      our conversion code limited things to 63 bits, because we
      checked against LLONG_MAX and reject what would be negative
      bandwidth if treated as signed.
      
      On the bright side, our use of MiB/s means that even with a
      32-bit unsigned long, we still have no problem representing a
      bandwidth of 2GiB/s, which is starting to be more feasible as
      10-gigabit or even faster interfaces are used.  And once you
      get past the physical speeds of existing interfaces, any larger
      bandwidth number behaves the same - effectively unlimited.
      But on the low side, the granularity of 1MiB/s tuning is rather
      coarse.  So the new virDomainBlockJob API decided to go with
      a direct 64-bit bytes/sec number instead of the scaled number
      that prior blockjob APIs had used.  But there is no point in
      rounding this number to MiB/s just to scale it back to bytes/s
      for handing to qemu.
      
      In order to make future code sharing possible between the old
      virDomainBlockRebase and the new virDomainBlockCopy, this patch
      moves the scaling and overflow detection into the driver code.
      Several of the block job calls that can set speed are fed
      through a common interface, so it was easier to adjust all block
      jobs at once, for consistency.  This patch is just code motion;
      there should be no user-visible change in behavior.
      
      * src/qemu/qemu_monitor.h (qemuMonitorBlockJob)
      (qemuMonitorBlockCommit, qemuMonitorDriveMirror): Change
      parameter type and scale.
      * src/qemu/qemu_monitor.c (qemuMonitorBlockJob)
      (qemuMonitorBlockCommit, qemuMonitorDriveMirror): Move scaling
      and overflow detection...
      * src/qemu/qemu_driver.c (qemuDomainBlockJobImpl)
      (qemuDomainBlockRebase, qemuDomainBlockCommit): ...here.
      (qemuDomainBlockCopy): Use bytes/sec.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      08cc14f7
    • E
      blockjob: split out block info monitor handling · ced81365
      Eric Blake 提交于
      Another layer of overly-multiplexed code that deserves to be
      split into obviously separate paths for query vs. modify.
      This continues the cleanup started in commit cefe0ba3.
      
      In the process, make some tweaks to simplify the logic when
      parsing the JSON reply.  There should be no user-visible
      semantic changes.
      
      * src/qemu/qemu_monitor.h (qemuMonitorBlockJob): Drop parameter.
      (qemuMonitorBlockJobInfo): New prototype.
      (BLOCK_JOB_INFO): Drop enum.
      * src/qemu/qemu_monitor_json.h (qemuMonitorJSONBlockJob)
      (qemuMonitorJSONBlockJobInfo): Likewise.
      * src/qemu/qemu_monitor.c (qemuMonitorBlockJob): Split...
      (qemuMonitorBlockJobInfo): ...into second function.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockJob): Move
      block info portions...
      (qemuMonitorJSONGetBlockJobInfo): ...here, and rename...
      (qemuMonitorJSONBlockJobInfo): ...and export.
      (qemuMonitorJSONGetBlockJobInfoOne): Alter return semantics.
      * src/qemu/qemu_driver.c (qemuDomainBlockPivot)
      (qemuDomainBlockJobImpl, qemuDomainGetBlockJobInfo): Adjust
      callers.
      * src/qemu/qemu_migration.c (qemuMigrationDriveMirror)
      (qemuMigrationCancelDriveMirror): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      ced81365
  9. 28 8月, 2014 1 次提交
  10. 20 8月, 2014 1 次提交
  11. 17 7月, 2014 1 次提交
  12. 04 7月, 2014 3 次提交
    • P
      qemu: monitor: Add support for backing name specification for block-stream · a448713a
      Peter Krempa 提交于
      To allow changing the name that is recorded in the top of the current
      image chain used in a block pull/rebase operation, we need to specify
      the backing name to qemu. This is done via the "backing-file" attribute
      to the block-stream commad.
      a448713a
    • P
      qemu: monitor: Add argument for specifying backing name for block commit · c29b6529
      Peter Krempa 提交于
      To allow changing the name that is recorded in the overlay of the TOP
      image used in a block commit operation, we need to specify the backing
      name to qemu. This is done via the "backing-file" attribute to the
      block-commit command.
      c29b6529
    • E
      blockjob: allow omitted arguments to QMP block-commit · 47549d5a
      Eric Blake 提交于
      We are about to turn on support for active block commit.  Although
      qemu 2.0 was the first version to mostly support it, that version
      mis-handles 0-length files, and doesn't have anything available for
      easy probing.  But qemu 2.1 fixed bugs, and made life simpler by
      letting the 'top' argument be optional.  Unless someone begs for
      active commit with qemu 2.0, for now we are just going to enable
      it only by probing for qemu 2.1 behavior (anyone backporting active
      commit can also backport the optional argument behavior).  This
      requires qemu.git commit 7676e2c597000eff3a7233b40cca768b358f9bc9.
      
      Although all our actual uses of block-commit supply arguments for
      both base and top, we can omit both arguments and use a bogus
      device string to trigger an interesting behavior in qemu.  All QMP
      commands first do argument validation, failing with GenericError
      if a mandatory argument is missing.  Once that passes, the code
      in the specific command gets to do further checking, and the qemu
      developers made sure that if device is the only supplied argument,
      then the block-commit code will look up the device first, with a
      failure of DeviceNotFound, before attempting any further argument
      validation (most other validations fail with GenericError).  Thus,
      the category of error class can reliably be used to decipher
      whether the top argument was optional, which in turn implies a
      working active commit.  Since we expect our bogus device string to
      trigger an error either way, the code is written to return a
      distinct return value without spamming the logs.
      
      * src/qemu/qemu_monitor.h (qemuMonitorSupportsActiveCommit): New
      prototype.
      * src/qemu/qemu_monitor.c (qemuMonitorSupportsActiveCommit):
      Implement it.
      * src/qemu/qemu_monitor_json.h (qemuMonitorJSONBlockCommit):
      Allow NULL for top and base, for probing purposes.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockCommit):
      Likewise, implementing the probe.
      * tests/qemumonitorjsontest.c (mymain): Enable...
      (testQemuMonitorJSONqemuMonitorSupportsActiveCommit): ...a new test.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      47549d5a
  13. 03 7月, 2014 1 次提交
    • J
      Use virBufferCheckError everywhere we report OOM error · 92a8e72f
      Ján Tomko 提交于
      Replace:
      if (virBufferError(&buf)) {
          virBufferFreeAndReset(&buf);
          virReportOOMError();
          ...
      }
      
      with:
      if (virBufferCheckError(&buf) < 0)
          ...
      
      This should not be a functional change (unless some callers
      misused the virBuffer APIs - a different error would be reported
      then)
      92a8e72f
  14. 03 6月, 2014 1 次提交
  15. 14 4月, 2014 1 次提交
  16. 07 4月, 2014 1 次提交
    • E
      hash: add common utility functions · 09567144
      Eric Blake 提交于
      I almost wrote a hash value free function that just called
      VIR_FREE, then realized I couldn't be the first person to
      do that.  Sure enough, it was worth factoring into a common
      helper routine.
      
      * src/util/virhash.h (virHashValueFree): New function.
      * src/util/virhash.c (virHashValueFree): Implement it.
      * src/util/virobject.h (virObjectFreeHashData): New function.
      * src/libvirt_private.syms (virhash.h, virobject.h): Export them.
      * src/nwfilter/nwfilter_learnipaddr.c (virNWFilterLearnInit): Use
      common function.
      * src/qemu/qemu_capabilities.c (virQEMUCapsCacheNew): Likewise.
      * src/qemu/qemu_command.c (qemuDomainCCWAddressSetCreate):
      Likewise.
      * src/qemu/qemu_monitor.c (qemuMonitorGetBlockInfo): Likewise.
      * src/qemu/qemu_process.c (qemuProcessWaitForMonitor): Likewise.
      * src/util/virclosecallbacks.c (virCloseCallbacksNew): Likewise.
      * src/util/virkeyfile.c (virKeyFileParseGroup): Likewise.
      * tests/qemumonitorjsontest.c
      (testQemuMonitorJSONqemuMonitorJSONGetBlockInfo): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      09567144
  17. 25 3月, 2014 3 次提交
  18. 21 3月, 2014 4 次提交
    • C
      libvirt support to force convergence of live guest migration · 05e1b06a
      Chegu Vinod 提交于
      Busy enterprise workloads hosted on large sized VM's tend to dirty
      memory faster than the transfer rate achieved via live guest migration.
      Despite some good recent improvements (& using dedicated 10Gig NICs
      between hosts) the live migration may NOT converge.
      
      Recently support was added in qemu (version 1.6) to allow a user to
      choose if they wish to force convergence of their migration via a
      new migration capability : "auto-converge". This feature allows for qemu
      to auto-detect lack of convergence and trigger a throttle-down of the
      VCPUs.
      
      This patch includes the libvirt support needed to trigger this
      feature. (Testing is in progress)
      Signed-off-by: NChegu Vinod <chegu_vinod@hp.com>
      Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
      05e1b06a
    • J
      qemu: Return meaningful error when qemu dies early · cfa7ceab
      Jiri Denemark 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=844378
      
      When qemu dies early after connecting to its monitor but before we
      actually try to read something from the monitor, we would just fail
      domain start with useless message:
      
          "An error occurred, but the cause is unknown"
      
      This is because the real error gets reported in a monitor EOF handler
      executing within libvirt's event loop.
      
      The fix is to take any error set in qemuMonitor structure and propagate
      it into the thread-local error when qemuMonitorClose is called and no
      thread-local error is set.
      Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
      cfa7ceab
    • E
      qemu: enable monitor event reporting · 3566599a
      Eric Blake 提交于
      Wire up all the pieces to send arbitrary qemu events to a
      client using libvirt-qemu.so.  If the extra bookkeeping of
      generating event objects even when no one is listening turns
      out to be noticeable, we can try to further optimize things
      by adding a counter for how many connections are using events,
      and only dump events when the counter is non-zero; but for
      now, I didn't think it was worth the code complexity.
      
      * src/qemu/qemu_driver.c
      (qemuConnectDomainQemuMonitorEventRegister)
      (qemuConnectDomainQemuMonitorEventDeregister): New functions.
      * src/qemu/qemu_monitor.h (qemuMonitorEmitEvent): New prototype.
      (qemuMonitorDomainEventCallback): New typedef.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONIOProcessEvent):
      Report events.
      * src/qemu/qemu_monitor.c (qemuMonitorEmitEvent): New function, to
      pass events through.
      * src/qemu/qemu_process.c (qemuProcessHandleEvent): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      3566599a
    • M
      b1d5f6c6
  19. 18 3月, 2014 2 次提交
  20. 13 3月, 2014 1 次提交
  21. 12 3月, 2014 1 次提交
    • E
      qemu: don't munge user input during block commit · 359f4b11
      Eric Blake 提交于
      While investigating https://bugzilla.redhat.com/show_bug.cgi?id=1061827
      I noticed that we pass user input unscathed for block-pull, but
      always pass a canonical absolute name through for block-commit.
      [Note that we probably _ought_ to validate that the user's request
      for block-pull actually matches the backing chain, the way we already
      do for block-commit - but that's a separate issue.  Further note that
      the ability to pass user input through unscathed allows backdoors
      such as specifying a backing image that is a network URI such as
      a gluster disk, instead of forcing things to the local file system;
      which is an area still under active investigation on whether libvirt
      needs to behave differently for network disks.]
      
      Since qemu may write the name that the user passed in as the backing
      file, a user may have a reason to want a relative file name passed
      through to qemu, and always munging things to absolute prevents that.
      
      Put another way, if you have the backing chain:
      
      [A] <- [B(back=./A)] <- [C(back=./B)]
      
      and commit B into A (virsh blockcommit $dom vda --base A --top B),
      the metadata of C will have to be re-written. But should it be
      rewritten as [C(back=./A)] or as [C(back=/path/to/A)]?  Still up in
      the air is whether qemu's decision should be based on whether B
      and/or C had relative paths, or on whether the --base and/or
      --top arguments to the command were relative paths; but if we always
      pass a canonical name, we've prevented the spelling of the command
      arguments from being part of the hueristics that qemu uses.
      
      I also audited the code, and verified that we never call
      qemuMonitorBlockCommit() with a NULL base, either before or after
      the change to qemu_driver.c.
      
      * src/qemu/qemu_driver.c (qemuDomainBlockCommit): Preserve user's
      spelling, since absolute vs. relative matters to qemu.
      * src/qemu/qemu_monitor.h (qemuMonitorBlockCommit): Base is never
      null.
      * src/qemu/qemu_monitor.c (qemuMonitorBlockCommit): Likewise.
      * src/qemu/qemu_monitor_json.h (qemuMonitorJSONBlockCommit):
      Likewise.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockCommit):
      Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      359f4b11
  22. 06 2月, 2014 1 次提交
    • J
      qemu: Fix crash in virDomainMemoryStats with old qemu · 05bf9375
      Jiri Denemark 提交于
      If virDomainMemoryStats was run on a domain with virtio balloon driver
      running on an old qemu which supports QMP but does not support qom-list
      QMP command, libvirtd would crash. The reason is we did not check if
      qemuMonitorJSONGetObjectListPaths failed and moreover we even stored its
      result in an unsigned integer type.
      05bf9375
  23. 17 1月, 2014 1 次提交
  24. 13 12月, 2013 1 次提交
    • E
      object: require maximal alignment in base class · fca4f233
      Eric Blake 提交于
      Recent changes to events (commit 8a29ffcf) resulted in new compile
      failures on some targets (such as ARM OMAP5):
      conf/domain_event.c: In function 'virDomainEventDispatchDefaultFunc':
      conf/domain_event.c:1198:30: error: cast increases required alignment of
      target type [-Werror=cast-align]
      conf/domain_event.c:1314:34: error: cast increases required alignment of
      target type [-Werror=cast-align]
      cc1: all warnings being treated as errors
      
      The error is due to alignment; the base class is merely aligned
      to the worst of 'int' and 'void*', while the child class must
      be aligned to a 'long long'.  The solution is to include a
      'long long' (and for good measure, a function pointer) in the
      base class to ensure correct alignment regardless of what a
      child class may add, but to wrap the inclusion in a union so
      as to not incur any wasted space.  On a typical x86_64 platform,
      the base class remains 16 bytes; on i686, the base class remains
      12 bytes; and on the impacted ARM platform, the base class grows
      from 12 bytes to 16 bytes due to the increase of alignment from
      4 to 8 bytes.
      
      Reported by Michele Paolino and others.
      
      * src/util/virobject.h (_virObject): Use a union to ensure that
      subclasses never have stricter alignment than the parent.
      * src/util/virobject.c (virObjectNew, virObjectUnref)
      (virObjectRef): Adjust clients.
      * src/libvirt.c (virConnectRef, virDomainRef, virNetworkRef)
      (virInterfaceRef, virStoragePoolRef, virStorageVolRef)
      (virNodeDeviceRef, virSecretRef, virStreamRef, virNWFilterRef)
      (virDomainSnapshotRef): Likewise.
      * src/qemu/qemu_monitor.c (qemuMonitorOpenInternal)
      (qemuMonitorClose): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      fca4f233
  25. 21 11月, 2013 1 次提交
    • E
      maint: fix comma style issues: qemu · 5d509e9e
      Eric Blake 提交于
      Most of our code base uses space after comma but not before;
      fix the remaining uses before adding a syntax check.
      
      * src/qemu/qemu_cgroup.c: Consistently use commas.
      * src/qemu/qemu_command.c: Likewise.
      * src/qemu/qemu_conf.c: Likewise.
      * src/qemu/qemu_driver.c: Likewise.
      * src/qemu/qemu_monitor.c: Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      5d509e9e
  26. 19 11月, 2013 1 次提交
  27. 15 11月, 2013 1 次提交