i40e: check if vectors are already depleted when doing VMDq allocation
authorStefan Assmann <sassmann@kpanic.de>
Mon, 19 Sep 2016 11:37:49 +0000 (13:37 +0200)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 4 Oct 2016 02:07:43 +0000 (19:07 -0700)
During MSI-X vector allocation for VMDq, a check for "no vectors left"
was missing, add it. This prevents more vectors to be allocated than
available.

Signed-off-by: Stefan Assmann <sassmann@kpanic.de>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c

index 8176596932be4420b45c2211d7a1cda70e4669db..66d2ca0194f6fd23befbc04d076197bbb0e833c3 100644 (file)
@@ -7674,18 +7674,23 @@ static int i40e_init_msix(struct i40e_pf *pf)
                int vmdq_vecs_wanted = pf->num_vmdq_vsis * pf->num_vmdq_qps;
                int vmdq_vecs = min_t(int, vectors_left, vmdq_vecs_wanted);
 
-               /* if we're short on vectors for what's desired, we limit
-                * the queues per vmdq.  If this is still more than are
-                * available, the user will need to change the number of
-                * queues/vectors used by the PF later with the ethtool
-                * channels command
-                */
-               if (vmdq_vecs < vmdq_vecs_wanted)
-                       pf->num_vmdq_qps = 1;
-               pf->num_vmdq_msix = pf->num_vmdq_qps;
+               if (!vectors_left) {
+                       pf->num_vmdq_msix = 0;
+                       pf->num_vmdq_qps = 0;
+               } else {
+                       /* if we're short on vectors for what's desired, we limit
+                        * the queues per vmdq.  If this is still more than are
+                        * available, the user will need to change the number of
+                        * queues/vectors used by the PF later with the ethtool
+                        * channels command
+                        */
+                       if (vmdq_vecs < vmdq_vecs_wanted)
+                               pf->num_vmdq_qps = 1;
+                       pf->num_vmdq_msix = pf->num_vmdq_qps;
 
-               v_budget += vmdq_vecs;
-               vectors_left -= vmdq_vecs;
+                       v_budget += vmdq_vecs;
+                       vectors_left -= vmdq_vecs;
+               }
        }
 
        pf->msix_entries = kcalloc(v_budget, sizeof(struct msix_entry),