1. 15 9月, 2011 2 次提交
    • J
      Use max bandwidth from qemuDomainObjPrivate struct when migrating · 0257ba8f
      Jim Fehlig 提交于
      Adjust qemuMigrationRun() to use migMaxBandwidth in qemuDomainObjPrivate
      structure when setting qemu migration speed.  Caller-specified 'resource'
      parameter overrides migMaxBandwidth.
      0257ba8f
    • J
      Set qemu migration speed unlimited when migrating to file · ef1065cf
      Jim Fehlig 提交于
      The qemu migration speed default is 32MiB/s as defined in migration.c
      
      /* Migration speed throttling */
      static int64_t max_throttle = (32 << 20);
      
      There's no need to throttle migration when targeting a file, so set migration
      speed to unlimited prior to migration, and restore to libvirt default value
      after migration.
      
      Default units is MB for migrate_set_speed monitor command, so
      (INT64_MAX / (1024 * 1024)) is used for unlimited migration speed.
      
      Tested with both json and text monitors.
      ef1065cf
  2. 14 9月, 2011 1 次提交
    • P
      xml: Clean up rest of virtual XML document names for XML strings · b998f1f7
      Peter Krempa 提交于
      Commit 498d7833 cleans up some of virtual file names for parsing strings
      in memory. This patch cleans up (hopefuly) the rest forgotten by the
      first patch.
      
      This patch also changes all of the previously modified "filenames" to
      valid URI's replacing spaces for underscores.
      
      Changes to v1:
      - Replace all spaces for underscores, so that the strings form valid
        URI's
      - Replace spaces in places changed by commit 498d7833
      b998f1f7
  3. 03 9月, 2011 1 次提交
    • E
      snapshot: prevent migration from stranding snapshot data · e2fb96d9
      Eric Blake 提交于
      Migration is another case of stranding metadata.  And since
      snapshot metadata is arbitrarily large, there's no way to
      shoehorn it into the migration cookie of migration v3.
      
      This patch consolidates two existing locations for migration
      validation into one helper function, then enhances that function
      to also do the new checks.  If we could always trust the source
      to validate migration, then the destination would not have to
      do anything; but since older servers that did not do checking
      can migrate to newer destinations, we have to repeat some of
      the same checks on the destination; meanwhile, we want to
      detect failures as soon as possible.  With migration v2, this
      means that validation will reject things at Prepare on the
      destination if the XML exposes the problem, otherwise at Perform
      on the source; with migration v3, this means that validation
      will reject things at Begin on the source, or if the source
      is old and the XML exposes the problem, then at Prepare on the
      destination.
      
      This patch is necessarily over-strict.  Once a later patch
      properly handles auto-cleanup of snapshot metadata on the
      death of a transient domain, then the only time we actually
      need snapshots to prevent migration is when using the
      --undefinesource flag on a persistent source domain.
      
      It is possible to recreate snapshot metadata on the destination
      with VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE and
      VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT.  But for now, that is limited,
      since if we delete the snapshot metadata prior to migration,
      then we won't know the name of the current snapshot to pass
      along; and if we delete the snapshot metadata after migration
      and use the v3 migration cookie to pass along the name of the
      current snapshot, then we need a way to bypass the fact that
      this patch refuses migration with snapshot metadata present.
      
      So eventually, we may have to introduce migration protocol v4
      that allows feature negotiation and an arbitrary number of
      handshake exchanges, so as to pass as many rpc calls as needed
      to transfer all the snapshot xml hierarchy.
      
      But all of that is thoughts for the future; for now, the best
      course of action is to quit early, rather than get into a
      funky state of stale metadata; then relax restrictions later.
      
      * src/qemu/qemu_migration.h (qemuMigrationIsAllowed): Make static.
      * src/qemu/qemu_migration.c (qemuMigrationIsAllowed): Alter
      signature, and allow checks for both outgoing and incoming.
      (qemuMigrationBegin, qemuMigrationPrepareAny)
      (qemuMigrationPerformJob): Update callers.
      e2fb96d9
  4. 02 9月, 2011 1 次提交
    • E
      qemu: refactor file opening · 449ae9c2
      Eric Blake 提交于
      In a SELinux or root-squashing NFS environment, libvirt has to go
      through some hoops to create a new file that qemu can then open()
      by name.  Snapshots are a case where we want to guarantee an empty
      file that qemu can open; also, reopening a save file to convert it
      from being marked partial to complete requires a reopen to avoid
      O_DIRECT headaches.  Refactor some existing code to make it easier
      to reuse in later patches.
      
      * src/qemu/qemu_migration.h (qemuMigrationToFile): Drop parameter.
      * src/qemu/qemu_migration.c (qemuMigrationToFile): Let cgroup do
      the stat, rather than asking caller to do it and pass info down.
      * src/qemu/qemu_driver.c (qemuOpenFile): New function, pulled from...
      (qemuDomainSaveInternal): ...here.
      (doCoreDump, qemuDomainSaveImageOpen): Use it here as well.
      449ae9c2
  5. 30 8月, 2011 1 次提交
  6. 26 8月, 2011 4 次提交
    • K
      Fix persistent migration config save · 709b4c50
      KAMEZAWA Hiroyuki 提交于
      When a user migrates a domain by command as
      
      libvirt saves vm's domain XML config in destination host after migration.
      But it saves vm->def. Then, the saved XML contains some garbage.
      
        <domain type='kvm' id='50'>
                           ^^^^^^^^
        ...
         <console type='pty' tty='/dev/pts/5'>
                             ^^^^^^^^^^^^^^^^^
      
      Avoid saving unnecessary things by saving persistent vm definition.
      709b4c50
    • J
      qemu: Correctly label migration TCP socket · 855f7689
      Jiri Denemark 提交于
      855f7689
    • E
      snapshot: only pass snapshot to qemu command line when reverting · 5e47785b
      Eric Blake 提交于
      Changing the current vm, and writing that change to the file
      system, all before a new qemu starts, is risky; it's hard to
      roll back if starting the new qemu fails for some reason.
      Instead of abusing vm->current_snapshot and making the command
      line generator decide whether the current snapshot warrants
      using -loadvm, it is better to just directly pass a snapshot all
      the way through the call chain if it is to be loaded.
      
      This frees up the last use of snapshot->def->active for qemu's
      use, so the next patch can repurpose that field for tracking
      which snapshot is current.
      
      * src/qemu/qemu_command.c (qemuBuildCommandLine): Don't use active
      field of snapshot.
      * src/qemu/qemu_process.c (qemuProcessStart): Add a parameter.
      * src/qemu/qemu_process.h (qemuProcessStart): Update prototype.
      * src/qemu/qemu_migration.c (qemuMigrationPrepareAny): Update
      callers.
      * src/qemu/qemu_driver.c (qemudDomainCreate)
      (qemuDomainSaveImageStartVM, qemuDomainObjStart)
      (qemuDomainRevertToSnapshot): Likewise.
      (qemuDomainSnapshotSetCurrentActive)
      (qemuDomainSnapshotSetCurrentInactive): Delete unused functions.
      5e47785b
    • A
      qemu: avoid dead store in doPeer2PeerMigrate3 · d69d3210
      Alex Jia 提交于
      * src/qemu/qemu_migration.c: avoid dead 'ret' assignment and silence
        clang warning.
      
      Detected by ccc-analyzer:
      
        CC     libvirt_driver_qemu_la-qemu_migration.lo
      qemu/qemu_migration.c:2046:5: warning: Value stored to 'ret' is never read
          ret = qemuMigrationConfirm(driver, sconn, vm,
          ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      d69d3210
  7. 19 8月, 2011 1 次提交
    • E
      maint: simplify lots of libxml2 clients · d89dd42d
      Eric Blake 提交于
      Repetitive patterns should be factored.  The sign of a good
      factorization is a change that kills 5x more lines than it adds :)
      
      * src/conf/domain_conf.c (virDomainDeviceDefParse)
      (virDomainSnapshotDefParseString): Use new convenience macros.
      * src/conf/storage_conf.c (virStoragePoolDefParseSourceString):
      Likewise.
      * src/cpu/cpu.c (cpuCompareXML, cpuBaselineXML): Likewise.
      * src/esx/esx_vi.c (esxVI_Context_Execute): Likewise.
      * src/qemu/qemu_migration.c (qemuMigrationCookieXMLParseStr):
      Likewise.
      * src/security/virt-aa-helper.c (caps_mockup): Likewise.
      * src/test/test_driver.c (testOpenFromFile): Likewise.
      * tests/cputest.c (cpuTestLoadXML, cpuTestLoadMultiXML):
      Likewise.
      * tools/virsh.c (cmdFreecell, makeCloneXML, cmdVNCDisplay)
      (cmdTTYConsole, cmdDetachInterface, cmdDetachDisk)
      (cmdSnapshotCreate, cmdSnapshotCreateAs, cmdSnapshotCurrent)
      (cmdSnapshotList, cmdSnapshotParent): Likewise.
      d89dd42d
  8. 15 8月, 2011 4 次提交
  9. 06 8月, 2011 1 次提交
  10. 03 8月, 2011 1 次提交
    • E
      qemu: remove dead code · 9a87657a
      Eric Blake 提交于
      Warning detected by Coverity.  No need for the NULL check, and
      removing it silences the warning without any semantic change.
      
      * src/qemu/qemu_migration.c (qemuMigrationFinish): All entries to
      endjob had non-NULL vm.
      9a87657a
  11. 01 8月, 2011 1 次提交
    • E
      qemu: fix crash when mixing sync and async monitor jobs · 193cd0f3
      Eric Blake 提交于
      Currently, we attempt to run sync job and async job at the same time. It
      means that the monitor commands for two jobs can be run in any order.
      
      In the function qemuDomainObjEnterMonitorInternal():
          if (priv->job.active == QEMU_JOB_NONE && priv->job.asyncJob) {
              if (qemuDomainObjBeginNestedJob(driver, obj) < 0)
      We check whether the caller is an async job by priv->job.active and
      priv->job.asynJob. But when an async job is running, and a sync job is
      also running at the time of the check, then priv->job.active is not
      QEMU_JOB_NONE. So we cannot check whether the caller is an async job
      in the function qemuDomainObjEnterMonitorInternal(), and must instead
      put the burden on the caller to tell us when an async command wants
      to do a nested job.
      
      Once the burden is on the caller, then only async monitor enters need
      to worry about whether the VM is still running; for sync monitor enter,
      the internal return is always 0, so lots of ignore_value can be dropped.
      
      * src/qemu/THREADS.txt: Reflect new rules.
      * src/qemu/qemu_domain.h (qemuDomainObjEnterMonitorAsync): New
      prototype.
      * src/qemu/qemu_process.h (qemuProcessStartCPUs)
      (qemuProcessStopCPUs): Add parameter.
      * src/qemu/qemu_migration.h (qemuMigrationToFile): Likewise.
      (qemuMigrationWaitForCompletion): Make static.
      * src/qemu/qemu_domain.c (qemuDomainObjEnterMonitorInternal): Add
      parameter.
      (qemuDomainObjEnterMonitorAsync): New function.
      (qemuDomainObjEnterMonitor, qemuDomainObjEnterMonitorWithDriver):
      Update callers.
      * src/qemu/qemu_driver.c (qemuDomainSaveInternal)
      (qemudDomainCoreDump, doCoreDump, processWatchdogEvent)
      (qemudDomainSuspend, qemudDomainResume, qemuDomainSaveImageStartVM)
      (qemuDomainSnapshotCreateActive, qemuDomainRevertToSnapshot):
      Likewise.
      * src/qemu/qemu_process.c (qemuProcessStopCPUs)
      (qemuProcessFakeReboot, qemuProcessRecoverMigration)
      (qemuProcessRecoverJob, qemuProcessStart): Likewise.
      * src/qemu/qemu_migration.c (qemuMigrationToFile)
      (qemuMigrationWaitForCompletion, qemuMigrationUpdateJobStatus)
      (qemuMigrationJobStart, qemuDomainMigrateGraphicsRelocate)
      (doNativeMigrate, doTunnelMigrate, qemuMigrationPerformJob)
      (qemuMigrationPerformPhase, qemuMigrationFinish)
      (qemuMigrationConfirm): Likewise.
      * src/qemu/qemu_hotplug.c: Drop unneeded ignore_value.
      193cd0f3
  12. 29 7月, 2011 1 次提交
    • L
      conf: add <listen> subelement to domain <graphics> element · ef79fb5b
      Laine Stump 提交于
      Once it's plugged in, the <listen> element will be an optional
      replacement for the "listen" attribute that graphics elements already
      have. If the <listen> element is type='address', it will have an
      attribute called 'address' which will contain an IP address or dns
      name that the guest's display server should listen on. If, however,
      type='network', the <listen> element should have an attribute called
      'network' that will be set to the name of a network configuration to
      get the IP address from.
      
      * docs/schemas/domain.rng: updated to allow the <listen> element
      
      * docs/formatdomain.html.in: document the <listen> element and its
        attributes.
      
      * src/conf/domain_conf.[hc]:
      
        1) The domain parser, formatter, and data structure are modified to
           support 0 or more <listen> subelements to each <graphics>
           element. The old style "legacy" listen attribute is also still
           accepted, and will be stored internally just as if it were a
           separate <listen> element. On output (i.e. format), the address
           attribute of the first <listen> element of type 'address' will be
           duplicated in the legacy "listen" attribute of the <graphic>
           element.
      
        2) The "listenAddr" attribute has been removed from the unions in
           virDomainGRaphicsDef for graphics types vnc, rdp, and spice.
           This attribute is now in the <listen> subelement (aka
           virDomainGraphicsListenDef)
      
        3) Helper functions were written to provide simple access
           (both Get and Set) to the listen elements and their attributes.
      
      * src/libvirt_private.syms: export the listen helper functions
      
      * src/qemu/qemu_command.c, src/qemu/qemu_hotplug.c,
        src/qemu/qemu_migration.c, src/vbox/vbox_tmpl.c,
        src/vmx/vmx.c, src/xenxs/xen_sxpr.c, src/xenxs/xen_xm.c
      
        Modify all these files to use the listen helper functions rather
        than directly referencing the (now missing) listenAddr
        attribute. There can be multiple <listen> elements to a single
        <graphics>, but the drivers all currently only support one, so all
        replacements of direct access with a helper function indicate index
        "0".
      
      * tests/* - only 3 of these are new files added explicitly to test the
        new <listen> element. All the others have been modified to reflect
        the fact that any legacy "listen" attributes passed in to the domain
        parse will be saved in a <listen> element (i.e. one of the
        virDomainGraphicsListenDefs), and during the domain format function,
        both the <listen> element as well as the legacy attributes will be
        output.
      ef79fb5b
  13. 27 7月, 2011 9 次提交
  14. 22 7月, 2011 4 次提交
    • L
      qemu: use virDomainNetGetActual*() functions where appropriate · 03caa988
      Laine Stump 提交于
      The qemu driver accesses fields in the virDomainNetDef directly, but
      with the advent of the virDomainActualNetDef, some pieces of
      information may be found in a different place (the ActualNetDef) if
      the network connection is of type='network' and that network is of
      forward type='bridge|private|vepa|passthrough'. The previous patch
      added functions to mask this difference from callers - they hide the
      decision making process and just pick the value from the proper place.
      
      This patch uses those functions in the qemu driver as a first step in
      making qemu work with the new network types. At this point, the
      virDomainActualNetDef is guaranteed always NULL, so the GetActualX()
      function will return exactly what the def->X that's being replaced
      would have returned (ie bisecting is not compromised).
      
      There is one place (in qemu_driver.c) where the internal details of
      the NetDef are directly manipulated by the code, so the GetActual
      functions cannot be used there without extra additional code; that
      file will be treated in a separate patch.
      03caa988
    • L
      conf: virDomainNetDef points to (rather than contains) virtPortProfile · 524655ee
      Laine Stump 提交于
      The virtPortProfile in the domain interface struct is now a separately
      allocated object *pointed to by* (rather than contained in) the main
      virDomainNetDef object. This is done to make it easier to figure out
      when a virtualPortProfile has/hasn't been specified in a particular
      config.
      524655ee
    • E
      qemu: fix error message with migrate2 xml · 360e5ea1
      Eric Blake 提交于
      Otherwise, an ABI mismatch gives error messages attributing the target
      xml string as current, and the current domain state as the new xml.
      
      * src/qemu/qemu_migration.c (qemuMigrationBegin): Use correct
      argument order.
      360e5ea1
    • E
      build: rename files.h to virfile.h · 8e22e089
      Eric Blake 提交于
      In preparation for a future patch adding new virFile APIs.
      
      * src/util/files.h, src/util/files.c: Move...
      * src/util/virfile.h, src/util/virfile.c: ...here, and rename
      functions to virFile prefix.  Macro names are intentionally
      left alone.
      * *.c: All '#include "files.h"' uses changed.
      * src/Makefile.am (UTIL_SOURCES): Reflect rename.
      * cfg.mk (exclude_file_name_regexp--sc_prohibit_close): Likewise.
      * src/libvirt_private.syms: Likewise.
      * docs/hacking.html.in: Likewise.
      * HACKING: Regenerate.
      8e22e089
  15. 19 7月, 2011 1 次提交
    • D
      Fix reporting of errors for p2p migration · 789fc4ae
      Daniel P. Berrange 提交于
      Starting/ending jobs when closing the connection may reset any
      error which was reported earlier in p2p migration. We must
      save the original error before doing so. This means we can also
      just call virConnectClose as normal, instead of virUnrefConnect
      
      * src/qemu/qemu_migration.c: Preserve errors in p2p migration
      789fc4ae
  16. 16 7月, 2011 1 次提交
    • E
      flags: fix qemu migration regression · 8d733f4e
      Eric Blake 提交于
      Commit f548480b broke migration v3 on qemu, because the driver
      passed flags on through to qemu_migration even though
      qemu_migration wasn't using those flags.
      
      * src/qemu/qemu_migration.h (QEMU_MIGRATION_FLAGS): New define.
      * src/qemu/qemu_driver.c: Simplify all migration callbacks.
      * src/qemu/qemu_migration.c (qemuMigrationConfirm): Fix regression.
      8d733f4e
  17. 14 7月, 2011 1 次提交
    • E
      qemu: reject unknown flags · f548480b
      Eric Blake 提交于
      * src/qemu/qemu_driver.c (qemudOpen, qemuDomainScreenshot)
      (qemuDomainXMLFromNative, qemuDomainXMLToNative)
      (qemudDomainBlockPeek, qemuCPUCompare, qemuCPUBaseline): Reject
      unknown flags.
      * src/qemu/qemu_migration.c (qemuMigrationConfirm): Likewise.
      (_qemuMigrationCookie, qemuMigrationCookieXMLParse)
      (qemuMigrationCookieXMLParseStr, qemuMigrationBakeCookie)
      (qemuMigrationEatCookie): Make flags unsigned.
      * src/qemu/qemu_domain.h: (qemuDomainDefFormatXML)
      (qemuDomainFormatXML): Prefer unsigned flags.
      * src/qemu/qemu_domain.c (qemuDomainDefFormatXML)
      (qemuDomainFormatXML): Likewise.
      (qemuDomainOpenLogHelper, qemuDomainCreateLog): Rename variable.
      f548480b
  18. 13 7月, 2011 5 次提交
    • E
      maint: print flags in hex during debug · 06dbfa6d
      Eric Blake 提交于
      Continuation of commit 313ac7fd, and enforce things with a syntax
      check.
      
      Technically, virNetServerClientCalculateHandleMode is not printing
      a mode_t, but rather a collection of VIR_EVENT_HANDLE_* bits;
      however, these bits are < 8, so there is no different in the
      output, and that was the easiest way to silence the new syntax check.
      
      * cfg.mk (sc_flags_debug): New syntax check.
      (exclude_file_name_regexp--sc_flags_debug): Add exemptions.
      * src/fdstream.c (virFDStreamOpenFileInternal): Print flags in
      hex, mode_t in octal.
      * src/libvirt-qemu.c (virDomainQemuMonitorCommand)
      (virDomainQemuAttach): Likewise.
      * src/locking/lock_driver_nop.c (virLockManagerNopInit): Likewise.
      * src/locking/lock_driver_sanlock.c (virLockManagerSanlockInit):
      Likewise.
      * src/locking/lock_manager.c: Likewise.
      * src/qemu/qemu_migration.c: Likewise.
      * src/qemu/qemu_monitor.c: Likewise.
      * src/rpc/virnetserverclient.c
      (virNetServerClientCalculateHandleMode): Print mode with %o.
      06dbfa6d
    • J
      qemu: Consolidate qemuMigrationPrepare{Direct,Tunnel} · 307656b4
      Jiri Denemark 提交于
      Most of the code in these two functions is supposed to be identical but
      currently it isn't (which is natural since the code is duplicated).
      Let's move common parts of these functions into qemuMigrationPrepareAny.
      
      This also fixes qemuMigrationPrepareTunnel which didn't store received
      lockState in the domain object.
      307656b4
    • J
      qemu: Save job type in domain status XML · ff340a84
      Jiri Denemark 提交于
      If libvirtd is restarted when a job is running, the new libvirtd process
      needs to know about that to be able to recover and rollback the
      operation.
      ff340a84
    • J
      qemu: Allow all query commands to be run during long jobs · 36184288
      Jiri Denemark 提交于
      Query commands are safe to be called during long running jobs (such as
      migration). This patch makes them all work without the need to
      special-case every single one of them.
      
      The patch introduces new job.asyncCond condition and associated
      job.asyncJob which are dedicated to asynchronous (from qemu monitor
      point of view) jobs that can take arbitrarily long time to finish while
      qemu monitor is still usable for other commands.
      
      The existing job.active (and job.cond condition) is used all other
      synchronous jobs (including the commands run during async job).
      
      Locking schema is changed to use these two conditions. While asyncJob is
      active, only allowed set of synchronous jobs is allowed (the set can be
      different according to a particular asyncJob) so any method that
      communicates to qemu monitor needs to check if it is allowed to be
      executed during current asyncJob (if any). Once the check passes, the
      method needs to normally acquire job.cond to ensure no other command is
      running. Since domain object lock is released during that time, asyncJob
      could have been started in the meantime so the method needs to recheck
      the first condition. Then, normal jobs set job.active and asynchronous
      jobs set job.asyncJob and optionally change the list of allowed job
      groups.
      
      Since asynchronous jobs only set job.asyncJob, other allowed commands
      can still be run when domain object is unlocked (when communicating to
      remote libvirtd or sleeping). To protect its own internal synchronous
      commands, the asynchronous job needs to start a special nested job
      before entering qemu monitor. The nested job doesn't check asyncJob, it
      only acquires job.cond and sets job.active to block other jobs.
      36184288
    • J
      qemu: Separate job related data into a new object · 90a422f0
      Jiri Denemark 提交于
      90a422f0