i40e: move client flags into state bits
authorJacob Keller <jacob.e.keller@intel.com>
Fri, 16 Mar 2018 08:26:34 +0000 (01:26 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 26 Mar 2018 20:50:56 +0000 (13:50 -0700)
The iWarp client flags are all potentially changed when the RTNL lock is
not held, so they should not be part of the pf->flags variable. Instead,
move them into the state field so that we can use atomic bit operations.

This is part of a larger effort to remove cmpxchg64 in
i40e_set_priv_flags()

Signed-off-by: Jacob Keller <jacob.e.keller@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.h
drivers/net/ethernet/intel/i40e/i40e_client.c
drivers/net/ethernet/intel/i40e/i40e_main.c

index 1ffe802d489f0d700b72bdf09cde577157c06893..67518013ca4da1c3ea0324d0f12c8d38b3d4476a 100644 (file)
@@ -167,6 +167,9 @@ enum i40e_state_t {
        __I40E_MACVLAN_SYNC_PENDING,
        __I40E_UDP_FILTER_SYNC_PENDING,
        __I40E_TEMP_LINK_POLLING,
+       __I40E_CLIENT_SERVICE_REQUESTED,
+       __I40E_CLIENT_L2_CHANGE,
+       __I40E_CLIENT_RESET,
        /* This must be last as it determines the size of the BITMAP */
        __I40E_STATE_SIZE__,
 };
@@ -539,9 +542,7 @@ struct i40e_pf {
 #define I40E_FLAG_LEGACY_RX                    BIT_ULL(21)
 #define I40E_FLAG_PTP                          BIT_ULL(22)
 #define I40E_FLAG_IWARP_ENABLED                        BIT_ULL(23)
-#define I40E_FLAG_SERVICE_CLIENT_REQUESTED     BIT_ULL(24)
-#define I40E_FLAG_CLIENT_L2_CHANGE             BIT_ULL(25)
-#define I40E_FLAG_CLIENT_RESET                 BIT_ULL(26)
+/* Gap for BIT_ULL(24) through BIT_ULL(26) */
 #define I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED   BIT_ULL(27)
 #define I40E_FLAG_SOURCE_PRUNING_DISABLED      BIT_ULL(28)
 #define I40E_FLAG_TC_MQPRIO                    BIT_ULL(29)
index 999dea5a7c9e1a8dbbbb9afdfc823f7ad27037e0..d8ce4999864f3c0137ad30b6098a5e63fb1ef498 100644 (file)
@@ -376,9 +376,8 @@ void i40e_client_subtask(struct i40e_pf *pf)
        struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
        int ret = 0;
 
-       if (!(pf->flags & I40E_FLAG_SERVICE_CLIENT_REQUESTED))
+       if (!test_and_clear_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state))
                return;
-       pf->flags &= ~I40E_FLAG_SERVICE_CLIENT_REQUESTED;
        cdev = pf->cinst;
 
        /* If we're down or resetting, just bail */
@@ -459,7 +458,7 @@ int i40e_lan_add_device(struct i40e_pf *pf)
         * added, we can schedule a subtask to go initiate the clients if
         * they can be launched at probe time.
         */
-       pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED;
+       set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
        i40e_service_event_schedule(pf);
 
 out:
@@ -554,7 +553,7 @@ static void i40e_client_prepare(struct i40e_client *client)
                pf = ldev->pf;
                i40e_client_add_instance(pf);
                /* Start the client subtask */
-               pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED;
+               set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
                i40e_service_event_schedule(pf);
        }
        mutex_unlock(&i40e_device_mutex);
index 307f5bf657084a266eb2122bbba9773863754952..68b51761c50968b9a71ca0b10dbfb3a64d411ebe 100644 (file)
@@ -2634,8 +2634,8 @@ static int i40e_change_mtu(struct net_device *netdev, int new_mtu)
        netdev->mtu = new_mtu;
        if (netif_running(netdev))
                i40e_vsi_reinit_locked(vsi);
-       pf->flags |= (I40E_FLAG_SERVICE_CLIENT_REQUESTED |
-                     I40E_FLAG_CLIENT_L2_CHANGE);
+       set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
+       set_bit(__I40E_CLIENT_L2_CHANGE, pf->state);
        return 0;
 }
 
@@ -4722,9 +4722,9 @@ static void i40e_vsi_close(struct i40e_vsi *vsi)
        i40e_vsi_free_tx_resources(vsi);
        i40e_vsi_free_rx_resources(vsi);
        vsi->current_netdev_flags = 0;
-       pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED;
+       set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
        if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state))
-               pf->flags |=  I40E_FLAG_CLIENT_RESET;
+               set_bit(__I40E_CLIENT_RESET, pf->state);
 }
 
 /**
@@ -6495,7 +6495,7 @@ static int i40e_up_complete(struct i40e_vsi *vsi)
        /* On the next run of the service_task, notify any clients of the new
         * opened netdev
         */
-       pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED;
+       set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
        i40e_service_event_schedule(pf);
 
        return 0;
@@ -8037,8 +8037,8 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
                i40e_service_event_schedule(pf);
        } else {
                i40e_pf_unquiesce_all_vsi(pf);
-       pf->flags |= (I40E_FLAG_SERVICE_CLIENT_REQUESTED |
-                     I40E_FLAG_CLIENT_L2_CHANGE);
+       set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state);
+       set_bit(__I40E_CLIENT_L2_CHANGE, pf->state);
        }
 
 exit:
@@ -9785,17 +9785,15 @@ static void i40e_service_task(struct work_struct *work)
        i40e_vc_process_vflr_event(pf);
        i40e_watchdog_subtask(pf);
        i40e_fdir_reinit_subtask(pf);
-       if (pf->flags & I40E_FLAG_CLIENT_RESET) {
+       if (test_and_clear_bit(__I40E_CLIENT_RESET, pf->state)) {
                /* Client subtask will reopen next time through. */
                i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], true);
-               pf->flags &= ~I40E_FLAG_CLIENT_RESET;
        } else {
                i40e_client_subtask(pf);
-               if (pf->flags & I40E_FLAG_CLIENT_L2_CHANGE) {
+               if (test_and_clear_bit(__I40E_CLIENT_L2_CHANGE,
+                                      pf->state))
                        i40e_notify_client_of_l2_param_changes(
                                                        pf->vsi[pf->lan_vsi]);
-                       pf->flags &= ~I40E_FLAG_CLIENT_L2_CHANGE;
-               }
        }
        i40e_sync_filters_subtask(pf);
        i40e_sync_udp_filters_subtask(pf);