From: "Zhang, Qi Z" <qi.z.zhang@intel.com>
To: "Zeng, ZhichaoX" <zhichaox.zeng@intel.com>,
"dev@dpdk.org" <dev@dpdk.org>
Cc: "Wu, Jingjing" <jingjing.wu@intel.com>,
"Xing, Beilei" <beilei.xing@intel.com>
Subject: RE: [PATCH v2] net/iavf: add devargs to control watchdog
Date: Mon, 15 May 2023 02:02:57 +0000 [thread overview]
Message-ID: <DM4PR11MB5994EE562AFD7FC9BAFC9A25D7789@DM4PR11MB5994.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20230505022717.3702876-1-zhichaox.zeng@intel.com>
> -----Original Message-----
> From: Zeng, ZhichaoX <zhichaox.zeng@intel.com>
> Sent: Friday, May 5, 2023 10:27 AM
> To: dev@dpdk.org
> Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Zeng, ZhichaoX
> <zhichaox.zeng@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Xing,
> Beilei <beilei.xing@intel.com>
> Subject: [PATCH v2] net/iavf: add devargs to control watchdog
>
> This patch enables the watchdog to detect VF FLR when the link state
> changes to down, and the default period is 2000us as defined by
> IAVF_DEV_WATCHDOG_PERIOD.
>
> In addition, the 'watchdog_period' devargs was added to adjust the
> watchdog period(microseconds), or set to 0 to disable the watchdog.
Please also update ice.rst by adding the usage of the new devarg.
>
> Signed-off-by: Zhichao Zeng <zhichaox.zeng@intel.com>
>
> ---
> v2: enables watchdog when link status changes to down
> ---
> drivers/net/iavf/iavf.h | 5 ++-
> drivers/net/iavf/iavf_ethdev.c | 81 +++++++++++++++++++++++++---------
> drivers/net/iavf/iavf_vchnl.c | 21 +++++++--
> 3 files changed, 81 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index
> aa18650ffa..98861e4242 100644
> --- a/drivers/net/iavf/iavf.h
> +++ b/drivers/net/iavf/iavf.h
> @@ -31,7 +31,7 @@
>
> #define IAVF_NUM_MACADDR_MAX 64
>
> -#define IAVF_DEV_WATCHDOG_PERIOD 0
> +#define IAVF_DEV_WATCHDOG_PERIOD 2000 /* microseconds, set 0 to
> disable*/
>
> #define IAVF_DEFAULT_RX_PTHRESH 8
> #define IAVF_DEFAULT_RX_HTHRESH 8
> @@ -304,6 +304,7 @@ struct iavf_devargs {
> uint8_t proto_xtr_dflt;
> uint8_t proto_xtr[IAVF_MAX_QUEUE_NUM];
> uint16_t quanta_size;
> + uint32_t watchdog_period;
> };
>
> struct iavf_security_ctx;
> @@ -498,4 +499,6 @@ int iavf_flow_unsub(struct iavf_adapter *adapter,
> struct iavf_fsub_conf *filter);
> int iavf_flow_sub_check(struct iavf_adapter *adapter,
> struct iavf_fsub_conf *filter);
> +void iavf_dev_watchdog_enable(struct iavf_adapter *adapter); void
> +iavf_dev_watchdog_disable(struct iavf_adapter *adapter);
> #endif /* _IAVF_ETHDEV_H_ */
> diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
> index f6d68403ce..4cf4eb20cd 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -36,6 +36,7 @@
> /* devargs */
> #define IAVF_PROTO_XTR_ARG "proto_xtr"
> #define IAVF_QUANTA_SIZE_ARG "quanta_size"
> +#define IAVF_RESET_WATCHDOG_ARG "watchdog_period"
>
> uint64_t iavf_timestamp_dynflag;
> int iavf_timestamp_dynfield_offset = -1; @@ -43,6 +44,7 @@ int
> iavf_timestamp_dynfield_offset = -1; static const char * const
> iavf_valid_args[] = {
> IAVF_PROTO_XTR_ARG,
> IAVF_QUANTA_SIZE_ARG,
> + IAVF_RESET_WATCHDOG_ARG,
> NULL
> };
>
> @@ -301,40 +303,46 @@ iavf_dev_watchdog(void *cb_arg)
>
> /* enter reset state with VFLR event */
> adapter->vf.vf_reset = true;
> + adapter->vf.link_up = false;
>
> rte_eth_dev_callback_process(adapter->vf.eth_dev,
> RTE_ETH_EVENT_INTR_RESET, NULL);
> }
> }
>
> - /* re-alarm watchdog */
> - rc = rte_eal_alarm_set(IAVF_DEV_WATCHDOG_PERIOD,
> - &iavf_dev_watchdog, cb_arg);
> + if (adapter->devargs.watchdog_period) {
> + /* re-alarm watchdog */
> + rc = rte_eal_alarm_set(adapter->devargs.watchdog_period,
> + &iavf_dev_watchdog, cb_arg);
>
> - if (rc)
> - PMD_DRV_LOG(ERR, "Failed \"%s\" to reset device watchdog
> alarm",
> - adapter->vf.eth_dev->data->name);
> + if (rc)
> + PMD_DRV_LOG(ERR, "Failed \"%s\" to reset device
> watchdog alarm",
> + adapter->vf.eth_dev->data->name);
> + }
> }
>
> -static void
> -iavf_dev_watchdog_enable(struct iavf_adapter *adapter __rte_unused) -{ -
> #if (IAVF_DEV_WATCHDOG_PERIOD > 0)
> - PMD_DRV_LOG(INFO, "Enabling device watchdog");
> - adapter->vf.watchdog_enabled = true;
> - if (rte_eal_alarm_set(IAVF_DEV_WATCHDOG_PERIOD,
> - &iavf_dev_watchdog, (void *)adapter))
> - PMD_DRV_LOG(ERR, "Failed to enabled device watchdog");
> -#endif
> +void
> +iavf_dev_watchdog_enable(struct iavf_adapter *adapter) {
> + if (adapter->devargs.watchdog_period && !adapter-
> >vf.watchdog_enabled) {
> + PMD_DRV_LOG(INFO, "Enabling device watchdog, period
> is %dμs",
> + adapter->devargs.watchdog_period);
> + adapter->vf.watchdog_enabled = true;
> + if (rte_eal_alarm_set(adapter->devargs.watchdog_period,
> + &iavf_dev_watchdog, (void
> *)adapter))
> + PMD_DRV_LOG(ERR, "Failed to enabled device
> watchdog");
> + } else {
> + PMD_DRV_LOG(INFO, "Device watchdog is disabled");
> + }
> }
>
> -static void
> -iavf_dev_watchdog_disable(struct iavf_adapter *adapter __rte_unused)
> +void
> +iavf_dev_watchdog_disable(struct iavf_adapter *adapter)
> {
> -#if (IAVF_DEV_WATCHDOG_PERIOD > 0)
> - PMD_DRV_LOG(INFO, "Disabling device watchdog");
> - adapter->vf.watchdog_enabled = false;
> -#endif
> + if (adapter->devargs.watchdog_period && adapter-
> >vf.watchdog_enabled) {
> + PMD_DRV_LOG(INFO, "Disabling device watchdog");
> + adapter->vf.watchdog_enabled = false;
> + }
> }
>
> static int
> @@ -2201,6 +2209,25 @@ parse_u16(__rte_unused const char *key, const
> char *value, void *args)
> return 0;
> }
>
> +static int
> +iavf_parse_watchdog_period(__rte_unused const char *key, const char
> +*value, void *args) {
> + int *num = (int *)args;
> + int tmp;
> +
> + errno = 0;
> + tmp = atoi(value);
> + if (tmp < 0) {
> + PMD_DRV_LOG(WARNING, "%s: \"%s\" is not greater than or
> equal to zero",
> + key, value);
> + return -1;
> + }
> +
> + *num = tmp;
> +
> + return 0;
> +}
> +
> static int iavf_parse_devargs(struct rte_eth_dev *dev) {
> struct iavf_adapter *ad =
> @@ -2208,6 +2235,7 @@ static int iavf_parse_devargs(struct rte_eth_dev
> *dev)
> struct rte_devargs *devargs = dev->device->devargs;
> struct rte_kvargs *kvlist;
> int ret;
> + int watchdog_period = -1;
>
> if (!devargs)
> return 0;
> @@ -2232,6 +2260,15 @@ static int iavf_parse_devargs(struct rte_eth_dev
> *dev)
> if (ret)
> goto bail;
>
> + ret = rte_kvargs_process(kvlist, IAVF_RESET_WATCHDOG_ARG,
> + &iavf_parse_watchdog_period,
> &watchdog_period);
> + if (ret)
> + goto bail;
> + if (watchdog_period == -1)
> + ad->devargs.watchdog_period =
> IAVF_DEV_WATCHDOG_PERIOD;
> + else
> + ad->devargs.watchdog_period = watchdog_period;
> +
> if (ad->devargs.quanta_size != 0 &&
> (ad->devargs.quanta_size < 256 || ad->devargs.quanta_size > 4096
> ||
> ad->devargs.quanta_size & 0x40)) { diff --git
> a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index
> 9adaadb173..f2d7331f55 100644
> --- a/drivers/net/iavf/iavf_vchnl.c
> +++ b/drivers/net/iavf/iavf_vchnl.c
> @@ -256,6 +256,12 @@ iavf_read_msg_from_pf(struct iavf_adapter
> *adapter, uint16_t buf_len,
> vf->link_speed =
> iavf_convert_link_speed(speed);
> }
> iavf_dev_link_update(vf->eth_dev, 0);
> + if (vf->link_up && !vf->vf_reset) {
> + iavf_dev_watchdog_disable(adapter);
> + } else {
> + if (!vf->link_up)
> + iavf_dev_watchdog_enable(adapter);
> + }
> PMD_DRV_LOG(INFO, "Link status update:%s",
> vf->link_up ? "up" : "down");
> break;
> @@ -433,9 +439,12 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev,
> uint8_t *msg,
> switch (pf_msg->event) {
> case VIRTCHNL_EVENT_RESET_IMPENDING:
> PMD_DRV_LOG(DEBUG,
> "VIRTCHNL_EVENT_RESET_IMPENDING event");
> - vf->vf_reset = true;
> - iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_RESET,
> - NULL, 0);
> + vf->link_up = false;
> + if (!vf->vf_reset) {
> + vf->vf_reset = true;
> + iavf_dev_event_post(dev,
> RTE_ETH_EVENT_INTR_RESET,
> + NULL, 0);
> + }
> break;
> case VIRTCHNL_EVENT_LINK_CHANGE:
> PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_LINK_CHANGE
> event"); @@ -449,6 +458,12 @@ iavf_handle_pf_event_msg(struct
> rte_eth_dev *dev, uint8_t *msg,
> vf->link_speed = iavf_convert_link_speed(speed);
> }
> iavf_dev_link_update(dev, 0);
> + if (vf->link_up && !vf->vf_reset) {
> + iavf_dev_watchdog_disable(adapter);
> + } else {
> + if (!vf->link_up)
> + iavf_dev_watchdog_enable(adapter);
> + }
> iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_LSC, NULL,
> 0);
> break;
> case VIRTCHNL_EVENT_PF_DRIVER_CLOSE:
> --
> 2.25.1
next prev parent reply other threads:[~2023-05-15 2:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-18 5:42 [PATCH] net/iavf: add devargs to enable watchdog Zhichao Zeng
2023-04-24 2:33 ` Zhang, Qi Z
2023-05-05 2:27 ` [PATCH v2] net/iavf: add devargs to control watchdog Zhichao Zeng
2023-05-15 2:02 ` Zhang, Qi Z [this message]
2023-05-15 5:47 ` [PATCH v3] " Zhichao Zeng
2023-05-15 6:19 ` Zhang, Qi Z
2023-05-15 6:54 ` [PATCH v4] " Zhichao Zeng
2023-05-17 0:51 ` Zhang, Qi Z
2023-06-02 2:32 [PATCH v2] " Zhichao Zeng
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=DM4PR11MB5994EE562AFD7FC9BAFC9A25D7789@DM4PR11MB5994.namprd11.prod.outlook.com \
--to=qi.z.zhang@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=jingjing.wu@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).