linux/drivers/net/ethernet/intel
Corinna Vinschen 177132df5e igb: Allow to remove administratively set MAC on VFs
Before libvirt modifies the MAC address and vlan tag for an SRIOV VF
for use by a virtual machine (either using vfio device assignment or
macvtap passthru mode), it saves the current MAC address and vlan tag
so that it can reset them to their original value when the guest is
done.  Libvirt can't leave the VF MAC set to the value used by the
now-defunct guest since it may be started again later using a
different VF, but it certainly shouldn't just pick any random value,
either. So it saves the state of everything prior to using the VF, and
resets it to that.

The igb driver initializes the MAC addresses of all VFs to
00:00:00:00:00:00, and reports that when asked (via an RTM_GETLINK
netlink message, also visible in the list of VFs in the output of "ip
link show"). But when libvirt attempts to restore the MAC address back
to 00:00:00:00:00:00 (using an RTM_SETLINK netlink message) the kernel
responds with "Invalid argument".

Forbidding a reset back to the original value leaves the VF MAC at the
value set for the now-defunct virtual machine. Especially on a system
with NetworkManager enabled, this has very bad consequences, since
NetworkManager forces all interfacess to be IFF_UP all the time - if
the same virtual machine is restarted using a different VF (or even on
a different host), there will be multiple interfaces watching for
traffic with the same MAC address.

To allow libvirt to revert to the original state, we need a way to
remove the administrative set MAC on a VF, to allow normal host
operation again, and to reset/overwrite the VF MAC via VF netdev.

This patch implements the outlined scenario by allowing to set the
VF MAC to 00:00:00:00:00:00 via RTM_SETLINK on the PF.
igb_ndo_set_vf_mac resets the IGB_VF_FLAG_PF_SET_MAC flag to 0,
so it's possible to reset the VF MAC back to the original value via
the VF netdev.

Note: Recent patches to libvirt allow for a workaround if the NIC
isn't capable of resetting the administrative MAC back to all 0, but
in theory the NIC should allow resetting the MAC in the first place.

Signed-off-by: Corinna Vinschen <vinschen@redhat.com>
Tested-by: Aaron Brown <arron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2018-01-24 12:27:48 -08:00
..
e1000 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2018-01-09 10:37:00 -05:00
e1000e e1000e: Fix e1000_check_for_copper_link_ich8lan return value. 2018-01-02 11:40:00 -08:00
fm10k Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2018-01-19 22:59:33 -05:00
i40e i40e: Fix channel addition in reset flow 2018-01-23 11:29:19 -08:00
i40evf i40evf: ignore link up if not running 2018-01-23 11:29:19 -08:00
igb igb: Allow to remove administratively set MAC on VFs 2018-01-24 12:27:48 -08:00
igbvf igbvf: Use smp_rmb rather than read_barrier_depends 2017-11-21 23:46:04 -08:00
ixgb ethernet/intel: Convert timers to use timer_setup() 2017-10-18 12:40:26 +01:00
ixgbe ixgbe: register ipsec offload with the xfrm subsystem 2018-01-23 10:09:12 -08:00
ixgbevf ixgbevf: Fix kernel-doc format warnings 2018-01-12 08:20:47 -08:00
e100.c ethernet/intel: Convert timers to use timer_setup() 2017-10-18 12:40:26 +01:00
Kconfig i40evf: Add support for Adaptive Virtual Function 2017-06-01 14:30:02 -07:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00