[dpdk-dev] [PATCH v2] net/ixgbevf: add an option pflink_fullchk to get link status nowait

Zhang, Qi Z qi.z.zhang at intel.com
Mon Jun 10 13:17:28 CEST 2019



> -----Original Message-----
> From: Wang, Haiyue
> Sent: Friday, June 7, 2019 11:56 PM
> To: dev at dpdk.org; Zhang, Qi Z <qi.z.zhang at intel.com>; Lu, Wenzhuo
> <wenzhuo.lu at intel.com>; Wang, Liang-min <liang-min.wang at intel.com>;
> daniels at research.att.com; ktraynor at redhat.com
> Cc: Wang, Haiyue <haiyue.wang at intel.com>; stable at dpdk.org
> Subject: [PATCH v2] net/ixgbevf: add an option pflink_fullchk to get link status
> nowait
> 
> To get the VF's link status by calling 'rte_eth_link_get_nowait()', the VF not
> only check PF's physical link status, but also check the mailbox running status.
> And mailbox checking will generate mailbox interrupt in PF, it will be worse if
> many VFs are running in the system, the PF will have to handle many
> interrrupts.
> 
> Normally, checking the PF's physical link status is enough for nowait.
> For different scenarios, adding an 'pflink_fullchk' option to control whether to
> check the link fully or not.

Seems the patch change the default behavior which is always "fully check", 
I assume a no fully check does not guarantee the link status is synced correctly, right?
should we implement this devargs in an inverse way to avoid the inconsistent with previous version? 
>From my view correctness should take high priority than performance.


> 
> Fixes: 91546fb62e67 ("net/ixgbevf: fix link state")
> Cc: stable at dpdk.org
> 
> Signed-off-by: Haiyue Wang <haiyue.wang at intel.com>
> ---
>  doc/guides/nics/ixgbe.rst        | 25 ++++++++++++++++
>  drivers/net/ixgbe/ixgbe_ethdev.c | 63
> ++++++++++++++++++++++++++++++++++++++++
>  drivers/net/ixgbe/ixgbe_ethdev.h |  5 ++++
>  3 files changed, 93 insertions(+)
> 
> diff --git a/doc/guides/nics/ixgbe.rst b/doc/guides/nics/ixgbe.rst index
> 975143f..5c3a7e4 100644
> --- a/doc/guides/nics/ixgbe.rst
> +++ b/doc/guides/nics/ixgbe.rst
> @@ -82,6 +82,31 @@ To guarantee the constraint, capabilities in
> dev_conf.rxmode.offloads will be ch
> 
>  fdir_conf->mode will also be checked.
> 
> +VF Runtime Options
> +^^^^^^^^^^^^^^^^^^
> +
> +The following ``devargs`` options can be enabled at runtime. They must
> +be passed as part of EAL arguments. For example,
> +
> +.. code-block:: console
> +
> +   testpmd -w af:10.0,pflink_fullchk=1 -- -i
> +
> +- ``pflink_fullchk`` (default **0**)
> +
> +  When calling ``rte_eth_link_get_nowait()`` to get VF link status,
> + this option is used to control how VF synchronizes its status with
> + PF's. If set, VF will not only check the PF's physical link status  by
> + reading related register, but also check the mailbox status. We  call
> + this behavior as fully checking. And checking mailbox will  trigger
> + PF's mailbox interrupt generation. If unset, the application  can get
> + the VF's link status quickly by just reading the PF's link  status
> + register, this will avoid the whole system's mailbox interrupt
> + generation.
> +
> +  ``rte_eth_link_get()`` will still use the mailbox method regardless
> + of the pflink_fullchk setting.
> +
>  RX Burst Size
>  ^^^^^^^^^^^^^
> 
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 3636b50..ade119d 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -23,6 +23,7 @@
>  #include <rte_bus_pci.h>
>  #include <rte_branch_prediction.h>
>  #include <rte_memory.h>
> +#include <rte_kvargs.h>
>  #include <rte_eal.h>
>  #include <rte_alarm.h>
>  #include <rte_ether.h>
> @@ -127,6 +128,13 @@
>  #define IXGBE_EXVET_VET_EXT_SHIFT              16
>  #define IXGBE_DMATXCTL_VT_MASK                 0xFFFF0000
> 
> +#define IXGBEVF_DEVARG_PFLINK_FULLCHK		"pflink_fullchk"
> +
> +static const char * const ixgbevf_valid_arguments[] = {
> +	IXGBEVF_DEVARG_PFLINK_FULLCHK,
> +	NULL
> +};
> +
>  static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params);
> static int eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev);  static int
> ixgbe_fdir_filter_init(struct rte_eth_dev *eth_dev); @@ -1550,6 +1558,45
> @@ generate_random_mac_addr(struct rte_ether_addr *mac_addr)
>  	memcpy(&mac_addr->addr_bytes[3], &random, 3);  }
> 
> +static int
> +devarg_handle_int(__rte_unused const char *key, const char *value,
> +		  void *extra_args)
> +{
> +	uint16_t *n = extra_args;
> +
> +	if (value == NULL || extra_args == NULL)
> +		return -EINVAL;
> +
> +	*n = (uint16_t)strtoul(value, NULL, 0);
> +	if (*n == USHRT_MAX && errno == ERANGE)
> +		return -1;
> +
> +	return 0;
> +}
> +
> +static void
> +ixgbevf_parse_devargs(struct ixgbe_adapter *adapter,
> +		      struct rte_devargs *devargs)
> +{
> +	struct rte_kvargs *kvlist;
> +	uint16_t pflink_fullchk;
> +
> +	if (devargs == NULL)
> +		return;
> +
> +	kvlist = rte_kvargs_parse(devargs->args, ixgbevf_valid_arguments);
> +	if (kvlist == NULL)
> +		return;
> +
> +	if (rte_kvargs_count(kvlist, IXGBEVF_DEVARG_PFLINK_FULLCHK) == 1 &&
> +	    rte_kvargs_process(kvlist, IXGBEVF_DEVARG_PFLINK_FULLCHK,
> +			       devarg_handle_int, &pflink_fullchk) == 0 &&
> +	    pflink_fullchk == 1)
> +		adapter->pflink_fullchk = 1;
> +
> +	rte_kvargs_free(kvlist);
> +}
> +
>  /*
>   * Virtual Function device init
>   */
> @@ -1598,6 +1645,9 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
>  		return 0;
>  	}
> 
> +	ixgbevf_parse_devargs(eth_dev->data->dev_private,
> +			      pci_dev->device.devargs);
> +
>  	rte_eth_copy_pci_info(eth_dev, pci_dev);
> 
>  	hw->device_id = pci_dev->id.device_id; @@ -3910,6 +3960,8 @@ static
> int  ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
>  		   int *link_up, int wait_to_complete)  {
> +	struct ixgbe_adapter *adapter = container_of(hw,
> +						     struct ixgbe_adapter, hw);
>  	struct ixgbe_mbx_info *mbx = &hw->mbx;
>  	struct ixgbe_mac_info *mac = &hw->mac;
>  	uint32_t links_reg, in_msg;
> @@ -3970,6 +4022,15 @@ ixgbevf_check_link(struct ixgbe_hw *hw,
> ixgbe_link_speed *speed,
>  		*speed = IXGBE_LINK_SPEED_UNKNOWN;
>  	}
> 
> +	if (wait_to_complete == 0 && adapter->pflink_fullchk == 0) {
> +		if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
> +			mac->get_link_status = true;
> +		else
> +			mac->get_link_status = false;
> +
> +		goto out;
> +	}
> +
>  	/* if the read failed it could just be a mailbox collision, best wait
>  	 * until we are called again and don't report an error
>  	 */
> @@ -8671,6 +8732,8 @@ RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe, "*
> igb_uio | uio_pci_generic | vfio-pci");  RTE_PMD_REGISTER_PCI(net_ixgbe_vf,
> rte_ixgbevf_pmd);  RTE_PMD_REGISTER_PCI_TABLE(net_ixgbe_vf,
> pci_id_ixgbevf_map);  RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe_vf, "*
> igb_uio | vfio-pci");
> +RTE_PMD_REGISTER_PARAM_STRING(net_ixgbe_vf,
> +			      IXGBEVF_DEVARG_PFLINK_FULLCHK "=<0|1>");
> 
>  RTE_INIT(ixgbe_init_log)
>  {
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> b/drivers/net/ixgbe/ixgbe_ethdev.h
> index fdad94d..6e9ed2e 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -498,6 +498,11 @@ struct ixgbe_adapter {
> 
>  	/* For RSS reta table update */
>  	uint8_t rss_reta_updated;
> +
> +	/* Used for VF link sync with PF's physical and logical (by checking
> +	 * mailbox status) link status.
> +	 */
> +	uint8_t pflink_fullchk;
>  };
> 
>  struct ixgbe_vf_representor {
> --
> 2.7.4



More information about the dev mailing list