1. 08 3月, 2012 6 次提交
    • E
      xml: output memory unit for clarity · 26545784
      Eric Blake 提交于
      Make it obvious to 'dumpxml' readers what unit we are using,
      since our default of KiB for memory (1024) differs from qemu's
      default of MiB; and differs from our use of bytes for storage.
      
      Tests were updated via:
      
      $ find tests/*data tests/*out -name '*.xml' | \
        xargs sed -i 's/<\(memory\|currentMemory\|hard_limit\|soft_limit\|min_guarantee\|swap_hard_limit\)>/<\1 unit='"'KiB'>/"
      $ find tests/*data tests/*out -name '*.xml' | \
        xargs sed -i 's/<\(capacity\|allocation\|available\)>/<\1 unit='"'bytes'>/"
      
      followed by a few fixes for the stragglers.
      
      Note that with this patch, the RNG for <memory> still forbids
      validation of anything except unit='KiB', since the code silently
      ignores the attribute; a later patch will expand <memory> to allow
      scaled input in the code and update the RNG to match.
      
      * docs/schemas/basictypes.rng (unit): Add 'bytes'.
      (scaledInteger): New define.
      * docs/schemas/storagevol.rng (sizing): Use it.
      * docs/schemas/storagepool.rng (sizing): Likewise.
      * docs/schemas/domaincommon.rng (memoryKBElement): New define; use
      for memory elements.
      * src/conf/storage_conf.c (virStoragePoolDefFormat)
      (virStorageVolDefFormat): Likewise.
      * src/conf/domain_conf.h (_virDomainDef): Document unit used
      internally.
      * src/conf/storage_conf.h (_virStoragePoolDef, _virStorageVolDef):
      Likewise.
      * tests/*data/*.xml: Update all tests.
      * tests/*out/*.xml: Likewise.
      * tests/define-dev-segfault: Likewise.
      * tests/openvzutilstest.c (testReadNetworkConf): Likewise.
      * tests/qemuargv2xmltest.c (blankProblemElements): Likewise.
      26545784
    • E
      xml: share 'unit' in RNG · cb7583e1
      Eric Blake 提交于
      The code supported unit='E' for "exabyte", but the RNG did not;
      conversely, the RNG supported "z" and "y" but the code did not
      (I'm jealous if you have that much storage, particularly since
      it won't fit in 64-bit off_t).  Also, the code supported
      <allocation unit='...'>, but not the RNG.
      
      In an effort to make 'unit' more worthwhile in future patches,
      it's easier to share it between files.
      
      In making this factorization, note that absFilePath is more
      permissive than 'path', so storage pools and storage volumes
      will now validate with a wider set of file names than before.
      I don't think this should be a problem in practice.
      
      * docs/schemas/storagepool.rng: Include basic types, rather than
      repeating things here.
      * docs/schemas/storagevol.rng: Likewise.
      * docs/schemas/basictypes.rng: Add 'unsignedLong', 'unit', and fix
      to match storage code.
      cb7583e1
    • E
      util: new function for scaling numbers · 0d90823e
      Eric Blake 提交于
      Scaling an integer based on a suffix is something we plan on reusing
      in several contexts: XML parsing, virsh CLI parsing, and possibly
      elsewhere.  Make it easy to reuse, as well as adding in support for
      powers of 1000.
      
      * src/util/util.h (virScaleInteger): New function.
      * src/util/util.c (virScaleInteger): Implement it.
      * src/libvirt_private.syms (util.h): Export it.
      0d90823e
    • E
      api: add overflow error · 239fb8c4
      Eric Blake 提交于
      Overflow can be user-induced, so it deserves more than being called
      an internal error.  Note that in general, 32-bit platforms have
      far more places to trigger this error (anywhere the public API
      used 'unsigned long' but the other side of the connection is a
      64-bit server); but some are possible on 64-bit platforms (where
      the public API computes the product of two numbers).
      
      * include/libvirt/virterror.h (VIR_ERR_OVERFLOW): New error.
      * src/util/virterror.c (virErrorMsg): Translate it.
      * src/libvirt.c (virDomainSetVcpusFlags, virDomainGetVcpuPinInfo)
      (virDomainGetVcpus, virDomainGetCPUStats): Use it.
      * daemon/remote.c (HYPER_TO_TYPE): Likewise.
      * src/qemu/qemu_driver.c (qemuDomainBlockResize): Likewise.
      239fb8c4
    • E
      docs: use correct terminology for 1024 bytes · 9dfdeadc
      Eric Blake 提交于
      Yes, I like kilobytes better than kibibytes (when I say kilobytes,
      I generally mean 1024).  But since the term is ambiguous, it can't
      hurt to say what we mean, by using both the correct name and
      calling out the numeric equivalent.
      
      * src/libvirt.c (virDomainGetMaxMemory, virDomainSetMaxMemory)
      (virDomainSetMemory, virDomainSetMemoryFlags)
      (virNodeGetFreeMemory): Tweak wording.
      * docs/formatdomain.html.in: Likewise.
      * docs/formatstorage.html.in: Likewise.
      9dfdeadc
    • L
      util: fix build mingw (and all non-linux) build failure · 861707b9
      Laine Stump 提交于
      ATTRIBUTE_UNUSED was accidentally forgotten on one arg of a stub
      function for functionality that's not present on non-linux
      platforms. This causes a non-linux build with
      --enable-compile-warnings=error to fail.
      861707b9
  2. 07 3月, 2012 8 次提交
  3. 06 3月, 2012 24 次提交
    • R
      qemu: install port profile and mac address on netdev hostdevs · ce43483c
      Roopa Prabhu 提交于
      These changes are applied only if the hostdev has a parent net device
      (i.e. if it was defined as "<interface type='hostdev'>" rather than
      just "<hostdev>").  If the parent netdevice has virtual port
      information, the original virtualport associate functions are called
      (these set and restore both mac and port profile on an
      interface). Otherwise, only mac address is set on the device.
      
      Note that This is only supported for SR-IOV Virtual Functions (not for
      standard PCI or USB netdevs), and virtualport association is only
      supported for 802.1Qbh. For all other types of cards and types of
      virtualport, a "Config Unsupported" error is returned and the
      operation fails.
      Signed-off-by: NRoopa Prabhu <roprabhu@cisco.com>
      ce43483c
    • R
      util: Changes to support portprofiles for hostdevs · 15bbfd83
      Roopa Prabhu 提交于
      This patch includes the following changes to virnetdevmacvlan.c and
      virnetdevvportprofile.c:
      
       - removes some netlink functions which are now available in
         virnetdev.c
      
       - Adds a vf argument to all port profile functions.
      
      For 802.1Qbh devices, the port profile calls can use a vf argument if
      passed by the caller. If the vf argument is -1 it will try to derive the vf
      if the device passed is a virtual function.
      
      For 802.1Qbg devices, This patch introduces a null check for the device
      argument because during port profile assignment on a hostdev, this argument
      can be null.
      Signed-off-by: NRoopa Prabhu <roprabhu@cisco.com>
      15bbfd83
    • R
      util: support functions for mac/portprofile associations on hostdev · 5095bf06
      Roopa Prabhu 提交于
      This patch adds the following:
      
      - functions to set and get vf configs
      - Functions to replace and store vf configs (Only mac address is handled today.
        But the functions can be easily extended for vlans and other vf configs)
      - function to dump link dev info (This is moved from virnetdevvportprofile.c)
      Signed-off-by: NRoopa Prabhu <roprabhu@cisco.com>
      5095bf06
    • R
      util: two new pci util functions · b8b70273
      Roopa Prabhu 提交于
      pciDeviceGetVirtualFunctionInfo returns pf netdevice name and virtual
      function index for a given vf. This is just a wrapper around existing functions
      to return vf's pf and vf_index with one api call
      
      pciConfigAddressToSysfsfile returns the sysfile pci device link
      from a 'struct pci_config_address'
      Signed-off-by: NRoopa Prabhu <roprabhu@cisco.com>
      b8b70273
    • L
      qemu: support type=hostdev network device live hotplug attach/detach · cf90342b
      Laine Stump 提交于
      qemuDomainAttachNetDevice
      
        - re-ordered some things at start of function because
          networkAllocateActualDevice should always be run and a slot
          in def->nets always allocated, but host_net_add isn't needed
          if the actual type is hostdev.
      
        - if actual type is hostdev, defer to
          qemuDomainAttachHostDevice (which will reach up to the NetDef
          for things like MAC address when necessary). After return
          from qemuDomainAttachHostDevice, slip directly to cleanup,
          since the rest of the function is specific to emulated net
          devices.
      
        - put assignment of new NetDef into expanded def->nets down
          below cleanup: (but only on success) since it is also needed
          for emulated and hostdev net devices.
      
      qemuDomainDetachHostDevice
      
        - after locating the exact device to detach, check if it's a
          network device and, if so, use toplevel
          qemuDomainDetachNetDevice instead so that the def->nets list
          is properly updated, and 'actual device' properly returned to
          network pool if appropriate. Otherwise, for normal hostdevs,
          call the lower level qemuDomainDetachThisDevice.
      
      qemuDomainDetachNetDevice
      
        - This is where it gets a bit tricky. After locating the device
          on the def->nets list, if the network device type == hostdev,
          call the *lower level* qemuDomainDetachThisDevice (which will
          reach back up to the parent net device for MAC address /
          virtualport when appropriate, then clear the device out of
          def->hostdevs) before skipping past all the emulated
          net-device-specific code to cleanup:, where the network
          device is removed from def->nets, and the network device
          object is freed.
      
      In short, any time a hostdev-type network device is detached, we must
      go through the toplevel virDomaineDetachNetDevice function first and
      last, to make sure 1) the def->nnets list is properly managed, and 2)
      any device allocated with networkAllocateActualDevice is properly
      freed. At the same time, in the middle we need to go through the
      lower-level vidDomainDetach*This*HostDevice to be sure that 1) the
      def->hostdevs list is properly managed, 2) the PCI device is properly
      detached from the guest and reattached to the host (if appropriate),
      and 3) any higher level teardown is called at the appropriate time, by
      reaching back up to the NetDef config (part (3) will be covered in a
      separate patch).
      cf90342b
    • L
      qemu: use virDomainNetRemove instead of inline code · 16520d65
      Laine Stump 提交于
      The code being replaced is exactly identical to the newly global
      function, right down to the comment.
      16520d65
    • L
      conf: change virDomainNetRemove from static to global · ac9ca01c
      Laine Stump 提交于
      This exact code is duplicated in qemuDomainDetachNetDevice().
      ac9ca01c
    • L
      qemu: support type='hostdev' network devices at domain start · 8639a420
      Laine Stump 提交于
      This patch makes sure that each network device ("interface") of
      type='hostdev' appears on both the hostdevs list and the nets list of
      the virDomainDef, and it modifies the qemu driver startup code so that
      these devices will be presented to qemu on the commandline as hostdevs
      rather than as network devices.
      
      It does not add support for hotplug of these type of devices, or code
      to honor the <mac address> or <virtualport> given in the config (both
      of those will be done in separate patches).
      
      Once each device is placed on both lists, much of what this patch does
      is modify places in the code that traverse all the device lists so
      that these hybrid devices are only acted on once - either along with
      the other hostdevs, or along with the other network interfaces. (In
      many cases, only one of the lists is traversed / a specific operation
      is performed on only one type of device. In those instances, the code
      can remain unchanged.)
      
      There is one special case - when building the commandline, interfaces
      are allowed to proceed all the way through
      networkAllocateActualDevice() before deciding to skip the rest of
      netdev-specific processing - this is so that (once we have support for
      networks with pools of hostdev devices) we can get the actual device
      allocated, then rely on the loop processing all hostdevs to generate
      the correct commandline.
      
      (NB: <interface type='hostdev'> is only supported for PCI network
      devices that are SR-IOV Virtual Functions (VF). Standard PCI[e] and
      USB devices, and even the Physical Functions (PF) of SR-IOV devices
      can only be assigned to a guest using the more basic <hostdev> device
      entry. This limitation is mostly due to the fact that non-SR-IOV
      ethernet devices tend to lose mac address configuration whenever the
      card is reset, which happens when a card is assigned to a guest;
      SR-IOV VFs fortunately don't suffer the same problem.)
      8639a420
    • L
      conf: parse/format type='hostdev' network interfaces · 3b1c191f
      Laine Stump 提交于
      This is the new interface type that sets up an SR-IOV PCI network
      device to be assigned to the guest with PCI passthrough after
      initializing some network device-specific things from the config
      (e.g. MAC address, virtualport profile parameters). Here is an example
      of the syntax:
      
        <interface type='hostdev' managed='yes'>
          <source>
            <address type='pci' domain='0' bus='0' slot='4' function='3'/>
          </source>
          <mac address='00:11:22:33:44:55'/>
          <address type='pci' domain='0' bus='0' slot='7' function='0'/>
        </interface>
      
      This would assign the PCI card from bus 0 slot 4 function 3 on the
      host, to bus 0 slot 7 function 0 on the guest, but would first set the
      MAC address of the card to 00:11:22:33:44:55.
      
      NB: The parser and formatter don't care if the PCI card being
      specified is a standard single function network adapter, or a virtual
      function (VF) of an SR-IOV capable network adapter, but the upcoming
      code that implements the back end of this config will work *only* with
      SR-IOV VFs. This is because modifying the mac address of a standard
      network adapter prior to assigning it to a guest is pointless - part
      of the device reset that occurs during that process will reset the MAC
      address to the value programmed into the card's firmware.
      
      Although it's not supported by any of libvirt's hypervisor drivers,
      usb network hostdevs are also supported in the parser and formatter
      for completeness and consistency. <source> syntax is identical to that
      for plain <hostdev> devices, except that the <address> element should
      have "type='usb'" added if bus/device are specified:
      
        <interface type='hostdev'>
          <source>
            <address type='usb' bus='0' device='4'/>
          </source>
          <mac address='00:11:22:33:44:55'/>
        </interface>
      
      If the vendor/product form of usb specification is used, type='usb'
      is implied:
      
        <interface type='hostdev'>
          <source>
            <vendor id='0x0012'/>
            <product id='0x24dd'/>
          </source>
          <mac address='00:11:22:33:44:55'/>
        </interface>
      
      Again, the upcoming patch to fill in the backend of this functionality
      will log an error and fail with "Unsupported Config" if you actually
      try to assign a USB network adapter to a guest using <interface
      type='hostdev'> - just use a standard <hostdev> entry in that case
      (and also for single-port PCI adapters).
      3b1c191f
    • L
      qemu: refactor hotplug detach of hostdevs · 93870c4e
      Laine Stump 提交于
      This refactoring is necessary to support hotplug detach of
      type=hostdev network devices, but needs to be in a separate patch to
      make potential debugging of regressions more practical.
      
      Rather than the lowest level functions searching for a matching
      device, the search is now done in the toplevel function, and an
      intermediate-level function (qemuDomainDetachThisHostDevice()), which
      expects that the device's entry is already found, is called (this
      intermediate function will be called by qemuDomainDetachNetDevice() in
      order to support detach of type=hostdev net devices)
      
      This patch should result in 0 differences in functionality.
      93870c4e
    • L
      qemu: re-order functions in qemu_hotplug.c · 6fbb957d
      Laine Stump 提交于
      Code movement only, no functional change. This is necessary to prevent
      a forward reference in an upcoming patch.
      6fbb957d
    • L
      conf: hostdev utility functions · cc5b1fe5
      Laine Stump 提交于
      Three new functions useful in other files:
      
      virDomainHostdevInsert:
      
      Add a new hostdev at the end of the array. This would more sensibly be
      called virDomainHostdevAppend, but the existing functions for other
      types of devices are called Insert.
      
      virDomainHostdevRemove:
      
      Eliminates one entry from the hostdevs array, but doesn't free it;
      patterned after the code at the end of the two
      qemuDomainDetachHostXXXDevice functions (and also other pre-existing
      virDomainXXXRemove functions for other device types).
      
      virDomainHostdevFind:
      
      This function is patterned from the search loops at the top of
      qemuDomainDetachHostPciDevice and qemuDomainDetachHostUsbDevice, and
      will be used to re-factor those (and other detach-related) functions.
      cc5b1fe5
    • L
      conf: put subsys part of virDomainHostdevDef into its own struct · 3175df88
      Laine Stump 提交于
      To shorten some new code that accesses the many fields within the
      subsys struct of a hostdev, create a separate toplevel, typedefed
      virDomainHostdevSubsys struct so that we can define temporary pointers
      to the subsys part.
      3175df88
    • L
      conf: give each hostdevdef a parent pointer · b973f920
      Laine Stump 提交于
      The parent can be any type of device. It defaults to type=none, and a
      NULL pointer. The intent is that if a hostdevdef is contained in the
      def for a higher level device (e.g. virDomainNetDef), hostdev->parent
      will point to the higher level device, and type will be set to that
      type of device. This way, during attach and detach of the device,
      parent can be checked, and appropriate callouts made to do higher
      level device initialization (e.g. setting MAC address).
      
      Also, although these hostdevs with parents will be added to a domain's
      hostdevs list, they will be treated slightly differently when
      traversing the list, e.g. virDomainHostdefDefFree for a hostdev that
      has a parent doesn't need to be called (and will be a NOP); it will
      simply be removed from the list (since the parent device object is in
      its own type-specific list, and will be freed from there).
      b973f920
    • L
      conf: HostdevDef parse/format helper functions · 5560170d
      Laine Stump 提交于
      In an upcoming patch, virDomainNetDef will acquire a
      virDomainHostdevDef, and the <interface> XML will take on some of the
      elements of a <hostdev>. To avoid duplicating the code for parsing and
      formatting the <source> element (which will be nearly identical in
      these two cases), this patch factors those parts out of the
      HostdevDef's parse and format functions, and puts them into separate
      helper functions that are now called by the HostdevDef
      parser/formatter, and will soon be called by the NetDef
      parser/formatter.
      
      One change in behavior - previously virDomainHostdevDefParseXML() had
      diverged from current common coding practice by logging an error and
      failing if it found any subelements of <hostdev> other than those it
      understood (standard libvirt practice is to ignore/discard unknown
      elements and attributes during parse). The new helper function ignores
      unknown elements, and thus so does the new
      virDomainHostdevDefParseXML.
      5560170d
    • L
      conf: make hostdev info a separate object · 29293930
      Laine Stump 提交于
      In order to allow for a virDomainHostdevDef that uses the
      virDomainDeviceInfo of a "higher level" device (such as a
      virDomainNetDef), this patch changes the virDomainDeviceInfo in the
      HostdevDef into a virDomainDeviceInfoPtr. Rather than adding checks
      all over the code to check for a null info, we just guarantee that it
      is always valid. The new function virDomainHostdevDefAlloc() allocates
      a virDomainDeviceInfo and plugs it in, and virDomainHostdevDefFree()
      makes sure it is freed.
      
      There were 4 places allocating virDomainHostdevDefs, all of them
      parsers of one sort or another, and those have all had their
      VIR_ALLOC(hostdev) changed to virDomainHostdevDefAlloc(). Other than
      that, and the new functions, all the rest of the changes are just
      mechanical removals of "&" or changing "." to "->".
      29293930
    • L
      conf: add device pointer to args of virDomainDeviceInfoIterate callback · 2f925c65
      Laine Stump 提交于
      There will be cases where the iterator callback will need to know the
      type of the device whose info is being operated on, and possibly even
      need to use some of the device's config. This patch adds a
      virDomainDeviceDefPtr to the args of every callback, and fills it in
      appropriately as the devices are iterated through.
      2f925c65
    • L
      qemu: rename virDomainDeviceInfoPtr variables to avoid confusion · 37038d5c
      Laine Stump 提交于
      The virDomainDeviceInfoPtrs in qemuCollectPCIAddress and
      qemuComparePCIDevice are named "dev" and "dev1", but those functions
      will be changed (in order to match a change in the args sent to
      virDomainDeviceInfoIterate() callback args) to contain a
      virDomainDeviceDefPtr device.
      
      This patch renames "dev" to "info" (and "dev[n]" to "info[n]") to
      avoid later confusion.
      37038d5c
    • L
      conf: reorder static functions in domain_conf.c · fdad9c34
      Laine Stump 提交于
      No code change, movement only.  This is necessary to eliminate forward
      references.
      fdad9c34
    • L
      conf: relocate virDomainDeviceDef and virDomainHostdevDef · 4ec60dfb
      Laine Stump 提交于
      This patch is only code movement + adding some forward definitions of
      typedefs.
      
      virDomainHostdevDef (not just a pointer to it, but an actual object)
      will be needed in virDomainNetDef and virDomainActualNetDef, so it
      must be relocated earlier in the file.
      
      Likewise, virDomainDeviceDef will be needed in virDomainHostdevDef, so
      it must be moved up even earlier. This, in turn, creates a forward
      reference problem, but fortunately only with pointers to other device
      types, so their typedefs can be moved up in the file, eliminating the
      problem.
      4ec60dfb
    • L
      conf: add missing device types to virDomainDevice(Type|Def) · 9890b318
      Laine Stump 提交于
      Not all device types were represented in virDomainDeviceType, so some
      types of devices couldn't be represented in a virDomainDeviceDef
      (which requires a different type of pointer in the union for each
      different kind of device).
      
      Since serial, parallel, channel, and console devices are all
      virDomainChrDef, and the virDomainDeviceType is never used to produce
      a string from the type (and only used in the other direction
      internally to code, never to produce XML), I only added one "CHR"
      type, which is associated with "virDomainChrDefPtr chr" in the union.
      9890b318
    • J
      Fix build after commit e3ba4025 · 118cfc25
      Jim Fehlig 提交于
      Commit e3ba4025 introduced a few build errors with HAVE_LIBNL undefined.
      118cfc25
    • L
      util: eliminate crash in virNetDevMacVLanCreateWithVPortProfile · d2a9d55f
      Laine Stump 提交于
      Commit 723d5c (added after the release of 0.9.10) adds a
      NetlinkEventClient for each interface sent to
      virNetDevMacVLanCreateWithVPortProfile. This should only be done if
      the interface actually *has* a virtPortProfile, otherwise the event
      handler would be a NOP. The bigger problem is that part of the setup
      to create the NetlinkEventClient is to do a memcpy of virtPortProfile
      - if it's NULL, this triggers a segv.
      
      This patch just qualifies the code that adds the client - if
      virtPortProfile is NULL, it's skipped.
      d2a9d55f
    • E
      blockResize: add flag for bytes · 877fd769
      Eric Blake 提交于
      Qemu supports sizing by bytes; we shouldn't force the user to
      round up if they really wanted an unaligned total size.
      
      * include/libvirt/libvirt.h.in (VIR_DOMAIN_BLOCK_RESIZE_BYTES):
      New flag.
      * src/libvirt.c (virDomainBlockResize): Document it.
      * src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockResize): Take
      size in bytes.
      * src/qemu/qemu_monitor_text.c (qemuMonitorTextBlockResize):
      Likewise.  Pass bytes, not megabytes, to monitor.
      * src/qemu/qemu_driver.c (qemuDomainBlockResize): Implement new
      flag.
      877fd769
  4. 05 3月, 2012 2 次提交
    • J
      qemu: Shared or readonly disks are always safe wrt migration · 07dd6fb6
      Jiri Denemark 提交于
      No matter what cache mode is used, readonly disks are always safe wrt
      migration. Shared disks are required to be readonly or to disable
      host-side cache, which makes them safe as well.
      07dd6fb6
    • P
      libvirt-guests: Add parallel startup and shutdown of guests · 6c3642e9
      Peter Krempa 提交于
      With this patch, it's possible to shut down guests in parallel. Parallel
      startup was possible before, but this functionality was not documented
      properly.
      
      To enable parallel startup set the START_DELAY to 0.
      
      Parallel shutdown has a configurable parameter PARALLEL_SHUTDOWN that
      defines the number of machines being shut down in parallel. Enabling
      this feature changes the semantics of SHUTDOWN_TIMEOUT parameter that is
      applied as a cumulative timeout to shutdown all guests on a URI.
      6c3642e9