i40e: refactor promisc_changed in i40e_sync_vsi_filters
authorAlan Brady <alan.brady@intel.com>
Mon, 22 Jan 2018 17:00:35 +0000 (12:00 -0500)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 13 Feb 2018 19:40:10 +0000 (11:40 -0800)
This code here is quite complex and easy to screw up.  Let's see if we
can't improve the readability and maintainability a bit.  This refactors
out promisc_changed into two variables 'old_overflow' and 'new_overflow'
which makes it a bit clearer when we're concerned about when and how
overflow promiscuous is changed.  This also makes so that we no longer
need to pass a boolean pointer to i40e_aqc_add_filters.  Instead we can
simply check if we changed the overflow promiscuous flag since the
function start.

Signed-off-by: Alan Brady <alan.brady@intel.com>
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 d96ecfc37bbc3d8612dbbac9f31a74eb44b8e389..1073972be948575004df3528ced8b236592e508f 100644 (file)
@@ -2116,17 +2116,16 @@ void i40e_aqc_del_filters(struct i40e_vsi *vsi, const char *vsi_name,
  * @list: the list of filters to send to firmware
  * @add_head: Position in the add hlist
  * @num_add: the number of filters to add
- * @promisc_change: set to true on exit if promiscuous mode was forced on
  *
  * Send a request to firmware via AdminQ to add a chunk of filters. Will set
- * promisc_changed to true if the firmware has run out of space for more
- * filters.
+ * __I40E_VSI_OVERFLOW_PROMISC bit in vsi->state if the firmware has run out of
+ * space for more filters.
  */
 static
 void i40e_aqc_add_filters(struct i40e_vsi *vsi, const char *vsi_name,
                          struct i40e_aqc_add_macvlan_element_data *list,
                          struct i40e_new_mac_filter *add_head,
-                         int num_add, bool *promisc_changed)
+                         int num_add)
 {
        struct i40e_hw *hw = &vsi->back->hw;
        int aq_err, fcnt;
@@ -2136,7 +2135,6 @@ void i40e_aqc_add_filters(struct i40e_vsi *vsi, const char *vsi_name,
        fcnt = i40e_update_filter_state(num_add, list, add_head);
 
        if (fcnt != num_add) {
-               *promisc_changed = true;
                set_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state);
                dev_warn(&vsi->back->pdev->dev,
                         "Error %s adding RX filters on %s, promiscuous mode forced on\n",
@@ -2269,9 +2267,9 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
        struct i40e_mac_filter *f;
        struct i40e_new_mac_filter *new, *add_head = NULL;
        struct i40e_hw *hw = &vsi->back->hw;
+       bool old_overflow, new_overflow;
        unsigned int failed_filters = 0;
        unsigned int vlan_filters = 0;
-       bool promisc_changed = false;
        char vsi_name[16] = "PF";
        int filter_list_len = 0;
        i40e_status aq_ret = 0;
@@ -2293,6 +2291,8 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
                usleep_range(1000, 2000);
        pf = vsi->back;
 
+       old_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state);
+
        if (vsi->netdev) {
                changed_flags = vsi->current_netdev_flags ^ vsi->netdev->flags;
                vsi->current_netdev_flags = vsi->netdev->flags;
@@ -2466,15 +2466,14 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
                        /* flush a full buffer */
                        if (num_add == filter_list_len) {
                                i40e_aqc_add_filters(vsi, vsi_name, add_list,
-                                                    add_head, num_add,
-                                                    &promisc_changed);
+                                                    add_head, num_add);
                                memset(add_list, 0, list_size);
                                num_add = 0;
                        }
                }
                if (num_add) {
                        i40e_aqc_add_filters(vsi, vsi_name, add_list, add_head,
-                                            num_add, &promisc_changed);
+                                            num_add);
                }
                /* Now move all of the filters from the temp add list back to
                 * the VSI's list.
@@ -2503,24 +2502,16 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
        }
        spin_unlock_bh(&vsi->mac_filter_hash_lock);
 
-       /* If promiscuous mode has changed, we need to calculate a new
-        * threshold for when we are safe to exit
-        */
-       if (promisc_changed)
-               vsi->promisc_threshold = (vsi->active_filters * 3) / 4;
-
        /* Check if we are able to exit overflow promiscuous mode. We can
         * safely exit if we didn't just enter, we no longer have any failed
         * filters, and we have reduced filters below the threshold value.
         */
-       if (test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state) &&
-           !promisc_changed && !failed_filters &&
-           (vsi->active_filters < vsi->promisc_threshold)) {
+       if (old_overflow && !failed_filters &&
+           vsi->active_filters < vsi->promisc_threshold) {
                dev_info(&pf->pdev->dev,
                         "filter logjam cleared on %s, leaving overflow promiscuous mode\n",
                         vsi_name);
                clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state);
-               promisc_changed = true;
                vsi->promisc_threshold = 0;
        }
 
@@ -2530,6 +2521,14 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
                goto out;
        }
 
+       new_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state);
+
+       /* If we are entering overflow promiscuous, we need to calculate a new
+        * threshold for when we are safe to exit
+        */
+       if (!old_overflow && new_overflow)
+               vsi->promisc_threshold = (vsi->active_filters * 3) / 4;
+
        /* check for changes in promiscuous modes */
        if (changed_flags & IFF_ALLMULTI) {
                bool cur_multipromisc;
@@ -2550,12 +2549,11 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
                }
        }
 
-       if ((changed_flags & IFF_PROMISC) || promisc_changed) {
+       if ((changed_flags & IFF_PROMISC) || old_overflow != new_overflow) {
                bool cur_promisc;
 
                cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) ||
-                              test_bit(__I40E_VSI_OVERFLOW_PROMISC,
-                                       vsi->state));
+                              new_overflow);
                aq_ret = i40e_set_promiscuous(pf, cur_promisc);
                if (aq_ret) {
                        retval = i40e_aq_rc_to_posix(aq_ret,