From: Tariq Toukan <tariqt@nvidia.com>
To: Jiri Pirko <jiri@nvidia.com>, Jiri Pirko <jiri@resnulli.us>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>
Cc: Donald Hunter <donald.hunter@gmail.com>,
Jonathan Corbet <corbet@lwn.net>,
Brett Creeley <brett.creeley@amd.com>,
Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
"Cai Huoqing" <cai.huoqing@linux.dev>,
Tony Nguyen <anthony.l.nguyen@intel.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Sunil Goutham <sgoutham@marvell.com>,
Linu Cherian <lcherian@marvell.com>,
Geetha sowjanya <gakula@marvell.com>,
Jerin Jacob <jerinj@marvell.com>, hariprasad <hkelam@marvell.com>,
Subbaraya Sundeep <sbhatta@marvell.com>,
Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Tariq Toukan <tariqt@nvidia.com>, Mark Bloch <mbloch@nvidia.com>,
Ido Schimmel <idosch@nvidia.com>, Petr Machata <petrm@nvidia.com>,
Manish Chopra <manishc@marvell.com>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-doc@vger.kernel.org>,
<intel-wired-lan@lists.osuosl.org>, <linux-rdma@vger.kernel.org>,
"Gal Pressman" <gal@nvidia.com>,
Dragos Tatulea <dtatulea@nvidia.com>,
"Shahar Shitrit" <shshitrit@nvidia.com>
Subject: [Intel-wired-lan] [PATCH net-next V3 3/5] devlink: Introduce error burst period for health reporter
Date: Wed, 13 Aug 2025 21:55:47 +0300 [thread overview]
Message-ID: <1755111349-416632-4-git-send-email-tariqt@nvidia.com> (raw)
In-Reply-To: <1755111349-416632-1-git-send-email-tariqt@nvidia.com>
From: Shahar Shitrit <shshitrit@nvidia.com>
Currently, the devlink health reporter starts the grace period
immediately after handling an error, blocking any further recoveries
until it finished.
However, when a single root cause triggers multiple errors in a short
time frame, it is desirable to treat them as a bulk of errors and to
allow their recoveries, avoiding premature blocking of subsequent
related errors, and reducing the risk of inconsistent or incomplete
error handling.
To address this, introduce a configurable error burst period for devlink
health reporter. Start this period when the first error is handled, and
allow recovery attempts for reported errors during this window. Once
error burst period expires, begin the grace period to block further
recoveries until it concludes.
Timeline summary:
----|--------|------------------------------/----------------------/--
error is error is error burst period grace period
reported recovered (recoveries allowed) (recoveries blocked)
For calculating the error burst period duration, use the same
last_recovery_ts as the grace period. Update it on recovery only
when the error burst period is inactive (either disabled or at the
first error).
This patch implements the framework for the error burst period and
effectively sets its value to 0 at reporter creation, so the current
behavior remains unchanged, which ensures backward compatibility.
A downstream patch will make the error burst period configurable.
Signed-off-by: Shahar Shitrit <shshitrit@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
include/net/devlink.h | 4 ++++
net/devlink/health.c | 22 +++++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index a65aa24e8df4..0c7b41cbb0bd 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -744,6 +744,9 @@ enum devlink_health_reporter_state {
* @test: callback to trigger a test event
* @default_graceful_period: default min time (in msec)
between recovery attempts
+ * @default_error_burst_period: default time (in msec) for
+ * error recoveries before
+ * starting the grace period
*/
struct devlink_health_reporter_ops {
@@ -759,6 +762,7 @@ struct devlink_health_reporter_ops {
int (*test)(struct devlink_health_reporter *reporter,
struct netlink_ext_ack *extack);
u64 default_graceful_period;
+ u64 default_error_burst_period;
};
/**
diff --git a/net/devlink/health.c b/net/devlink/health.c
index 9d0d4a9face7..c4a028e37277 100644
--- a/net/devlink/health.c
+++ b/net/devlink/health.c
@@ -60,6 +60,7 @@ struct devlink_health_reporter {
struct devlink_port *devlink_port;
struct devlink_fmsg *dump_fmsg;
u64 graceful_period;
+ u64 error_burst_period;
bool auto_recover;
bool auto_dump;
u8 health_state;
@@ -123,6 +124,7 @@ __devlink_health_reporter_create(struct devlink *devlink,
reporter->ops = ops;
reporter->devlink = devlink;
reporter->graceful_period = ops->default_graceful_period;
+ reporter->error_burst_period = ops->default_error_burst_period;
reporter->auto_recover = !!ops->recover;
reporter->auto_dump = !!ops->dump;
return reporter;
@@ -508,11 +510,25 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter,
devlink_nl_notify_send_desc(devlink, msg, &desc);
}
+static bool
+devlink_health_reporter_burst_period_active(struct devlink_health_reporter *reporter)
+{
+ unsigned long burst_threshold = reporter->last_recovery_ts +
+ msecs_to_jiffies(reporter->error_burst_period);
+
+ return time_is_after_jiffies(burst_threshold);
+}
+
void
devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
{
reporter->recovery_count++;
- reporter->last_recovery_ts = jiffies;
+ if (!devlink_health_reporter_burst_period_active(reporter))
+ /* When error burst period is set, last_recovery_ts marks the
+ * first recovery within the burst period, not necessarily the
+ * last one.
+ */
+ reporter->last_recovery_ts = jiffies;
}
EXPORT_SYMBOL_GPL(devlink_health_reporter_recovery_done);
@@ -599,7 +615,11 @@ devlink_health_recover_abort(struct devlink_health_reporter *reporter,
if (prev_state != DEVLINK_HEALTH_REPORTER_STATE_HEALTHY)
return true;
+ if (devlink_health_reporter_burst_period_active(reporter))
+ return false;
+
recover_ts_threshold = reporter->last_recovery_ts +
+ msecs_to_jiffies(reporter->error_burst_period) +
msecs_to_jiffies(reporter->graceful_period);
if (reporter->last_recovery_ts && reporter->recovery_count &&
time_is_after_jiffies(recover_ts_threshold))
--
2.31.1
WARNING: multiple messages have this Message-ID (diff)
From: Tariq Toukan <tariqt@nvidia.com>
To: Jiri Pirko <jiri@nvidia.com>, Jiri Pirko <jiri@resnulli.us>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>
Cc: Donald Hunter <donald.hunter@gmail.com>,
Jonathan Corbet <corbet@lwn.net>,
Brett Creeley <brett.creeley@amd.com>,
Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
"Cai Huoqing" <cai.huoqing@linux.dev>,
Tony Nguyen <anthony.l.nguyen@intel.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Sunil Goutham <sgoutham@marvell.com>,
Linu Cherian <lcherian@marvell.com>,
Geetha sowjanya <gakula@marvell.com>,
Jerin Jacob <jerinj@marvell.com>, hariprasad <hkelam@marvell.com>,
Subbaraya Sundeep <sbhatta@marvell.com>,
Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Tariq Toukan <tariqt@nvidia.com>, Mark Bloch <mbloch@nvidia.com>,
Ido Schimmel <idosch@nvidia.com>, Petr Machata <petrm@nvidia.com>,
Manish Chopra <manishc@marvell.com>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-doc@vger.kernel.org>,
<intel-wired-lan@lists.osuosl.org>, <linux-rdma@vger.kernel.org>,
"Gal Pressman" <gal@nvidia.com>,
Dragos Tatulea <dtatulea@nvidia.com>,
"Shahar Shitrit" <shshitrit@nvidia.com>
Subject: [PATCH net-next V3 3/5] devlink: Introduce error burst period for health reporter
Date: Wed, 13 Aug 2025 21:55:47 +0300 [thread overview]
Message-ID: <1755111349-416632-4-git-send-email-tariqt@nvidia.com> (raw)
In-Reply-To: <1755111349-416632-1-git-send-email-tariqt@nvidia.com>
From: Shahar Shitrit <shshitrit@nvidia.com>
Currently, the devlink health reporter starts the grace period
immediately after handling an error, blocking any further recoveries
until it finished.
However, when a single root cause triggers multiple errors in a short
time frame, it is desirable to treat them as a bulk of errors and to
allow their recoveries, avoiding premature blocking of subsequent
related errors, and reducing the risk of inconsistent or incomplete
error handling.
To address this, introduce a configurable error burst period for devlink
health reporter. Start this period when the first error is handled, and
allow recovery attempts for reported errors during this window. Once
error burst period expires, begin the grace period to block further
recoveries until it concludes.
Timeline summary:
----|--------|------------------------------/----------------------/--
error is error is error burst period grace period
reported recovered (recoveries allowed) (recoveries blocked)
For calculating the error burst period duration, use the same
last_recovery_ts as the grace period. Update it on recovery only
when the error burst period is inactive (either disabled or at the
first error).
This patch implements the framework for the error burst period and
effectively sets its value to 0 at reporter creation, so the current
behavior remains unchanged, which ensures backward compatibility.
A downstream patch will make the error burst period configurable.
Signed-off-by: Shahar Shitrit <shshitrit@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
include/net/devlink.h | 4 ++++
net/devlink/health.c | 22 +++++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index a65aa24e8df4..0c7b41cbb0bd 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -744,6 +744,9 @@ enum devlink_health_reporter_state {
* @test: callback to trigger a test event
* @default_graceful_period: default min time (in msec)
between recovery attempts
+ * @default_error_burst_period: default time (in msec) for
+ * error recoveries before
+ * starting the grace period
*/
struct devlink_health_reporter_ops {
@@ -759,6 +762,7 @@ struct devlink_health_reporter_ops {
int (*test)(struct devlink_health_reporter *reporter,
struct netlink_ext_ack *extack);
u64 default_graceful_period;
+ u64 default_error_burst_period;
};
/**
diff --git a/net/devlink/health.c b/net/devlink/health.c
index 9d0d4a9face7..c4a028e37277 100644
--- a/net/devlink/health.c
+++ b/net/devlink/health.c
@@ -60,6 +60,7 @@ struct devlink_health_reporter {
struct devlink_port *devlink_port;
struct devlink_fmsg *dump_fmsg;
u64 graceful_period;
+ u64 error_burst_period;
bool auto_recover;
bool auto_dump;
u8 health_state;
@@ -123,6 +124,7 @@ __devlink_health_reporter_create(struct devlink *devlink,
reporter->ops = ops;
reporter->devlink = devlink;
reporter->graceful_period = ops->default_graceful_period;
+ reporter->error_burst_period = ops->default_error_burst_period;
reporter->auto_recover = !!ops->recover;
reporter->auto_dump = !!ops->dump;
return reporter;
@@ -508,11 +510,25 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter,
devlink_nl_notify_send_desc(devlink, msg, &desc);
}
+static bool
+devlink_health_reporter_burst_period_active(struct devlink_health_reporter *reporter)
+{
+ unsigned long burst_threshold = reporter->last_recovery_ts +
+ msecs_to_jiffies(reporter->error_burst_period);
+
+ return time_is_after_jiffies(burst_threshold);
+}
+
void
devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
{
reporter->recovery_count++;
- reporter->last_recovery_ts = jiffies;
+ if (!devlink_health_reporter_burst_period_active(reporter))
+ /* When error burst period is set, last_recovery_ts marks the
+ * first recovery within the burst period, not necessarily the
+ * last one.
+ */
+ reporter->last_recovery_ts = jiffies;
}
EXPORT_SYMBOL_GPL(devlink_health_reporter_recovery_done);
@@ -599,7 +615,11 @@ devlink_health_recover_abort(struct devlink_health_reporter *reporter,
if (prev_state != DEVLINK_HEALTH_REPORTER_STATE_HEALTHY)
return true;
+ if (devlink_health_reporter_burst_period_active(reporter))
+ return false;
+
recover_ts_threshold = reporter->last_recovery_ts +
+ msecs_to_jiffies(reporter->error_burst_period) +
msecs_to_jiffies(reporter->graceful_period);
if (reporter->last_recovery_ts && reporter->recovery_count &&
time_is_after_jiffies(recover_ts_threshold))
--
2.31.1
next prev parent reply other threads:[~2025-08-13 18:57 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-13 18:55 [Intel-wired-lan] [PATCH net-next V3 0/5] Expose error burst period for devlink health reporter Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan
2025-08-13 18:55 ` [Intel-wired-lan] [PATCH net-next V3 1/5] devlink: Move graceful period parameter to reporter ops Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan
2025-08-15 19:19 ` [Intel-wired-lan] " Jakub Kicinski
2025-08-15 19:19 ` Jakub Kicinski
2025-08-13 18:55 ` [Intel-wired-lan] [PATCH net-next V3 2/5] devlink: Move health reporter recovery abort logic to a separate function Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan [this message]
2025-08-13 18:55 ` [PATCH net-next V3 3/5] devlink: Introduce error burst period for health reporter Tariq Toukan
2025-08-15 19:23 ` [Intel-wired-lan] " Jakub Kicinski
2025-08-15 19:23 ` Jakub Kicinski
2025-08-13 18:55 ` [Intel-wired-lan] [PATCH net-next V3 4/5] devlink: Make health reporter error burst period configurable Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan
2025-08-15 19:26 ` [Intel-wired-lan] " Jakub Kicinski
2025-08-15 19:26 ` Jakub Kicinski
2025-08-17 16:08 ` [Intel-wired-lan] " Shahar Shitrit
2025-08-17 16:08 ` Shahar Shitrit
2025-08-18 15:45 ` [Intel-wired-lan] " Jakub Kicinski
2025-08-18 15:45 ` Jakub Kicinski
2025-08-13 18:55 ` [Intel-wired-lan] [PATCH net-next V3 5/5] net/mlx5e: Set default error burst period for TX and RX reporters Tariq Toukan
2025-08-13 18:55 ` Tariq Toukan
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=1755111349-416632-4-git-send-email-tariqt@nvidia.com \
--to=tariqt@nvidia.com \
--cc=andrew+netdev@lunn.ch \
--cc=anthony.l.nguyen@intel.com \
--cc=brett.creeley@amd.com \
--cc=cai.huoqing@linux.dev \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=dtatulea@nvidia.com \
--cc=edumazet@google.com \
--cc=gakula@marvell.com \
--cc=gal@nvidia.com \
--cc=hkelam@marvell.com \
--cc=idosch@nvidia.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jerinj@marvell.com \
--cc=jiri@nvidia.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=lcherian@marvell.com \
--cc=leon@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=manishc@marvell.com \
--cc=mbloch@nvidia.com \
--cc=michael.chan@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=petrm@nvidia.com \
--cc=przemyslaw.kitszel@intel.com \
--cc=saeedm@nvidia.com \
--cc=sbhatta@marvell.com \
--cc=sgoutham@marvell.com \
--cc=shshitrit@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.