DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Yang, Qiming" <qiming.yang@intel.com>
To: "Zeng, ZhichaoX" <zhichaox.zeng@intel.com>,
	"dev@dpdk.org" <dev@dpdk.org>
Cc: "Zhang, Qi Z" <qi.z.zhang@intel.com>
Subject: RE: [PATCH v2] net/ice: support disabling ACL engine in DCF via devargs
Date: Tue, 23 Aug 2022 07:33:30 +0000	[thread overview]
Message-ID: <MWHPR11MB18869C8EF88119BE7E1B228DE5709@MWHPR11MB1886.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20220817082117.176980-1-zhichaox.zeng@intel.com>



> -----Original Message-----
> From: Zeng, ZhichaoX <zhichaox.zeng@intel.com>
> Sent: Wednesday, August 17, 2022 4:21 PM
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Zeng, ZhichaoX
> <zhichaox.zeng@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Subject: [PATCH v2] net/ice: support disabling ACL engine in DCF via devargs
> 
> From: Zhichao Zeng <zhichaox.zeng@intel.com>

One line more

> 
> Support disabling DCF ACL engine via devarg "acl=off" in cmdline, aiming to
> shorten the DCF startup time.
> 
> Signed-off-by: Zhichao Zeng <zhichaox.zeng@intel.com>
> 
> ---
> v2: add document for the new devarg
> ---
>  doc/guides/nics/ice.rst            | 11 ++++++
>  drivers/net/ice/ice_dcf_ethdev.c   | 58 +++++++++++++++++++++++-------
>  drivers/net/ice/ice_dcf_ethdev.h   |  6 ++++
>  drivers/net/ice/ice_dcf_parent.c   |  3 ++
>  drivers/net/ice/ice_ethdev.h       |  2 ++
>  drivers/net/ice/ice_generic_flow.c | 12 +++++++
>  6 files changed, 79 insertions(+), 13 deletions(-)
> 
> diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst index
> 6b903b9bbc..3aa58d3f2c 100644
> --- a/doc/guides/nics/ice.rst
> +++ b/doc/guides/nics/ice.rst
> @@ -296,6 +296,17 @@ The DCF PMD needs to advertise and acquire DCF
> capability which allows DCF to  send AdminQ commands that it would like to
> execute over to the PF and receive  responses for the same from PF.
> 
> +Additional Options
> +++++++++++++++++++
> +
> +- ``Disable ACL Engine`` (default ``enabled``)
> +
> +  By default, all flow engines are enabled. But if user does not need
> + the  ACL engine related functions, user can set ``devargs`` parameter
> + ``acl=off`` to disable the ACL engine and shorten the startup time.
> +
> +    -a 18:01.0,cap=dcf,acl=off
> +
>  .. _figure_ice_dcf:
> 
>  .. figure:: img/ice_dcf.*
> diff --git a/drivers/net/ice/ice_dcf_ethdev.c
> b/drivers/net/ice/ice_dcf_ethdev.c
> index 0da267db1f..a51e404e64 100644
> --- a/drivers/net/ice/ice_dcf_ethdev.c
> +++ b/drivers/net/ice/ice_dcf_ethdev.c
> @@ -45,6 +45,26 @@ ice_dcf_dev_init(struct rte_eth_dev *eth_dev);  static
> int  ice_dcf_dev_uninit(struct rte_eth_dev *eth_dev);
> 
> +static int
> +ice_dcf_cap_check_handler(__rte_unused const char *key,
> +			  const char *value, __rte_unused void *opaque);
> +
> +static int
> +ice_dcf_engine_disabled_handler(__rte_unused const char *key,
> +			  const char *value, __rte_unused void *opaque);
> +
> +struct ice_devarg {
> +	enum ice_dcf_devrarg type;
> +	const char *key;
> +	int (*handler)(__rte_unused const char *key,
> +			  const char *value, __rte_unused void *opaque); };
> +
> +static const struct ice_devarg ice_devargs_table[] = {
> +	{ICE_DCF_DEVARG_CAP, "cap", ice_dcf_cap_check_handler},
> +	{ICE_DCF_DEVARG_ACL, "acl", ice_dcf_engine_disabled_handler}, };
> +
>  struct rte_ice_dcf_xstats_name_off {
>  	char name[RTE_ETH_XSTATS_NAME_SIZE];
>  	unsigned int offset;
> @@ -1909,6 +1929,16 @@ ice_dcf_dev_uninit(struct rte_eth_dev *eth_dev)
>  	return 0;
>  }
> 
> +static int
> +ice_dcf_engine_disabled_handler(__rte_unused const char *key,
> +			  const char *value, __rte_unused void *opaque) {
> +	if (strcmp(value, "off"))
> +		return -1;
> +
> +	return 0;
> +}
> +
>  static int
>  ice_dcf_cap_check_handler(__rte_unused const char *key,
>  			  const char *value, __rte_unused void *opaque) @@
> -1919,11 +1949,11 @@ ice_dcf_cap_check_handler(__rte_unused const char
> *key,
>  	return 0;
>  }
> 
> -static int
> -ice_dcf_cap_selected(struct rte_devargs *devargs)
> +int
> +ice_devargs_check(struct rte_devargs *devargs, enum ice_dcf_devrarg
> +devarg_type)
>  {
>  	struct rte_kvargs *kvlist;
> -	const char *key = "cap";
> +	unsigned int i = 0;
>  	int ret = 0;
> 
>  	if (devargs == NULL)
> @@ -1933,16 +1963,18 @@ ice_dcf_cap_selected(struct rte_devargs
> *devargs)
>  	if (kvlist == NULL)
>  		return 0;
> 
> -	if (!rte_kvargs_count(kvlist, key))
> -		goto exit;
> -
> -	/* dcf capability selected when there's a key-value pair: cap=dcf */
> -	if (rte_kvargs_process(kvlist, key,
> -			       ice_dcf_cap_check_handler, NULL) < 0)
> -		goto exit;
> -
> -	ret = 1;
> +	for (i = 0; i < ARRAY_SIZE(ice_devargs_table); i++)	{
> +		if (devarg_type == ice_devargs_table[i].type) {
> +			if (!rte_kvargs_count(kvlist, ice_devargs_table[i].key))
> +				goto exit;
> 
> +			if (rte_kvargs_process(kvlist, ice_devargs_table[i].key,
> +					ice_devargs_table[i].handler, NULL) <
> 0)
> +				goto exit;
> +			ret = 1;
> +			break;
> +		}
> +	}
>  exit:
>  	rte_kvargs_free(kvlist);
>  	return ret;
> @@ -1960,7 +1992,7 @@ eth_ice_dcf_pci_probe(__rte_unused struct
> rte_pci_driver *pci_drv,
>  	uint16_t dcf_vsi_id;
>  	int i, ret;
> 
> -	if (!ice_dcf_cap_selected(pci_dev->device.devargs))
> +	if (!ice_devargs_check(pci_dev->device.devargs,
> ICE_DCF_DEVARG_CAP))
>  		return 1;
> 
>  	ret = rte_eth_devargs_parse(pci_dev->device.devargs->args,
> &eth_da); diff --git a/drivers/net/ice/ice_dcf_ethdev.h
> b/drivers/net/ice/ice_dcf_ethdev.h
> index 27f6402786..4baaec4b8b 100644
> --- a/drivers/net/ice/ice_dcf_ethdev.h
> +++ b/drivers/net/ice/ice_dcf_ethdev.h
> @@ -64,12 +64,18 @@ struct ice_dcf_vf_repr {
>  	struct ice_dcf_vlan outer_vlan_info; /* DCF always handle outer
> VLAN */  };
> 
> +enum ice_dcf_devrarg {
> +	ICE_DCF_DEVARG_CAP,

Does ICE_DCF_DEVARG_CAP means no ACL?

> +	ICE_DCF_DEVARG_ACL,
> +};
> +
>  extern const struct rte_tm_ops ice_dcf_tm_ops;  void
> ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw,
>  				 uint8_t *msg, uint16_t msglen);
>  int ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev);  void
> ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev);
> 
> +int ice_devargs_check(struct rte_devargs *devargs, enum ice_dcf_devrarg
> +devarg_type);
>  int ice_dcf_vf_repr_init(struct rte_eth_dev *vf_rep_eth_dev, void
> *init_param);  int ice_dcf_vf_repr_uninit(struct rte_eth_dev
> *vf_rep_eth_dev);  int ice_dcf_vf_repr_init_vlan(struct rte_eth_dev
> *vf_rep_eth_dev); diff --git a/drivers/net/ice/ice_dcf_parent.c
> b/drivers/net/ice/ice_dcf_parent.c
> index 2f96dedcce..c67c865d8e 100644
> --- a/drivers/net/ice/ice_dcf_parent.c
> +++ b/drivers/net/ice/ice_dcf_parent.c
> @@ -466,6 +466,9 @@ ice_dcf_init_parent_adapter(struct rte_eth_dev
> *eth_dev)
> 
>  	ice_dcf_update_vf_vsi_map(parent_hw, hw->num_vfs, hw-
> >vf_vsi_map);
> 
> +	if (ice_devargs_check(eth_dev->device->devargs,
> ICE_DCF_DEVARG_ACL))
> +		parent_adapter->disabled_engine_mask |=
> BIT(ICE_FLOW_ENGINE_ACL);
> +
>  	err = ice_flow_init(parent_adapter);
>  	if (err) {
>  		PMD_INIT_LOG(ERR, "Failed to initialize flow"); diff --git
> a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index
> ec23dae665..5bd5ead0e6 100644
> --- a/drivers/net/ice/ice_ethdev.h
> +++ b/drivers/net/ice/ice_ethdev.h
> @@ -610,6 +610,8 @@ struct ice_adapter {
>  	struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS];
>  	/* True if DCF state of the associated PF is on */
>  	bool dcf_state_on;
> +	/* Set bit if the engine is disabled */
> +	unsigned long disabled_engine_mask;
>  	struct ice_parser *psr;
>  #ifdef RTE_ARCH_X86
>  	bool rx_use_avx2;
> diff --git a/drivers/net/ice/ice_generic_flow.c
> b/drivers/net/ice/ice_generic_flow.c
> index 57eb002bde..d496c28dec 100644
> --- a/drivers/net/ice/ice_generic_flow.c
> +++ b/drivers/net/ice/ice_generic_flow.c
> @@ -28,6 +28,8 @@
>  /*Pipeline mode, fdir used at distributor stage*/  #define
> ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR 2
> 
> +#define ICE_FLOW_ENGINE_DISABLED(mask, type) ((mask) & BIT(type))
> +
>  static struct ice_engine_list engine_list =
>  		TAILQ_HEAD_INITIALIZER(engine_list);
> 
> @@ -1841,6 +1843,11 @@ ice_flow_init(struct ice_adapter *ad)
>  			return -ENOTSUP;
>  		}
> 
> +		if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask,
> engine->type)) {
> +			PMD_INIT_LOG(INFO, "Engine %d disabled", engine-
> >type);
> +			continue;
> +		}
> +
>  		ret = engine->init(ad);
>  		if (ret) {
>  			PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
> @@ -1861,6 +1868,11 @@ ice_flow_uninit(struct ice_adapter *ad)
>  	void *temp;
> 
>  	RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
> +		if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask,
> engine->type)) {
> +			PMD_DRV_LOG(DEBUG, "Engine %d disabled skip it",
> engine->type);
> +			continue;
> +		}
> +
>  		if (engine->uninit)
>  			engine->uninit(ad);
>  	}
> --
> 2.25.1


  parent reply	other threads:[~2022-08-23  7:34 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-25  3:15 [PATCH] " zhichaox.zeng
2022-08-12  4:08 ` Zhang, Qi Z
2022-08-17  8:21 ` [PATCH v2] " zhichaox.zeng
2022-08-22 23:07   ` Zhang, Qi Z
2022-08-23  7:33   ` Yang, Qiming [this message]
2022-08-23  9:16     ` Zeng, ZhichaoX

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MWHPR11MB18869C8EF88119BE7E1B228DE5709@MWHPR11MB1886.namprd11.prod.outlook.com \
    --to=qiming.yang@intel.com \
    --cc=dev@dpdk.org \
    --cc=qi.z.zhang@intel.com \
    --cc=zhichaox.zeng@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).