1. 27 3月, 2017 40 次提交
    • L
      conf: validate that PCI controller index is < 256 · 272f1856
      Laine Stump 提交于
      This is the maximum for many reasons, for starters because index ==
      bus number, and a controller's bus number is 8 bits.
      
      This incidentally resolves: https://bugzilla.redhat.com/1329090
      272f1856
    • L
    • L
      util: log all setting of MAC addresses and vlan tags · 6ec36b06
      Laine Stump 提交于
      Having this information available will make it easier to determine the
      culprit when MAC or vlan tag appear to not be set, eg.:
      
        https://bugzilla.redhat.com/1364073
      
      (This patch doesn't fix that bug, just makes it easier to diagnose)
      6ec36b06
    • L
      util: try *really* hard to set the MAC address of an SRIOV VF · 86556e16
      Laine Stump 提交于
      If an SRIOV VF has previously been used for VFIO device assignment,
      the "admin MAC" that is stored in the PF driver's table of VF info
      will have been set to the MAC address that the virtual machine wanted
      the device to have. Setting the admin MAC for a VF also sets a flag in
      the PF that is loosely called the "administratively set" flag. Once
      that flag is set, it is no longer possible for the net driver of the
      VF (either on the host or in a virtual machine) to directly set the
      VF's MAC again; this flag isn't reset until the *PF* driver is
      restarted, and that requires taking *all* VFs offline, so it's not
      really feasible to do.
      
      If the same SRIOV VF is later used for macvtap passthrough mode, the
      VF's MAC address must be set, but normally we don't unbind the VF from
      its host net driver (since we actually need the host net driver in
      this case). Since setting the VF MAC directly will fail, in the past
      "we" ("I") had tried to fix the problem by simply setting the admin MAC
      (via the PF) instead. This *appeared* to work (and might have at one
      time, due to promiscuous mode being turned on somewhere or something),
      but it currently creates a non-working interface because only the
      value for admin MAC is set to the desired value, *not* the actual MAC
      that the VF is using.
      
      Earlier patches in this series reverted that behavior, so that we once
      again set the MAC of the VF itself for macvtap passthrough operation,
      not the admin MAC. But that brings back the original bug - if the
      interface has been used for VFIO device assignment, you can no longer
      use it for macvtap passthrough.
      
      This patch solves that problem by noticing when virNetDevSetMAC()
      fails for a VF, and in that case it sets the desired MAC to the admin
      MAC via the PF, then "bounces" the VF driver (by unbinding and the
      immediately rebinding it to the VF). This causes the VF's MAC to be
      reinitialized from the admin MAC, and everybody is happy (until the
      *next* time someone wants to set the VF's MAC address, since the
      "administratively set" bit is still turned on).
      86556e16
    • L
      util: if setting admin MAC to 00:00:00:00:00:00 fails, try 02:00:00:00:00:00 · d5f4abef
      Laine Stump 提交于
      Some PF drivers allow setting the admin MAC (that is the MAC address
      that the VF will be initialized to the next time the VF's driver is
      loaded) to 00:00:00:00:00:00, and some don't. Multiple drivers
      initialize the admin MACs to all 0, but don't allow setting it to that
      very same value. It has been an uphill battle convincing the driver
      people that it's reasonable to expect The argument that's used is
      that an all 0 device MAC address on a device is invalid; however, from
      an outsider's point of view, when the admin MAC is set to 0 at the
      time the VF driver is loaded, the VF's MAC is *not* set to 0, but to a
      random non-0 value. But that's beside the point - even if I could
      convince one or two SRIOV driver maintainers to permit setting the
      admin MAC to 0, there are still several other drivers.
      
      So rather than fighting that losing battle, this patch checks for a
      failure to set the admin MAC due to an all 0 value, and retries it
      with 02:00:00:00:00:00. That won't result in a random value being set
      in the VF MAC at next VF driver init, but that's okay, because we
      always want to set a specific value anyway. Rather, the "almost 0"
      setting makes it easy to visually detect from the output of "ip link
      show" which VFs are currently in use and which are free.
      d5f4abef
    • L
      util: remove unused functions from virnetdev.c · bc4168f3
      Laine Stump 提交于
      The global functions virNetDevReplaceMacAddress(),
      virNetDevReplaceNetConfig(), virNetDevRestoreMacAddress(), and
      virNetDevRestoreNetConfig() are no longer used, as their functionality
      has been replaced by virNetDev(Save|Read|Set)NetConfig().
      
      The static functions virNetDevReplaceVfConfig() and
      virNetDevRestoreVfConfig() were only used by the above-named global
      functions that were removed.
      bc4168f3
    • L
      util: after hostdev assignment, restore VF MAC address via setting admin MAC · d6ef331f
      Laine Stump 提交于
      It takes longer to explain this than to fix it...
      
      In the past we weren't able to save the VF's own MAC address *at all*
      when using it for hostdev assignment, because we had already unbound
      the VF from the host net driver prior to saving its config. With the
      previous patch, that problem has been solved, so we now have the VF's
      MAC address saved and can move on to the *next* problem, which is twofold:
      
      1) during teardown we restore the config before we've re-bound, so the
         VF doesn't have a net driver, and thus we can't set its MAC address
         directly.
      
      2) even if we delay restoring the config until the VF is bound to a
         net driver, the request to set its MAC address would fail, since
         (during device setup) we had set the "admin MAC" for the VF via an
         RTM_SETLINK to the PF - once you've set the admin MAC for a VF, the
         VF driver (either on host or on guest) is not allowed to change the
         VF's MAC address "forever" (well, until you reload the PF driver,
         but that requires destroying and recreating every single VF, which
         isn't something you can require).
      
      The solution is to keep the restoration of config at the same place,
      but to set the *admin MAC* to the address you want the VF to have -
      when the VF net driver is later initialized (as a part of re-binding
      to the VF net driver) its MAC will be initialized to the current value
      of the admin MAC.
      d6ef331f
    • L
      util: save hostdev network device config before unbinding from host driver · cceada57
      Laine Stump 提交于
      In order to properly restore the original state of an SRIOV VF when
      we're finished with it, we need to save the MAC address of the VF
      itself (not just the admin MAC address for the VF that is stored in
      the PF). But that can only be done when the VF is still bound to the
      host's netdev driver, and we have always done the saving of device
      config after the VF is already bound to vfio-pci. This patch prepares
      us for adding a save of the VF's MAC by calling the function that
      saves netconfig earlier in the device preparation, before we've
      unbound it from the host netdev driver.
      cceada57
    • L
      util: replace virHostdevNetConfigReplace with ...(Save|Set)NetConfig() · b684734b
      Laine Stump 提交于
      These two operations will need to be separated so that saving of the
      original config is done before detaching the host net driver, and
      setting the new config is done after attaching vfio-pci. This patch
      splits the single function into two, but for now calls them together
      (to make bisecting easier if there is a regression).
      b684734b
    • L
      util: use new virNetDev*NetConfig() functions for hostdev setup/teardown · 9c004d55
      Laine Stump 提交于
      virHostdevNetConfigReplace() and virHostdevNetConfigRestore() are
      modified to use the new virNetDev*NetConfig() functions.
      
      Note that due to the VF's original MAC addresses being saved after it
      has already been un-bound from the host net driver, the actual current
      VF MAC address won't be saved (because it no longer exists) - only the
      "admin MAC" will be saved. This reflects existing behavior that will
      be fixed in an upcoming patch.
      9c004d55
    • L
      util: use new virNetDev*NetConfig() functions for macvtap setup/teardown · b91a3363
      Laine Stump 提交于
      This patch modifies the macvtap passthrough setup to use
      virNetDevSaveNetConfig()+virNetDevSetConfig() instead of
      virNetDevReplaceNetConfig() or virNetDevReplaceMacAddress(), and the
      teardown to use virNetDevReadNetConfig()+virNetDevSetConfig() instead
      of virNetDevRestoreNetConfig() or virNetDevRestoreMacAddress().
      
      Since the older functions only saved/restored the admin MAC and vlan
      tag (which is incorrect) and the new functions save/restore the VF's
      own MAC address and vlan tag (correct), this actually fixes a bug
      (which was introduced by commit cb3fe38c, which was itself supposed
      to be a fix for https://bugzilla.redhat.com/1113474 ).
      
      The downside to this patch is that it causes an *apparent* regression
      in that bug (because there will once again be an error reported if the
      interface had previously been used for VFIO device assignment), but in
      reality, the code hasn't been working for *any* case before this
      current patch (at least not with any recent kernel). Anyway, that
      "regression" will be fixed with an upcoming patch that fixes it the
      *right* way.
      b91a3363
    • L
      util: new functions virNetDev(Save|Read|Set)NetConfig() · 26694daf
      Laine Stump 提交于
      These three functions are destined to replace
      virNetDev(Replace|Restore)NetConfig() and
      virNetDev(Replace|Restore)MacAddress(), which both do the save and set
      together as a single step. We need to separate the save, read, and set
      steps because there will be situations where we need to do something
      else in between (in particular, we will need to rebind a VF's driver
      after save but before set).
      
      This patch creates the new functions, but doesn't call them - that
      will come in a subsequent patch. Note that the new functions to
      read/write the file that stores the original network config now uses
      JSON rather than plaintext (it still recognizes the old format as well
      though, so it won't get confused during an upgrade).
      26694daf
    • P
      qemu: Log additional data from hyperv crash notifier · 2af04bde
      Peter Krempa 提交于
      The hyperv panic notifier reports additional data in form of 5 registers
      that are reported in the crash event from qemu. Log them into the VM log
      file and report them as a warning so that admins can see the cause of
      crash of their windows VMs.
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1426176
      2af04bde
    • P
      qemu: monitor: Extract additional info from GUEST_PANICKED event · d7580dd6
      Peter Krempa 提交于
      For certain kinds of panic notifiers (notably hyper-v) qemu is able to
      report some data regarding the crash passed from the guest.
      
      Make the data accessible to the callback in qemu so that it can be
      processed further.
      d7580dd6
    • P
      7d5c27e9
    • P
      qemu: driver: Remove useless forward declarations · 59a5d158
      Peter Krempa 提交于
      59a5d158
    • E
      c6d0c350
    • E
      docs: Document the new hostdev type 'mdev' · 229dcc73
      Erik Skultety 提交于
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      229dcc73
    • E
      test: Add some test cases for our test suite regarding the mdevs · 1696806f
      Erik Skultety 提交于
      For now, these only cover the unmanaged, i.e. user pre-created devices.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      1696806f
    • E
      qemu: Format mdevs on qemu command line · ef18a50b
      Erik Skultety 提交于
      Format the mediated devices on the qemu command line as
      -device vfio-pci,sysfsdev='/path/to/device/in/syfs'.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      ef18a50b
    • E
      qemu: Bump the memory locking limit for mdevs as well · c8e6775f
      Erik Skultety 提交于
      Since mdevs are just another type of VFIO devices, we should increase
      the memory locking limit the same way we do for VFIO PCI devices.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      c8e6775f
    • E
      qemu: cgroup: Adjust cgroups' logic to allow mediated devices · de4e8bdb
      Erik Skultety 提交于
      As goes for all the other hostdev device types, grant the qemu process
      access to /dev/vfio/<mediated_device_iommu_group>.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      de4e8bdb
    • E
      hostdev: Maintain a driver list of active mediated devices · a4a39d90
      Erik Skultety 提交于
      Keep track of the assigned mediated devices the same way we do it for
      the rest of hostdevs. Methods like 'Prepare', 'Update', and 'ReAttach'
      are introduced by this patch.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      a4a39d90
    • E
      qemu: Assign PCI addresses for mediated devices as well · 9c5fdc3e
      Erik Skultety 提交于
      So far, the official support is for x86_64 arch guests so unless a
      different device API than vfio-pci is available let's only turn on
      support for PCI address assignment. Once a different device API is
      introduced, we can enable another address type easily.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      9c5fdc3e
    • E
      conf: Enable cold-plug of a mediated device · 80c4defb
      Erik Skultety 提交于
      This merely introduces virDomainHostdevMatchSubsysMediatedDev method that
      is supposed to check whether device being cold-plugged does not already
      exist in the domain configuration.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      80c4defb
    • E
      security: Enable labeling of vfio mediated devices · 606afafb
      Erik Skultety 提交于
      This patch updates all of our security driver to start labeling the
      VFIO IOMMU devices under /dev/vfio/ as well.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      606afafb
    • E
      conf: Introduce new hostdev device type mdev · ec783d7c
      Erik Skultety 提交于
      A mediated device will be identified by a UUID (with 'model' now being
      a mandatory <hostdev> attribute to represent the mediated device API) of
      the user pre-created mediated device. We also need to make sure that if
      user explicitly provides a guest address for a mdev device, the address
      type will be matching the device API supported on that specific mediated
      device and error out with an incorrect XML message.
      
      The resulting device XML:
      <devices>
        <hostdev mode='subsystem' type='mdev' model='vfio-pci'>
          <source>
            <address uuid='c2177883-f1bb-47f0-914d-32a22e3a8804'>
          </source>
        </hostdev>
      </devices>
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      ec783d7c
    • E
      util: Introduce new module virmdev · e1ec4f88
      Erik Skultety 提交于
      Beside creation, disposal, getter, and setter methods the module exports
      methods to work with lists of mediated devices.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      e1ec4f88
    • E
      conf: Introduce virDomainHostdevDefPostParse · 57d16d7c
      Erik Skultety 提交于
      Just to make the code a bit cleaner, move hostdev specific post parse
      code to its own function just in case it grows in the future.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      57d16d7c
    • E
      conf: hostdev: Introduce virDomainHostdevSubsysSCSIClear · 428e71bd
      Erik Skultety 提交于
      Just a tiny wrapper over the SCSI def clearing logic to drop some
      if-else branches from a switch, mainly because extending the switch in
      the future would render the current code with branching less readable.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      428e71bd
    • E
      conf: hostdev: Enforce enum-in-switch compile-time checks · 83836d57
      Erik Skultety 提交于
      Enforce virDomainHostdevSubsysType checking during compilation. Again,
      one of a few spots in our code where we should enforce the typecast to
      the enum type, thus not forgetting to update *all* switch occurrences
      dealing with the give enum.
      Signed-off-by: NErik Skultety <eskultet@redhat.com>
      83836d57
    • E
      util: fix build on RHEL 6 · 04419847
      Eric Blake 提交于
      We keep forgetting that older setups don't like 'index':
      
        CC     util/libvirt_util_la-virsysinfo.lo
      cc1: warnings being treated as errors
      util/virstoragefile.c: In function 'virStorageSourceFindByNodeName':
      util/virstoragefile.c:3804: error: declaration of 'index' shadows a global declaration [-Wshadow]
      /usr/include/string.h:489: error: shadowed declaration is here [-Wshadow]
      Signed-off-by: NEric Blake <eblake@redhat.com>
      04419847
    • M
      tests: Enhance vircaps2xml test · ad589e1f
      Martin Kletzander 提交于
      Instead of generating all of the capabilities, let's test more of our
      code by probing sysfs data.  This test needs quite some mocking for
      now, but it paves the road for more future enhancements (hugepages
      probing, for example).
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      ad589e1f
    • M
      tests: Add virnumamock · 9368095b
      Martin Kletzander 提交于
      All mocked functions are related to numactl/virNuma and rely only on
      virsysfs, so the paths they touch can be nicely controlled.  And
      because it is so nicely self-contained NUMA mock, it is named
      numamock (instead of naming it after the test that will use it first).
      
      We need top level API mock because some APIs might call libnuma
      directly, e.g. virNumaIsAvailable(), virNumaGetMaxNode().
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      9368095b
    • M
      tests: Add linux-caches sysfs entries for vircaps2xmltest · a0fdd2f6
      Martin Kletzander 提交于
      Bit more test data, this time with complete info copied, mainly with
      cache information, so we can easily add tests for it.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      a0fdd2f6
    • M
      tests: Add sysfs node/cpu topology for the only vircaps2xml testcase · a8571401
      Martin Kletzander 提交于
      We'll stop generating the data on the fly, but rather test more of our
      APIs.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      a8571401
    • M
      Change virQEMUCapsInitPages to virCapabilitiesInitPages · 335f6373
      Martin Kletzander 提交于
      This way more drivers can utilize the functionality without copying
      the code.  And we can therefore test it in one place for all of them.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      335f6373
    • M
      util: Fix naming in util/virnodesuspend · d2d1dec1
      Martin Kletzander 提交于
      That file has only two exported files and each one of them has
      different naming.  virNode is what all the other files use, so let's
      use it.  It wasn't used before because the clash with public API
      naming, so let's fix that by shortening the name (there is no other
      private variant of it anyway).
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      d2d1dec1
    • M
      Remove src/nodeinfo · 26ae4e48
      Martin Kletzander 提交于
      There is no "node driver" as there was before, drivers have to do
      their own ACL checking anyway, so they all specify their functions and
      nodeinfo is basically just extending conf/capablities.  Hence moving
      the code to src/conf/ is the right way to go.
      
      Also that way we can de-duplicate some code that is in virsysfs and/or
      virhostcpu that got duplicated during the virhostcpu.c split.  And
      Some cleanup is done throughout the changes, like adding the vir*
      prefix etc.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      26ae4e48
    • M
      Move src/fdstream to src/util/virfdstream · bdcb1995
      Martin Kletzander 提交于
      There is no reason for it not to be in the utils, all global symbols
      under that file already have prefix vir* and there is no reason for it
      to be part of DRIVER_SOURCES because that is just a leftover from
      older days (pre-driver modules era, I believe).
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      bdcb1995