• 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
virnetdev.c 85.7 KB