i40e: Wait for pending VF reset in VF set callbacks
authorIvan Vecera <ivecera@redhat.com>
Thu, 13 Jul 2023 14:57:55 +0000 (16:57 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 14 Jul 2023 17:15:06 +0000 (10:15 -0700)
commitefb6f4a35954de375a74daf9770fe6b634f6ca56
treed6010bab1cb33eeb3b41daeff79c29641bb1c989
parentdf84f0ce569dbec8cb4895a9aafab53fc9306320
i40e: Wait for pending VF reset in VF set callbacks

Commit 028daf80117376 ("i40e: Fix attach VF to VM issue") fixed
a race between i40e_ndo_set_vf_mac() and i40e_reset_vf() during
an attachment of VF device to VM. This issue is not related to
setting MAC address only but also VLAN assignment to particular
VF because the newer libvirt sets configured MAC address as well
as an optional VLAN. The same behavior is also for i40e's
.ndo_set_vf_rate and .ndo_set_vf_spoofchk where the callbacks
just check if the VF was initialized but not wait for the finish
of pending reset.

Reproducer:
[root@host ~]# virsh attach-interface guest hostdev --managed 0000:02:02.0 --mac 52:54:00:b4:aa:bb
error: Failed to attach interface
error: Cannot set interface MAC/vlanid to 52:54:00:b4:aa:bb/0 for ifname enp2s0f0 vf 0: Resource temporarily unavailable

Fix this issue by using i40e_check_vf_init_timeout() helper to check
whether a reset of particular VF was finished in i40e's
.ndo_set_vf_vlan, .ndo_set_vf_rate and .ndo_set_vf_spoofchk callbacks.

Tested-by: Ma Yuying <yuma@redhat.com>
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c