Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0da36b97 authored by Jacob Keller's avatar Jacob Keller Committed by Jeff Kirsher
Browse files

i40e: use DECLARE_BITMAP for state fields



Instead of assuming our flags fit within an unsigned long, use
DECLARE_BITMAP which will ensure that we always allocate enough space.
Additionally, use __I40E_STATE_SIZE__ markers as the last element of the
enumeration so that the size of the BITMAP is compile-time assigned
rather than programmer-time assigned. This ensures that potential future
flag additions do not actually overrun the array. This is especially
important as 32bit systems would only have 32bit longs instead of 64bit
longs as we generally have assumed in the prior code.

This change also removes a dereference of the state fields throughout
the code, so it does have a bit of code churn. The conversions were
automated using sed replacements with an alternation

  s/&(vsi->back|vsi|pf)->state/\1->state/
  s/&adapter->vsi.state/adapter->vsi.state/

For debugfs, we modify the printing so that we can display chunks of the
state value on new lines. This ensures that we can print the entire set
of state values. Additionally, we now print them as 08lx to ensure that
they display nicely.

Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent d19cb64b
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -145,6 +145,8 @@ enum i40e_state_t {
	__I40E_RESET_FAILED,
	__I40E_RESET_FAILED,
	__I40E_PORT_SUSPENDED,
	__I40E_PORT_SUSPENDED,
	__I40E_VF_DISABLE,
	__I40E_VF_DISABLE,
	/* This must be last as it determines the size of the BITMAP */
	__I40E_STATE_SIZE__,
};
};


/* VSI state flags */
/* VSI state flags */
@@ -155,6 +157,8 @@ enum i40e_vsi_state_t {
	__I40E_VSI_OVERFLOW_PROMISC,
	__I40E_VSI_OVERFLOW_PROMISC,
	__I40E_VSI_REINIT_REQUESTED,
	__I40E_VSI_REINIT_REQUESTED,
	__I40E_VSI_DOWN_REQUESTED,
	__I40E_VSI_DOWN_REQUESTED,
	/* This must be last as it determines the size of the BITMAP */
	__I40E_VSI_STATE_SIZE__,
};
};


enum i40e_interrupt_policy {
enum i40e_interrupt_policy {
@@ -330,7 +334,7 @@ struct i40e_flex_pit {
struct i40e_pf {
struct i40e_pf {
	struct pci_dev *pdev;
	struct pci_dev *pdev;
	struct i40e_hw hw;
	struct i40e_hw hw;
	unsigned long state;
	DECLARE_BITMAP(state, __I40E_STATE_SIZE__);
	struct msix_entry *msix_entries;
	struct msix_entry *msix_entries;
	bool fc_autoneg_status;
	bool fc_autoneg_status;


@@ -601,7 +605,7 @@ struct i40e_vsi {
	bool stat_offsets_loaded;
	bool stat_offsets_loaded;


	u32 current_netdev_flags;
	u32 current_netdev_flags;
	unsigned long state;
	DECLARE_BITMAP(state, __I40E_VSI_STATE_SIZE__);
#define I40E_VSI_FLAG_FILTER_CHANGED	BIT(0)
#define I40E_VSI_FLAG_FILTER_CHANGED	BIT(0)
#define I40E_VSI_FLAG_VEB_OWNER		BIT(1)
#define I40E_VSI_FLAG_VEB_OWNER		BIT(1)
	unsigned long flags;
	unsigned long flags;
+8 −8
Original line number Original line Diff line number Diff line
@@ -371,8 +371,8 @@ void i40e_client_subtask(struct i40e_pf *pf)
	cdev = pf->cinst;
	cdev = pf->cinst;


	/* If we're down or resetting, just bail */
	/* If we're down or resetting, just bail */
	if (test_bit(__I40E_DOWN, &pf->state) ||
	if (test_bit(__I40E_DOWN, pf->state) ||
	    test_bit(__I40E_CONFIG_BUSY, &pf->state))
	    test_bit(__I40E_CONFIG_BUSY, pf->state))
		return;
		return;


	if (!client || !cdev)
	if (!client || !cdev)
@@ -382,7 +382,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
	 * the netdev is up, then open the client.
	 * the netdev is up, then open the client.
	 */
	 */
	if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
	if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
		if (!test_bit(__I40E_VSI_DOWN, &vsi->state) &&
		if (!test_bit(__I40E_VSI_DOWN, vsi->state) &&
		    client->ops && client->ops->open) {
		    client->ops && client->ops->open) {
			set_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state);
			set_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state);
			ret = client->ops->open(&cdev->lan_info, client);
			ret = client->ops->open(&cdev->lan_info, client);
@@ -397,7 +397,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
	/* Likewise for client close. If the client is up, but the netdev
	/* Likewise for client close. If the client is up, but the netdev
	 * is down, then close the client.
	 * is down, then close the client.
	 */
	 */
		if (test_bit(__I40E_VSI_DOWN, &vsi->state) &&
		if (test_bit(__I40E_VSI_DOWN, vsi->state) &&
		    client->ops && client->ops->close) {
		    client->ops && client->ops->close) {
			clear_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state);
			clear_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state);
			client->ops->close(&cdev->lan_info, client, false);
			client->ops->close(&cdev->lan_info, client, false);
@@ -503,7 +503,7 @@ static void i40e_client_release(struct i40e_client *client)
			continue;
			continue;


		while (test_and_set_bit(__I40E_SERVICE_SCHED,
		while (test_and_set_bit(__I40E_SERVICE_SCHED,
					&pf->state))
					pf->state))
			usleep_range(500, 1000);
			usleep_range(500, 1000);


		if (test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
		if (test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
@@ -521,7 +521,7 @@ static void i40e_client_release(struct i40e_client *client)
		i40e_client_del_instance(pf);
		i40e_client_del_instance(pf);
		dev_info(&pf->pdev->dev, "Deleted client instance of Client %s\n",
		dev_info(&pf->pdev->dev, "Deleted client instance of Client %s\n",
			 client->name);
			 client->name);
		clear_bit(__I40E_SERVICE_SCHED, &pf->state);
		clear_bit(__I40E_SERVICE_SCHED, pf->state);
	}
	}
	mutex_unlock(&i40e_device_mutex);
	mutex_unlock(&i40e_device_mutex);
}
}
@@ -661,10 +661,10 @@ static void i40e_client_request_reset(struct i40e_info *ldev,


	switch (reset_level) {
	switch (reset_level) {
	case I40E_CLIENT_RESET_LEVEL_PF:
	case I40E_CLIENT_RESET_LEVEL_PF:
		set_bit(__I40E_PF_RESET_REQUESTED, &pf->state);
		set_bit(__I40E_PF_RESET_REQUESTED, pf->state);
		break;
		break;
	case I40E_CLIENT_RESET_LEVEL_CORE:
	case I40E_CLIENT_RESET_LEVEL_CORE:
		set_bit(__I40E_PF_RESET_REQUESTED, &pf->state);
		set_bit(__I40E_PF_RESET_REQUESTED, pf->state);
		break;
		break;
	default:
	default:
		dev_warn(&pf->pdev->dev,
		dev_warn(&pf->pdev->dev,
+8 −5
Original line number Original line Diff line number Diff line
@@ -158,9 +158,12 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
	dev_info(&pf->pdev->dev,
	dev_info(&pf->pdev->dev,
		 "    vlgrp: & = %p\n", vsi->active_vlans);
		 "    vlgrp: & = %p\n", vsi->active_vlans);
	dev_info(&pf->pdev->dev,
	dev_info(&pf->pdev->dev,
		 "    state = %li flags = 0x%08lx, netdev_registered = %i, current_netdev_flags = 0x%04x\n",
		 "    flags = 0x%08lx, netdev_registered = %i, current_netdev_flags = 0x%04x\n",
		 vsi->state, vsi->flags,
		 vsi->flags, vsi->netdev_registered, vsi->current_netdev_flags);
		 vsi->netdev_registered, vsi->current_netdev_flags);
	for (i = 0; i < BITS_TO_LONGS(__I40E_VSI_STATE_SIZE__); i++)
		dev_info(&pf->pdev->dev,
			 "    state[%d] = %08lx\n",
			 i, vsi->state[i]);
	if (vsi == pf->vsi[pf->lan_vsi])
	if (vsi == pf->vsi[pf->lan_vsi])
		dev_info(&pf->pdev->dev, "    MAC address: %pM SAN MAC: %pM Port MAC: %pM\n",
		dev_info(&pf->pdev->dev, "    MAC address: %pM SAN MAC: %pM Port MAC: %pM\n",
			 pf->hw.mac.addr,
			 pf->hw.mac.addr,
@@ -174,7 +177,7 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
	}
	}
	dev_info(&pf->pdev->dev, "    active_filters %u, promisc_threshold %u, overflow promisc %s\n",
	dev_info(&pf->pdev->dev, "    active_filters %u, promisc_threshold %u, overflow promisc %s\n",
		 vsi->active_filters, vsi->promisc_threshold,
		 vsi->active_filters, vsi->promisc_threshold,
		 (test_bit(__I40E_VSI_OVERFLOW_PROMISC, &vsi->state) ?
		 (test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state) ?
		  "ON" : "OFF"));
		  "ON" : "OFF"));
	nstat = i40e_get_vsi_stats_struct(vsi);
	nstat = i40e_get_vsi_stats_struct(vsi);
	dev_info(&pf->pdev->dev,
	dev_info(&pf->pdev->dev,
@@ -1706,7 +1709,7 @@ static ssize_t i40e_dbg_netdev_ops_write(struct file *filp,
		} else if (!vsi->netdev) {
		} else if (!vsi->netdev) {
			dev_info(&pf->pdev->dev, "tx_timeout: no netdev for VSI %d\n",
			dev_info(&pf->pdev->dev, "tx_timeout: no netdev for VSI %d\n",
				 vsi_seid);
				 vsi_seid);
		} else if (test_bit(__I40E_VSI_DOWN, &vsi->state)) {
		} else if (test_bit(__I40E_VSI_DOWN, vsi->state)) {
			dev_info(&pf->pdev->dev, "tx_timeout: VSI %d not UP\n",
			dev_info(&pf->pdev->dev, "tx_timeout: VSI %d not UP\n",
				 vsi_seid);
				 vsi_seid);
		} else if (rtnl_trylock()) {
		} else if (rtnl_trylock()) {
+21 −21
Original line number Original line Diff line number Diff line
@@ -757,7 +757,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
	if (memcmp(&copy_cmd, &safe_cmd, sizeof(struct ethtool_link_ksettings)))
	if (memcmp(&copy_cmd, &safe_cmd, sizeof(struct ethtool_link_ksettings)))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	while (test_and_set_bit(__I40E_CONFIG_BUSY, &pf->state)) {
	while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
		timeout--;
		timeout--;
		if (!timeout)
		if (!timeout)
			return -EBUSY;
			return -EBUSY;
@@ -891,7 +891,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
	}
	}


done:
done:
	clear_bit(__I40E_CONFIG_BUSY, &pf->state);
	clear_bit(__I40E_CONFIG_BUSY, pf->state);


	return err;
	return err;
}
}
@@ -987,7 +987,7 @@ static int i40e_set_pauseparam(struct net_device *netdev,
	}
	}


	/* If we have link and don't have autoneg */
	/* If we have link and don't have autoneg */
	if (!test_bit(__I40E_DOWN, &pf->state) &&
	if (!test_bit(__I40E_DOWN, pf->state) &&
	    !(hw_link_info->an_info & I40E_AQ_AN_COMPLETED)) {
	    !(hw_link_info->an_info & I40E_AQ_AN_COMPLETED)) {
		/* Send message that it might not necessarily work*/
		/* Send message that it might not necessarily work*/
		netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n");
		netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n");
@@ -1039,10 +1039,10 @@ static int i40e_set_pauseparam(struct net_device *netdev,
		err = -EAGAIN;
		err = -EAGAIN;
	}
	}


	if (!test_bit(__I40E_DOWN, &pf->state)) {
	if (!test_bit(__I40E_DOWN, pf->state)) {
		/* Give it a little more time to try to come back */
		/* Give it a little more time to try to come back */
		msleep(75);
		msleep(75);
		if (!test_bit(__I40E_DOWN, &pf->state))
		if (!test_bit(__I40E_DOWN, pf->state))
			return i40e_nway_reset(netdev);
			return i40e_nway_reset(netdev);
	}
	}


@@ -1139,8 +1139,8 @@ static int i40e_get_eeprom(struct net_device *netdev,
		/* make sure it is the right magic for NVMUpdate */
		/* make sure it is the right magic for NVMUpdate */
		if ((eeprom->magic >> 16) != hw->device_id)
		if ((eeprom->magic >> 16) != hw->device_id)
			errno = -EINVAL;
			errno = -EINVAL;
		else if (test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state) ||
		else if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
			 test_bit(__I40E_RESET_INTR_RECEIVED, &pf->state))
			 test_bit(__I40E_RESET_INTR_RECEIVED, pf->state))
			errno = -EBUSY;
			errno = -EBUSY;
		else
		else
			ret_val = i40e_nvmupd_command(hw, cmd, bytes, &errno);
			ret_val = i40e_nvmupd_command(hw, cmd, bytes, &errno);
@@ -1246,8 +1246,8 @@ static int i40e_set_eeprom(struct net_device *netdev,
	/* check for NVMUpdate access method */
	/* check for NVMUpdate access method */
	else if (!eeprom->magic || (eeprom->magic >> 16) != hw->device_id)
	else if (!eeprom->magic || (eeprom->magic >> 16) != hw->device_id)
		errno = -EINVAL;
		errno = -EINVAL;
	else if (test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state) ||
	else if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
		 test_bit(__I40E_RESET_INTR_RECEIVED, &pf->state))
		 test_bit(__I40E_RESET_INTR_RECEIVED, pf->state))
		errno = -EBUSY;
		errno = -EBUSY;
	else
	else
		ret_val = i40e_nvmupd_command(hw, cmd, bytes, &errno);
		ret_val = i40e_nvmupd_command(hw, cmd, bytes, &errno);
@@ -1332,7 +1332,7 @@ static int i40e_set_ringparam(struct net_device *netdev,
	    (new_rx_count == vsi->rx_rings[0]->count))
	    (new_rx_count == vsi->rx_rings[0]->count))
		return 0;
		return 0;


	while (test_and_set_bit(__I40E_CONFIG_BUSY, &pf->state)) {
	while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
		timeout--;
		timeout--;
		if (!timeout)
		if (!timeout)
			return -EBUSY;
			return -EBUSY;
@@ -1485,7 +1485,7 @@ static int i40e_set_ringparam(struct net_device *netdev,
	}
	}


done:
done:
	clear_bit(__I40E_CONFIG_BUSY, &pf->state);
	clear_bit(__I40E_CONFIG_BUSY, pf->state);


	return err;
	return err;
}
}
@@ -1847,7 +1847,7 @@ static void i40e_diag_test(struct net_device *netdev,
		/* Offline tests */
		/* Offline tests */
		netif_info(pf, drv, netdev, "offline testing starting\n");
		netif_info(pf, drv, netdev, "offline testing starting\n");


		set_bit(__I40E_TESTING, &pf->state);
		set_bit(__I40E_TESTING, pf->state);


		if (i40e_active_vfs(pf) || i40e_active_vmdqs(pf)) {
		if (i40e_active_vfs(pf) || i40e_active_vmdqs(pf)) {
			dev_warn(&pf->pdev->dev,
			dev_warn(&pf->pdev->dev,
@@ -1857,7 +1857,7 @@ static void i40e_diag_test(struct net_device *netdev,
			data[I40E_ETH_TEST_INTR]	= 1;
			data[I40E_ETH_TEST_INTR]	= 1;
			data[I40E_ETH_TEST_LINK]	= 1;
			data[I40E_ETH_TEST_LINK]	= 1;
			eth_test->flags |= ETH_TEST_FL_FAILED;
			eth_test->flags |= ETH_TEST_FL_FAILED;
			clear_bit(__I40E_TESTING, &pf->state);
			clear_bit(__I40E_TESTING, pf->state);
			goto skip_ol_tests;
			goto skip_ol_tests;
		}
		}


@@ -1886,7 +1886,7 @@ static void i40e_diag_test(struct net_device *netdev,
		if (i40e_reg_test(netdev, &data[I40E_ETH_TEST_REG]))
		if (i40e_reg_test(netdev, &data[I40E_ETH_TEST_REG]))
			eth_test->flags |= ETH_TEST_FL_FAILED;
			eth_test->flags |= ETH_TEST_FL_FAILED;


		clear_bit(__I40E_TESTING, &pf->state);
		clear_bit(__I40E_TESTING, pf->state);
		i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED), true);
		i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED), true);


		if (if_running)
		if (if_running)
@@ -2924,11 +2924,11 @@ static int i40e_del_fdir_entry(struct i40e_vsi *vsi,
	struct i40e_pf *pf = vsi->back;
	struct i40e_pf *pf = vsi->back;
	int ret = 0;
	int ret = 0;


	if (test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state) ||
	if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
	    test_bit(__I40E_RESET_INTR_RECEIVED, &pf->state))
	    test_bit(__I40E_RESET_INTR_RECEIVED, pf->state))
		return -EBUSY;
		return -EBUSY;


	if (test_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state))
	if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state))
		return -EBUSY;
		return -EBUSY;


	ret = i40e_update_ethtool_fdir_entry(vsi, NULL, fsp->location, cmd);
	ret = i40e_update_ethtool_fdir_entry(vsi, NULL, fsp->location, cmd);
@@ -3646,11 +3646,11 @@ static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
	if (pf->hw_disabled_flags & I40E_FLAG_FD_SB_ENABLED)
	if (pf->hw_disabled_flags & I40E_FLAG_FD_SB_ENABLED)
		return -ENOSPC;
		return -ENOSPC;


	if (test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state) ||
	if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
	    test_bit(__I40E_RESET_INTR_RECEIVED, &pf->state))
	    test_bit(__I40E_RESET_INTR_RECEIVED, pf->state))
		return -EBUSY;
		return -EBUSY;


	if (test_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state))
	if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state))
		return -EBUSY;
		return -EBUSY;


	fsp = (struct ethtool_rx_flow_spec *)&cmd->fs;
	fsp = (struct ethtool_rx_flow_spec *)&cmd->fs;
@@ -4087,7 +4087,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
	if ((changed_flags & I40E_FLAG_FD_ATR_ENABLED) &&
	if ((changed_flags & I40E_FLAG_FD_ATR_ENABLED) &&
	    !(pf->flags & I40E_FLAG_FD_ATR_ENABLED)) {
	    !(pf->flags & I40E_FLAG_FD_ATR_ENABLED)) {
		pf->hw_disabled_flags |= I40E_FLAG_FD_ATR_ENABLED;
		pf->hw_disabled_flags |= I40E_FLAG_FD_ATR_ENABLED;
		set_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state);
		set_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);
	}
	}


	/* Only allow ATR evict on hardware that is capable of handling it */
	/* Only allow ATR evict on hardware that is capable of handling it */
+116 −117

File changed.

Preview size limit exceeded, changes collapsed.

Loading