]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i40e: make use of i40e_reset_all_vfs when initializing new VFs
authorJacob Keller <jacob.e.keller@intel.com>
Thu, 13 Apr 2017 08:45:55 +0000 (04:45 -0400)
committerJack Vogel <jack.vogel@oracle.com>
Tue, 10 Oct 2017 21:15:23 +0000 (14:15 -0700)
When allocating a large number of VFs, the driver previously used
i40e_reset_vf in a sequence. Just as when performing a normal reset,
this accumulates a large amount of delay for handling all of the VFs in
sequence. This delay is mainly due to a hardware requirement to wait
after initiating a reset on the VF.

We recently added a new function, i40e_reset_all_vfs() which can be used
to amortize the delay time, by first triggering all VF resets, then
waiting once, and finally cleaning up and allocating the VFs. This is
almost as good as truly running the resets in parallel.

In order to avoid sending a spurious reset message to a client
interface, we have a check to see whether we've assigned
pf->num_alloc_vfs yet. This was originally intended as a way to
distinguish the "initialization" case from the regular reset case.

Unfortunately, this means that we can't directly use i40e_reset_all_vfs
yet. Lets avoid this check of pf->num_alloc_vfs by replacing it with
a proper VSI state bit which we can use instead. This makes the
intention much clearer and allows us to re-use the i40e_reset_all_vfs
function directly.

Change-ID: I694279b37eb6b5a91b6670182d0c15d10244fd6e
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Mitch Williams <mitch.a.williams@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Orabug: 26785018
(cherry picked from commit 1b48437028603ec51d5a1eb276c941c866375a3e)
Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
Reviewed-by: Kyle Fortin <kyle.fortin@oracle.com>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h

index a2cbd0f9fb11489f2a438cac2ec12a74755183ad..dc71aeb46cd30450d0ea4431e0a091376ea82621 100644 (file)
@@ -1007,7 +1007,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf)
                set_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states);
                clear_bit(I40E_VF_STATE_DISABLED, &vf->vf_states);
                /* Do not notify the client during VF init */
-               if (vf->pf->num_alloc_vfs)
+               if (test_and_clear_bit(I40E_VF_STATE_PRE_ENABLE,
+                                      &vf->vf_states))
                        i40e_notify_client_of_vf_reset(pf, abs_vf_id);
                vf->num_vlan = 0;
        }
@@ -1280,12 +1281,15 @@ int i40e_alloc_vfs(struct i40e_pf *pf, u16 num_alloc_vfs)
                /* assign default capabilities */
                set_bit(I40E_VIRTCHNL_VF_CAP_L2, &vfs[i].vf_caps);
                vfs[i].spoofchk = true;
-               /* VF resources get allocated during reset */
-               i40e_reset_vf(&vfs[i], false);
+
+               set_bit(I40E_VF_STATE_PRE_ENABLE, &vfs[i].vf_states);
 
        }
        pf->num_alloc_vfs = num_alloc_vfs;
 
+       /* VF resources get allocated during reset */
+       i40e_reset_all_vfs(pf, false);
+
        i40e_notify_client_of_vf_enable(pf, num_alloc_vfs);
 
 err_alloc:
index c012116df2012cd4980d744900d59cf43632be95..051bc2c8cc3400f0acd67b1d4bb70a8981d6de42 100644 (file)
@@ -63,6 +63,7 @@ enum i40e_vf_states {
        I40E_VF_STATE_DISABLED,
        I40E_VF_STATE_MC_PROMISC,
        I40E_VF_STATE_UC_PROMISC,
+       I40E_VF_STATE_PRE_ENABLE,
 };
 
 /* VF capabilities */