* [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-13 3:01 ` Jakub Kicinski
2024-12-11 22:32 ` [PATCH net-next 2/7] devlink: add devlink_fmsg_put() macro Tony Nguyen
` (5 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Przemek Kitszel, anthony.l.nguyen, wojciech.drewek,
mateusz.polchlopek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1
From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Improve CamelCase recognition logic to avoid reporting on
_Generic() use.
Other C keywords, such as _Bool, are intentionally omitted, as those
should be rather avoided in new source code.
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
scripts/checkpatch.pl | 2 ++
1 file changed, 2 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 9eed3683ad76..a2066a6c9dd8 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5843,6 +5843,8 @@ sub process {
#CamelCase
if ($var !~ /^$Constant$/ &&
$var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
+#Ignore C keywords
+ $var !~ /^_Generic$/ &&
#Ignore some autogenerated defines and enum values
$var !~ /^(?:[A-Z]+_){1,5}[A-Z]{1,3}[a-z]/ &&
#Ignore Page<foo> variants
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use
2024-12-11 22:32 ` [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use Tony Nguyen
@ 2024-12-13 3:01 ` Jakub Kicinski
2024-12-13 5:58 ` Joe Perches
0 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2024-12-13 3:01 UTC (permalink / raw)
To: Tony Nguyen
Cc: davem, pabeni, edumazet, andrew+netdev, netdev, Przemek Kitszel,
wojciech.drewek, mateusz.polchlopek, joe, horms, jiri, apw,
lukas.bulwahn, dwaipayanray1
On Wed, 11 Dec 2024 14:32:09 -0800 Tony Nguyen wrote:
> Improve CamelCase recognition logic to avoid reporting on
> _Generic() use.
>
> Other C keywords, such as _Bool, are intentionally omitted, as those
> should be rather avoided in new source code.
You're probably better off separating this out, we can't apply without
Joe's Ack. I'm not sure what the latency for that will be.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use
2024-12-13 3:01 ` Jakub Kicinski
@ 2024-12-13 5:58 ` Joe Perches
0 siblings, 0 replies; 15+ messages in thread
From: Joe Perches @ 2024-12-13 5:58 UTC (permalink / raw)
To: Jakub Kicinski, Tony Nguyen
Cc: davem, pabeni, edumazet, andrew+netdev, netdev, Przemek Kitszel,
wojciech.drewek, mateusz.polchlopek, horms, jiri, apw,
lukas.bulwahn, dwaipayanray1
On Thu, 2024-12-12 at 19:01 -0800, Jakub Kicinski wrote:
> On Wed, 11 Dec 2024 14:32:09 -0800 Tony Nguyen wrote:
> > Improve CamelCase recognition logic to avoid reporting on
> > _Generic() use.
> >
> > Other C keywords, such as _Bool, are intentionally omitted, as those
> > should be rather avoided in new source code.
>
> You're probably better off separating this out, we can't apply without
> Joe's Ack. I'm not sure what the latency for that will be.
It's fine to apply. I believe I acked earlier versions.
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH net-next 2/7] devlink: add devlink_fmsg_put() macro
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 3/7] devlink: add devlink_fmsg_dump_skb() function Tony Nguyen
` (4 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Przemek Kitszel, anthony.l.nguyen, wojciech.drewek,
mateusz.polchlopek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1, Pucha Himasekhar Reddy
From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Add devlink_fmsg_put() that dispatches based on the type
of the value to put, example: bool -> devlink_fmsg_bool_pair_put().
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
include/net/devlink.h | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index fbb9a2668e24..b5e1427ea4d7 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1261,6 +1261,17 @@ enum devlink_trap_group_generic_id {
.min_burst = _min_burst, \
}
+#define devlink_fmsg_put(fmsg, name, value) ( \
+ _Generic((value), \
+ bool : devlink_fmsg_bool_pair_put, \
+ u8 : devlink_fmsg_u8_pair_put, \
+ u16 : devlink_fmsg_u32_pair_put, \
+ u32 : devlink_fmsg_u32_pair_put, \
+ u64 : devlink_fmsg_u64_pair_put, \
+ char * : devlink_fmsg_string_pair_put, \
+ const char * : devlink_fmsg_string_pair_put) \
+ (fmsg, name, (value)))
+
enum {
/* device supports reload operations */
DEVLINK_F_RELOAD = 1UL << 0,
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH net-next 3/7] devlink: add devlink_fmsg_dump_skb() function
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 1/7] checkpatch: don't complain on _Generic() use Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 2/7] devlink: add devlink_fmsg_put() macro Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 4/7] ice: rename devlink_port.[ch] to port.[ch] Tony Nguyen
` (3 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Mateusz Polchlopek, anthony.l.nguyen, przemyslaw.kitszel,
wojciech.drewek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1, Pucha Himasekhar Reddy
From: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Add devlink_fmsg_dump_skb() function that adds some diagnostic
information about skb (like length, pkt type, MAC, etc) to devlink
fmsg mechanism using bunch of devlink_fmsg_put() function calls.
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
include/net/devlink.h | 2 ++
net/devlink/health.c | 67 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index b5e1427ea4d7..58e33959c852 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1268,6 +1268,7 @@ enum devlink_trap_group_generic_id {
u16 : devlink_fmsg_u32_pair_put, \
u32 : devlink_fmsg_u32_pair_put, \
u64 : devlink_fmsg_u64_pair_put, \
+ int : devlink_fmsg_u32_pair_put, \
char * : devlink_fmsg_string_pair_put, \
const char * : devlink_fmsg_string_pair_put) \
(fmsg, name, (value)))
@@ -2005,6 +2006,7 @@ int devlink_compat_switch_id_get(struct net_device *dev,
int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port);
size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port);
+void devlink_fmsg_dump_skb(struct devlink_fmsg *fmsg, const struct sk_buff *skb);
#else
diff --git a/net/devlink/health.c b/net/devlink/health.c
index b8d3084e6fe0..57db6799722a 100644
--- a/net/devlink/health.c
+++ b/net/devlink/health.c
@@ -1238,3 +1238,70 @@ int devlink_nl_health_reporter_test_doit(struct sk_buff *skb,
return reporter->ops->test(reporter, info->extack);
}
+
+/**
+ * devlink_fmsg_dump_skb - Dump sk_buffer structure
+ * @fmsg: devlink formatted message pointer
+ * @skb: pointer to skb
+ *
+ * Dump diagnostic information about sk_buff structure, like headroom, length,
+ * tailroom, MAC, etc.
+ */
+void devlink_fmsg_dump_skb(struct devlink_fmsg *fmsg, const struct sk_buff *skb)
+{
+ struct skb_shared_info *sh = skb_shinfo(skb);
+ struct sock *sk = skb->sk;
+ bool has_mac, has_trans;
+
+ has_mac = skb_mac_header_was_set(skb);
+ has_trans = skb_transport_header_was_set(skb);
+
+ devlink_fmsg_pair_nest_start(fmsg, "skb");
+ devlink_fmsg_obj_nest_start(fmsg);
+ devlink_fmsg_put(fmsg, "actual len", skb->len);
+ devlink_fmsg_put(fmsg, "head len", skb_headlen(skb));
+ devlink_fmsg_put(fmsg, "data len", skb->data_len);
+ devlink_fmsg_put(fmsg, "tail len", skb_tailroom(skb));
+ devlink_fmsg_put(fmsg, "MAC", has_mac ? skb->mac_header : -1);
+ devlink_fmsg_put(fmsg, "MAC len",
+ has_mac ? skb_mac_header_len(skb) : -1);
+ devlink_fmsg_put(fmsg, "network hdr", skb->network_header);
+ devlink_fmsg_put(fmsg, "network hdr len",
+ has_trans ? skb_network_header_len(skb) : -1);
+ devlink_fmsg_put(fmsg, "transport hdr",
+ has_trans ? skb->transport_header : -1);
+ devlink_fmsg_put(fmsg, "csum", (__force u32)skb->csum);
+ devlink_fmsg_put(fmsg, "csum_ip_summed", (u8)skb->ip_summed);
+ devlink_fmsg_put(fmsg, "csum_complete_sw", !!skb->csum_complete_sw);
+ devlink_fmsg_put(fmsg, "csum_valid", !!skb->csum_valid);
+ devlink_fmsg_put(fmsg, "csum_level", (u8)skb->csum_level);
+ devlink_fmsg_put(fmsg, "sw_hash", !!skb->sw_hash);
+ devlink_fmsg_put(fmsg, "l4_hash", !!skb->l4_hash);
+ devlink_fmsg_put(fmsg, "proto", ntohs(skb->protocol));
+ devlink_fmsg_put(fmsg, "pkt_type", (u8)skb->pkt_type);
+ devlink_fmsg_put(fmsg, "iif", skb->skb_iif);
+
+ if (sk) {
+ devlink_fmsg_pair_nest_start(fmsg, "sk");
+ devlink_fmsg_obj_nest_start(fmsg);
+ devlink_fmsg_put(fmsg, "family", sk->sk_type);
+ devlink_fmsg_put(fmsg, "type", sk->sk_type);
+ devlink_fmsg_put(fmsg, "proto", sk->sk_protocol);
+ devlink_fmsg_obj_nest_end(fmsg);
+ devlink_fmsg_pair_nest_end(fmsg);
+ }
+
+ devlink_fmsg_obj_nest_end(fmsg);
+ devlink_fmsg_pair_nest_end(fmsg);
+
+ devlink_fmsg_pair_nest_start(fmsg, "shinfo");
+ devlink_fmsg_obj_nest_start(fmsg);
+ devlink_fmsg_put(fmsg, "tx_flags", sh->tx_flags);
+ devlink_fmsg_put(fmsg, "nr_frags", sh->nr_frags);
+ devlink_fmsg_put(fmsg, "gso_size", sh->gso_size);
+ devlink_fmsg_put(fmsg, "gso_type", sh->gso_type);
+ devlink_fmsg_put(fmsg, "gso_segs", sh->gso_segs);
+ devlink_fmsg_obj_nest_end(fmsg);
+ devlink_fmsg_pair_nest_end(fmsg);
+}
+EXPORT_SYMBOL_GPL(devlink_fmsg_dump_skb);
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH net-next 4/7] ice: rename devlink_port.[ch] to port.[ch]
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
` (2 preceding siblings ...)
2024-12-11 22:32 ` [PATCH net-next 3/7] devlink: add devlink_fmsg_dump_skb() function Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-12 6:08 ` Kalesh Anakkur Purayil
2024-12-11 22:32 ` [PATCH net-next 5/7] ice: add Tx hang devlink health reporter Tony Nguyen
` (2 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Przemek Kitszel, anthony.l.nguyen, wojciech.drewek,
mateusz.polchlopek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1
From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Drop "devlink_" prefix from files that sit in devlink/.
I'm going to add more files there, and repeating "devlink" does not feel
good. This is also the scheme used in most other places, most notably the
devlink core files are named like that.
devlink.[ch] stays as is.
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/Makefile | 2 +-
drivers/net/ethernet/intel/ice/devlink/devlink.c | 2 +-
.../net/ethernet/intel/ice/devlink/{devlink_port.c => port.c} | 2 +-
.../net/ethernet/intel/ice/devlink/{devlink_port.h => port.h} | 0
drivers/net/ethernet/intel/ice/ice_eswitch.h | 2 +-
drivers/net/ethernet/intel/ice/ice_main.c | 2 +-
drivers/net/ethernet/intel/ice/ice_repr.c | 2 +-
drivers/net/ethernet/intel/ice/ice_sf_eth.c | 2 +-
8 files changed, 7 insertions(+), 7 deletions(-)
rename drivers/net/ethernet/intel/ice/devlink/{devlink_port.c => port.c} (99%)
rename drivers/net/ethernet/intel/ice/devlink/{devlink_port.h => port.h} (100%)
diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile
index 3307d551f431..56aa23aee472 100644
--- a/drivers/net/ethernet/intel/ice/Makefile
+++ b/drivers/net/ethernet/intel/ice/Makefile
@@ -32,7 +32,7 @@ ice-y := ice_main.o \
ice_parser_rt.o \
ice_idc.o \
devlink/devlink.o \
- devlink/devlink_port.o \
+ devlink/port.o \
ice_sf_eth.o \
ice_sf_vsi_vlan_ops.o \
ice_ddp.o \
diff --git a/drivers/net/ethernet/intel/ice/devlink/devlink.c b/drivers/net/ethernet/intel/ice/devlink/devlink.c
index 415445cefdb2..1b10682c00b8 100644
--- a/drivers/net/ethernet/intel/ice/devlink/devlink.c
+++ b/drivers/net/ethernet/intel/ice/devlink/devlink.c
@@ -6,7 +6,7 @@
#include "ice.h"
#include "ice_lib.h"
#include "devlink.h"
-#include "devlink_port.h"
+#include "port.h"
#include "ice_eswitch.h"
#include "ice_fw_update.h"
#include "ice_dcb_lib.h"
diff --git a/drivers/net/ethernet/intel/ice/devlink/devlink_port.c b/drivers/net/ethernet/intel/ice/devlink/port.c
similarity index 99%
rename from drivers/net/ethernet/intel/ice/devlink/devlink_port.c
rename to drivers/net/ethernet/intel/ice/devlink/port.c
index c6779d9dffff..767419a67fef 100644
--- a/drivers/net/ethernet/intel/ice/devlink/devlink_port.c
+++ b/drivers/net/ethernet/intel/ice/devlink/port.c
@@ -5,7 +5,7 @@
#include "ice.h"
#include "devlink.h"
-#include "devlink_port.h"
+#include "port.h"
#include "ice_lib.h"
#include "ice_fltr.h"
diff --git a/drivers/net/ethernet/intel/ice/devlink/devlink_port.h b/drivers/net/ethernet/intel/ice/devlink/port.h
similarity index 100%
rename from drivers/net/ethernet/intel/ice/devlink/devlink_port.h
rename to drivers/net/ethernet/intel/ice/devlink/port.h
diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.h b/drivers/net/ethernet/intel/ice/ice_eswitch.h
index ac7db100e2cd..5c7dcf21b222 100644
--- a/drivers/net/ethernet/intel/ice/ice_eswitch.h
+++ b/drivers/net/ethernet/intel/ice/ice_eswitch.h
@@ -5,7 +5,7 @@
#define _ICE_ESWITCH_H_
#include <net/devlink.h>
-#include "devlink/devlink_port.h"
+#include "devlink/port.h"
#ifdef CONFIG_ICE_SWITCHDEV
void ice_eswitch_detach_vf(struct ice_pf *pf, struct ice_vf *vf);
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 0ab35607e5d5..d641dd8b8184 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -14,7 +14,7 @@
#include "ice_dcb_lib.h"
#include "ice_dcb_nl.h"
#include "devlink/devlink.h"
-#include "devlink/devlink_port.h"
+#include "devlink/port.h"
#include "ice_sf_eth.h"
#include "ice_hwmon.h"
/* Including ice_trace.h with CREATE_TRACE_POINTS defined will generate the
diff --git a/drivers/net/ethernet/intel/ice/ice_repr.c b/drivers/net/ethernet/intel/ice/ice_repr.c
index 970a99a52bf1..fb7a1b9a4313 100644
--- a/drivers/net/ethernet/intel/ice/ice_repr.c
+++ b/drivers/net/ethernet/intel/ice/ice_repr.c
@@ -4,7 +4,7 @@
#include "ice.h"
#include "ice_eswitch.h"
#include "devlink/devlink.h"
-#include "devlink/devlink_port.h"
+#include "devlink/port.h"
#include "ice_sriov.h"
#include "ice_tc_lib.h"
#include "ice_dcb_lib.h"
diff --git a/drivers/net/ethernet/intel/ice/ice_sf_eth.c b/drivers/net/ethernet/intel/ice/ice_sf_eth.c
index 75d7147e1c01..1a2c94375ca7 100644
--- a/drivers/net/ethernet/intel/ice/ice_sf_eth.c
+++ b/drivers/net/ethernet/intel/ice/ice_sf_eth.c
@@ -5,8 +5,8 @@
#include "ice_txrx.h"
#include "ice_fltr.h"
#include "ice_sf_eth.h"
-#include "devlink/devlink_port.h"
#include "devlink/devlink.h"
+#include "devlink/port.h"
static const struct net_device_ops ice_sf_netdev_ops = {
.ndo_open = ice_open,
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH net-next 4/7] ice: rename devlink_port.[ch] to port.[ch]
2024-12-11 22:32 ` [PATCH net-next 4/7] ice: rename devlink_port.[ch] to port.[ch] Tony Nguyen
@ 2024-12-12 6:08 ` Kalesh Anakkur Purayil
0 siblings, 0 replies; 15+ messages in thread
From: Kalesh Anakkur Purayil @ 2024-12-12 6:08 UTC (permalink / raw)
To: Tony Nguyen
Cc: davem, kuba, pabeni, edumazet, andrew+netdev, netdev,
Przemek Kitszel, wojciech.drewek, mateusz.polchlopek, joe, horms,
jiri, apw, lukas.bulwahn, dwaipayanray1
[-- Attachment #1: Type: text/plain, Size: 653 bytes --]
On Thu, Dec 12, 2024 at 4:07 AM Tony Nguyen <anthony.l.nguyen@intel.com> wrote:
>
> From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>
> Drop "devlink_" prefix from files that sit in devlink/.
> I'm going to add more files there, and repeating "devlink" does not feel
> good. This is also the scheme used in most other places, most notably the
> devlink core files are named like that.
>
> devlink.[ch] stays as is.
>
> Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
--
Regards,
Kalesh AP
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4239 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH net-next 5/7] ice: add Tx hang devlink health reporter
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
` (3 preceding siblings ...)
2024-12-11 22:32 ` [PATCH net-next 4/7] ice: rename devlink_port.[ch] to port.[ch] Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 6/7] ice: dump ethtool stats and skb by " Tony Nguyen
2024-12-11 22:32 ` [PATCH net-next 7/7] ice: Add MDD logging via devlink health Tony Nguyen
6 siblings, 0 replies; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Przemek Kitszel, anthony.l.nguyen, wojciech.drewek,
mateusz.polchlopek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1, Igor Bagnucki, Pucha Himasekhar Reddy
From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Add Tx hang devlink health reporter, see struct ice_tx_hang_event to see
what is reported.
Subsequent commits will extend it by more info, for now it dumps
descriptors with little metadata.
Reviewed-by: Igor Bagnucki <igor.bagnucki@intel.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Co-developed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/Makefile | 1 +
.../net/ethernet/intel/ice/devlink/health.c | 188 ++++++++++++++++++
.../net/ethernet/intel/ice/devlink/health.h | 48 +++++
drivers/net/ethernet/intel/ice/ice.h | 2 +
drivers/net/ethernet/intel/ice/ice_main.c | 18 +-
5 files changed, 252 insertions(+), 5 deletions(-)
create mode 100644 drivers/net/ethernet/intel/ice/devlink/health.c
create mode 100644 drivers/net/ethernet/intel/ice/devlink/health.h
diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile
index 56aa23aee472..9e0d9f710441 100644
--- a/drivers/net/ethernet/intel/ice/Makefile
+++ b/drivers/net/ethernet/intel/ice/Makefile
@@ -32,6 +32,7 @@ ice-y := ice_main.o \
ice_parser_rt.o \
ice_idc.o \
devlink/devlink.o \
+ devlink/health.o \
devlink/port.o \
ice_sf_eth.o \
ice_sf_vsi_vlan_ops.o \
diff --git a/drivers/net/ethernet/intel/ice/devlink/health.c b/drivers/net/ethernet/intel/ice/devlink/health.c
new file mode 100644
index 000000000000..b8c5a1c372dc
--- /dev/null
+++ b/drivers/net/ethernet/intel/ice/devlink/health.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2024, Intel Corporation. */
+
+#include "health.h"
+#include "ice.h"
+
+#define ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, obj, name) \
+ devlink_fmsg_put(fmsg, #name, (obj)->name)
+
+/**
+ * ice_devlink_health_report - boilerplate to call given @reporter
+ *
+ * @reporter: devlink health reporter to call, do nothing on NULL
+ * @msg: message to pass up, "event name" is fine
+ * @priv_ctx: typically some event struct
+ */
+static void ice_devlink_health_report(struct devlink_health_reporter *reporter,
+ const char *msg, void *priv_ctx)
+{
+ if (!reporter)
+ return;
+
+ /* We do not do auto recovering, so return value of the below function
+ * will always be 0, thus we do ignore it.
+ */
+ devlink_health_report(reporter, msg, priv_ctx);
+}
+
+/**
+ * ice_fmsg_put_ptr - put hex value of pointer into fmsg
+ *
+ * @fmsg: devlink fmsg under construction
+ * @name: name to pass
+ * @ptr: 64 bit value to print as hex and put into fmsg
+ */
+static void ice_fmsg_put_ptr(struct devlink_fmsg *fmsg, const char *name,
+ void *ptr)
+{
+ char buf[sizeof(ptr) * 3];
+
+ sprintf(buf, "%p", ptr);
+ devlink_fmsg_put(fmsg, name, buf);
+}
+
+struct ice_tx_hang_event {
+ u32 head;
+ u32 intr;
+ u16 vsi_num;
+ u16 queue;
+ u16 next_to_clean;
+ u16 next_to_use;
+ struct ice_tx_ring *tx_ring;
+};
+
+static int ice_tx_hang_reporter_dump(struct devlink_health_reporter *reporter,
+ struct devlink_fmsg *fmsg, void *priv_ctx,
+ struct netlink_ext_ack *extack)
+{
+ struct ice_tx_hang_event *event = priv_ctx;
+
+ if (!event)
+ return 0;
+
+ devlink_fmsg_obj_nest_start(fmsg);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, head);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, intr);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, vsi_num);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, queue);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, next_to_clean);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, next_to_use);
+ devlink_fmsg_put(fmsg, "irq-mapping", event->tx_ring->q_vector->name);
+ ice_fmsg_put_ptr(fmsg, "desc-ptr", event->tx_ring->desc);
+ ice_fmsg_put_ptr(fmsg, "dma-ptr", (void *)(long)event->tx_ring->dma);
+ devlink_fmsg_binary_pair_put(fmsg, "desc", event->tx_ring->desc,
+ event->tx_ring->count * sizeof(struct ice_tx_desc));
+ devlink_fmsg_obj_nest_end(fmsg);
+
+ return 0;
+}
+
+void ice_prep_tx_hang_report(struct ice_pf *pf, struct ice_tx_ring *tx_ring,
+ u16 vsi_num, u32 head, u32 intr)
+{
+ struct ice_health_tx_hang_buf *buf = &pf->health_reporters.tx_hang_buf;
+
+ buf->tx_ring = tx_ring;
+ buf->vsi_num = vsi_num;
+ buf->head = head;
+ buf->intr = intr;
+}
+
+void ice_report_tx_hang(struct ice_pf *pf)
+{
+ struct ice_health_tx_hang_buf *buf = &pf->health_reporters.tx_hang_buf;
+ struct ice_tx_ring *tx_ring = buf->tx_ring;
+
+ struct ice_tx_hang_event ev = {
+ .head = buf->head,
+ .intr = buf->intr,
+ .vsi_num = buf->vsi_num,
+ .queue = tx_ring->q_index,
+ .next_to_clean = tx_ring->next_to_clean,
+ .next_to_use = tx_ring->next_to_use,
+ .tx_ring = tx_ring,
+ };
+
+ ice_devlink_health_report(pf->health_reporters.tx_hang, "Tx hang", &ev);
+}
+
+static struct devlink_health_reporter *
+ice_init_devlink_rep(struct ice_pf *pf,
+ const struct devlink_health_reporter_ops *ops)
+{
+ struct devlink *devlink = priv_to_devlink(pf);
+ struct devlink_health_reporter *rep;
+ const u64 graceful_period = 0;
+
+ rep = devl_health_reporter_create(devlink, ops, graceful_period, pf);
+ if (IS_ERR(rep)) {
+ struct device *dev = ice_pf_to_dev(pf);
+
+ dev_err(dev, "failed to create devlink %s health report er",
+ ops->name);
+ return NULL;
+ }
+ return rep;
+}
+
+#define ICE_DEFINE_HEALTH_REPORTER_OPS(_name) \
+ static const struct devlink_health_reporter_ops ice_ ## _name ## _reporter_ops = { \
+ .name = #_name, \
+ .dump = ice_ ## _name ## _reporter_dump, \
+}
+
+ICE_DEFINE_HEALTH_REPORTER_OPS(tx_hang);
+
+/**
+ * ice_health_init - allocate and init all ice devlink health reporters and
+ * accompanied data
+ *
+ * @pf: PF struct
+ */
+void ice_health_init(struct ice_pf *pf)
+{
+ struct ice_health *reps = &pf->health_reporters;
+
+ reps->tx_hang = ice_init_devlink_rep(pf, &ice_tx_hang_reporter_ops);
+}
+
+/**
+ * ice_deinit_devl_reporter - destroy given devlink health reporter
+ * @reporter: reporter to destroy
+ */
+static void ice_deinit_devl_reporter(struct devlink_health_reporter *reporter)
+{
+ if (reporter)
+ devl_health_reporter_destroy(reporter);
+}
+
+/**
+ * ice_health_deinit - deallocate all ice devlink health reporters and
+ * accompanied data
+ *
+ * @pf: PF struct
+ */
+void ice_health_deinit(struct ice_pf *pf)
+{
+ ice_deinit_devl_reporter(pf->health_reporters.tx_hang);
+}
+
+static
+void ice_health_assign_healthy_state(struct devlink_health_reporter *reporter)
+{
+ if (reporter)
+ devlink_health_reporter_state_update(reporter,
+ DEVLINK_HEALTH_REPORTER_STATE_HEALTHY);
+}
+
+/**
+ * ice_health_clear - clear devlink health issues after a reset
+ * @pf: the PF device structure
+ *
+ * Mark the PF in healthy state again after a reset has completed.
+ */
+void ice_health_clear(struct ice_pf *pf)
+{
+ ice_health_assign_healthy_state(pf->health_reporters.tx_hang);
+}
diff --git a/drivers/net/ethernet/intel/ice/devlink/health.h b/drivers/net/ethernet/intel/ice/devlink/health.h
new file mode 100644
index 000000000000..92e40d790e72
--- /dev/null
+++ b/drivers/net/ethernet/intel/ice/devlink/health.h
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2024, Intel Corporation. */
+
+#ifndef _HEALTH_H_
+#define _HEALTH_H_
+
+#include <linux/types.h>
+
+/**
+ * DOC: health.h
+ *
+ * This header file stores everything that is needed for broadly understood
+ * devlink health mechanism for ice driver.
+ */
+
+struct ice_pf;
+struct ice_tx_ring;
+
+/**
+ * struct ice_health - stores ice devlink health reporters and accompanied data
+ * @tx_hang: devlink health reporter for tx_hang event
+ * @tx_hang_buf: pre-allocated place to put info for Tx hang reporter from
+ * non-sleeping context
+ * @tx_ring: ring that the hang occured on
+ * @head: descriptior head
+ * @intr: interrupt register value
+ * @vsi_num: VSI owning the queue that the hang occured on
+ */
+struct ice_health {
+ struct devlink_health_reporter *tx_hang;
+ struct_group_tagged(ice_health_tx_hang_buf, tx_hang_buf,
+ struct ice_tx_ring *tx_ring;
+ u32 head;
+ u32 intr;
+ u16 vsi_num;
+ );
+};
+
+
+void ice_health_init(struct ice_pf *pf);
+void ice_health_deinit(struct ice_pf *pf);
+void ice_health_clear(struct ice_pf *pf);
+
+void ice_prep_tx_hang_report(struct ice_pf *pf, struct ice_tx_ring *tx_ring,
+ u16 vsi_num, u32 head, u32 intr);
+void ice_report_tx_hang(struct ice_pf *pf);
+
+#endif /* _HEALTH_H_ */
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
index 2f5d6f974185..71e05d30f0fd 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -78,6 +78,7 @@
#include "ice_irq.h"
#include "ice_dpll.h"
#include "ice_adapter.h"
+#include "devlink/health.h"
#define ICE_BAR0 0
#define ICE_REQ_DESC_MULTIPLE 32
@@ -665,6 +666,7 @@ struct ice_pf {
struct ice_agg_node vf_agg_node[ICE_MAX_VF_AGG_NODES];
struct ice_dplls dplls;
struct device *hwmon_dev;
+ struct ice_health health_reporters;
u8 num_quanta_prof_used;
};
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index d641dd8b8184..316f5109bd3f 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -2364,9 +2364,11 @@ static void ice_service_task(struct work_struct *work)
struct ice_pf *pf = container_of(work, struct ice_pf, serv_task);
unsigned long start_time = jiffies;
- /* subtasks */
+ if (pf->health_reporters.tx_hang_buf.tx_ring) {
+ ice_report_tx_hang(pf);
+ pf->health_reporters.tx_hang_buf.tx_ring = NULL;
+ }
- /* process reset requests first */
ice_reset_subtask(pf);
/* bail if a reset/recovery cycle is pending or rebuild failed */
@@ -5087,6 +5089,7 @@ static int ice_init_devlink(struct ice_pf *pf)
return err;
ice_devlink_init_regions(pf);
+ ice_health_init(pf);
ice_devlink_register(pf);
return 0;
@@ -5095,6 +5098,7 @@ static int ice_init_devlink(struct ice_pf *pf)
static void ice_deinit_devlink(struct ice_pf *pf)
{
ice_devlink_unregister(pf);
+ ice_health_deinit(pf);
ice_devlink_destroy_regions(pf);
ice_devlink_unregister_params(pf);
}
@@ -7793,6 +7797,8 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
/* if we get here, reset flow is successful */
clear_bit(ICE_RESET_FAILED, pf->state);
+ ice_health_clear(pf);
+
ice_plug_aux_dev(pf);
if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG))
ice_lag_rebuild(pf);
@@ -8283,16 +8289,18 @@ void ice_tx_timeout(struct net_device *netdev, unsigned int txqueue)
if (tx_ring) {
struct ice_hw *hw = &pf->hw;
- u32 head, val = 0;
+ u32 head, intr = 0;
head = FIELD_GET(QTX_COMM_HEAD_HEAD_M,
rd32(hw, QTX_COMM_HEAD(vsi->txq_map[txqueue])));
/* Read interrupt register */
- val = rd32(hw, GLINT_DYN_CTL(tx_ring->q_vector->reg_idx));
+ intr = rd32(hw, GLINT_DYN_CTL(tx_ring->q_vector->reg_idx));
netdev_info(netdev, "tx_timeout: VSI_num: %d, Q %u, NTC: 0x%x, HW_HEAD: 0x%x, NTU: 0x%x, INT: 0x%x\n",
vsi->vsi_num, txqueue, tx_ring->next_to_clean,
- head, tx_ring->next_to_use, val);
+ head, tx_ring->next_to_use, intr);
+
+ ice_prep_tx_hang_report(pf, tx_ring, vsi->vsi_num, head, intr);
}
pf->tx_timeout_last_recovery = jiffies;
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH net-next 6/7] ice: dump ethtool stats and skb by Tx hang devlink health reporter
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
` (4 preceding siblings ...)
2024-12-11 22:32 ` [PATCH net-next 5/7] ice: add Tx hang devlink health reporter Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
2024-12-13 3:00 ` Jakub Kicinski
2024-12-11 22:32 ` [PATCH net-next 7/7] ice: Add MDD logging via devlink health Tony Nguyen
6 siblings, 1 reply; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Przemek Kitszel, anthony.l.nguyen, wojciech.drewek,
mateusz.polchlopek, joe, horms, jiri, apw, lukas.bulwahn,
dwaipayanray1, Igor Bagnucki, Pucha Himasekhar Reddy
From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Print the ethtool stats and skb diagnostic information as part of Tx hang
devlink health dump.
Move the declarations of ethtool functions that devlink health uses out
to a new file: ice_ethtool_common.h
To utilize our existing ethtool code in this context, convert it to
non-static.
Reviewed-by: Igor Bagnucki <igor.bagnucki@intel.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
.../net/ethernet/intel/ice/devlink/health.c | 36 +++++++++++++++++++
drivers/net/ethernet/intel/ice/ice_ethtool.c | 10 +++---
drivers/net/ethernet/intel/ice/ice_ethtool.h | 2 ++
.../ethernet/intel/ice/ice_ethtool_common.h | 19 ++++++++++
4 files changed, 62 insertions(+), 5 deletions(-)
create mode 100644 drivers/net/ethernet/intel/ice/ice_ethtool_common.h
diff --git a/drivers/net/ethernet/intel/ice/devlink/health.c b/drivers/net/ethernet/intel/ice/devlink/health.c
index b8c5a1c372dc..b0abb6d4e3e4 100644
--- a/drivers/net/ethernet/intel/ice/devlink/health.c
+++ b/drivers/net/ethernet/intel/ice/devlink/health.c
@@ -3,6 +3,7 @@
#include "health.h"
#include "ice.h"
+#include "ice_ethtool_common.h"
#define ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, obj, name) \
devlink_fmsg_put(fmsg, #name, (obj)->name)
@@ -26,6 +27,36 @@ static void ice_devlink_health_report(struct devlink_health_reporter *reporter,
devlink_health_report(reporter, msg, priv_ctx);
}
+static void ice_dump_ethtool_stats_to_fmsg(struct devlink_fmsg *fmsg,
+ struct net_device *netdev)
+{
+ const u32 string_set = ETH_SS_STATS;
+ u64 *stats;
+ u8 *names;
+ int scnt;
+
+ scnt = ice_get_sset_count(netdev, string_set);
+ devlink_fmsg_put(fmsg, "stats-cnt", (u32)scnt);
+ if (scnt <= 0)
+ return;
+
+ names = kcalloc(scnt, ETH_GSTRING_LEN, GFP_KERNEL);
+ stats = kcalloc(scnt, sizeof(*stats), GFP_KERNEL);
+ if (!names || !stats)
+ goto out;
+
+ ice_get_strings(netdev, string_set, names);
+ ice_get_ethtool_stats(netdev, NULL, stats);
+
+ devlink_fmsg_obj_nest_start(fmsg);
+ for (int i = 0; i < scnt; ++i)
+ devlink_fmsg_put(fmsg, &names[i * ETH_GSTRING_LEN], stats[i]);
+ devlink_fmsg_obj_nest_end(fmsg);
+out:
+ kfree(names);
+ kfree(stats);
+}
+
/**
* ice_fmsg_put_ptr - put hex value of pointer into fmsg
*
@@ -57,10 +88,12 @@ static int ice_tx_hang_reporter_dump(struct devlink_health_reporter *reporter,
struct netlink_ext_ack *extack)
{
struct ice_tx_hang_event *event = priv_ctx;
+ struct sk_buff *skb;
if (!event)
return 0;
+ skb = event->tx_ring->tx_buf->skb;
devlink_fmsg_obj_nest_start(fmsg);
ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, head);
ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, event, intr);
@@ -71,8 +104,11 @@ static int ice_tx_hang_reporter_dump(struct devlink_health_reporter *reporter,
devlink_fmsg_put(fmsg, "irq-mapping", event->tx_ring->q_vector->name);
ice_fmsg_put_ptr(fmsg, "desc-ptr", event->tx_ring->desc);
ice_fmsg_put_ptr(fmsg, "dma-ptr", (void *)(long)event->tx_ring->dma);
+ ice_fmsg_put_ptr(fmsg, "skb-ptr", skb);
devlink_fmsg_binary_pair_put(fmsg, "desc", event->tx_ring->desc,
event->tx_ring->count * sizeof(struct ice_tx_desc));
+ devlink_fmsg_dump_skb(fmsg, skb);
+ ice_dump_ethtool_stats_to_fmsg(fmsg, event->tx_ring->vsi->netdev);
devlink_fmsg_obj_nest_end(fmsg);
return 0;
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index 3072634bf049..b552439fc1f9 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -1507,7 +1507,7 @@ __ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data,
}
}
-static void ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
+void ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
{
struct ice_netdev_priv *np = netdev_priv(netdev);
@@ -1887,7 +1887,7 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
return ret;
}
-static int ice_get_sset_count(struct net_device *netdev, int sset)
+int ice_get_sset_count(struct net_device *netdev, int sset)
{
switch (sset) {
case ETH_SS_STATS:
@@ -1990,9 +1990,9 @@ __ice_get_ethtool_stats(struct net_device *netdev,
}
}
-static void
-ice_get_ethtool_stats(struct net_device *netdev,
- struct ethtool_stats __always_unused *stats, u64 *data)
+void ice_get_ethtool_stats(struct net_device *netdev,
+ struct ethtool_stats __always_unused *stats,
+ u64 *data)
{
struct ice_netdev_priv *np = netdev_priv(netdev);
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.h b/drivers/net/ethernet/intel/ice/ice_ethtool.h
index 8f2ad1c172c0..a1a34440557d 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.h
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.h
@@ -4,6 +4,8 @@
#ifndef _ICE_ETHTOOL_H_
#define _ICE_ETHTOOL_H_
+#include "ice_ethtool_common.h"
+
struct ice_phy_type_to_ethtool {
u64 aq_link_speed;
u8 link_mode;
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool_common.h b/drivers/net/ethernet/intel/ice/ice_ethtool_common.h
new file mode 100644
index 000000000000..0c772056f006
--- /dev/null
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool_common.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2024, Intel Corporation. */
+
+#ifndef _ICE_ETHTOOL_COMMON_H_
+#define _ICE_ETHTOOL_COMMON_H_
+
+/**
+ * DOC: ice_ethtool_common.h
+ *
+ * This header is for ethtool related code that is reused in other places.
+ */
+
+void ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data);
+int ice_get_sset_count(struct net_device *netdev, int sset);
+void ice_get_ethtool_stats(struct net_device *netdev,
+ struct ethtool_stats __always_unused *stats,
+ u64 *data);
+
+#endif /* _ICE_ETHTOOL_COMMON_H_ */
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH net-next 6/7] ice: dump ethtool stats and skb by Tx hang devlink health reporter
2024-12-11 22:32 ` [PATCH net-next 6/7] ice: dump ethtool stats and skb by " Tony Nguyen
@ 2024-12-13 3:00 ` Jakub Kicinski
2024-12-16 4:53 ` Przemek Kitszel
0 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2024-12-13 3:00 UTC (permalink / raw)
To: Tony Nguyen
Cc: davem, pabeni, edumazet, andrew+netdev, netdev, Przemek Kitszel,
wojciech.drewek, mateusz.polchlopek, joe, horms, jiri, apw,
lukas.bulwahn, dwaipayanray1, Igor Bagnucki,
Pucha Himasekhar Reddy
On Wed, 11 Dec 2024 14:32:14 -0800 Tony Nguyen wrote:
> From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>
> Print the ethtool stats and skb diagnostic information as part of Tx hang
> devlink health dump.
>
> Move the declarations of ethtool functions that devlink health uses out
> to a new file: ice_ethtool_common.h
>
> To utilize our existing ethtool code in this context, convert it to
> non-static.
This is going too far, user space is fully capable of capturing this
data. It gets a netlink notification when health reporter flips to
a bad state. I think Jiri worked on a daemon what could capture more
data from user space ? I may be misremembering...
--
pw-bot: cr
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 6/7] ice: dump ethtool stats and skb by Tx hang devlink health reporter
2024-12-13 3:00 ` Jakub Kicinski
@ 2024-12-16 4:53 ` Przemek Kitszel
2024-12-16 12:58 ` Przemek Kitszel
2025-02-11 14:10 ` Jiri Pirko
0 siblings, 2 replies; 15+ messages in thread
From: Przemek Kitszel @ 2024-12-16 4:53 UTC (permalink / raw)
To: Jakub Kicinski, Tony Nguyen, jiri, Knitter, Konrad
Cc: davem, pabeni, edumazet, andrew+netdev, netdev, wojciech.drewek,
mateusz.polchlopek, joe, horms, apw, lukas.bulwahn, dwaipayanray1,
Igor Bagnucki, Pucha Himasekhar Reddy
On 12/13/24 04:00, Jakub Kicinski wrote:
> On Wed, 11 Dec 2024 14:32:14 -0800 Tony Nguyen wrote:
>> From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>>
>> Print the ethtool stats and skb diagnostic information as part of Tx hang
>> devlink health dump.
>>
>> Move the declarations of ethtool functions that devlink health uses out
>> to a new file: ice_ethtool_common.h
>>
>> To utilize our existing ethtool code in this context, convert it to
>> non-static.
>
> This is going too far, user space is fully capable of capturing this
> data. It gets a netlink notification when health reporter flips to
> a bad state.
It really pays to split your patches into trivial vs controversial ones.
Will it be fine to merge this series without patch 6 (and 3) then?
Patches 2, 4 and 5 are dependency for another health reporters that
Konrad did:
https://lore.kernel.org/intel-wired-lan/20241211110357.196167-1-konrad.knitter@intel.com
>I think Jiri worked on a daemon what could capture more
> data from user space ? I may be misremembering...
We would love to read more on that, then with more knowledge revisit
what to do about our needs covered by this patch.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 6/7] ice: dump ethtool stats and skb by Tx hang devlink health reporter
2024-12-16 4:53 ` Przemek Kitszel
@ 2024-12-16 12:58 ` Przemek Kitszel
2025-02-11 14:10 ` Jiri Pirko
1 sibling, 0 replies; 15+ messages in thread
From: Przemek Kitszel @ 2024-12-16 12:58 UTC (permalink / raw)
To: Jakub Kicinski, Tony Nguyen, jiri
Cc: davem, pabeni, edumazet, andrew+netdev, Knitter, Konrad, netdev,
mateusz.polchlopek, joe, horms, apw, lukas.bulwahn, dwaipayanray1,
Igor Bagnucki, Pucha Himasekhar Reddy
On 12/16/24 05:53, Przemek Kitszel wrote:
> On 12/13/24 04:00, Jakub Kicinski wrote:
>> On Wed, 11 Dec 2024 14:32:14 -0800 Tony Nguyen wrote:
>>> From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>>>
>>> Print the ethtool stats and skb diagnostic information as part of Tx
>>> hang
>>> devlink health dump.
>>>
>>> Move the declarations of ethtool functions that devlink health uses out
>>> to a new file: ice_ethtool_common.h
>>>
>>> To utilize our existing ethtool code in this context, convert it to
>>> non-static.
>>
>> This is going too far, user space is fully capable of capturing this
>> data. It gets a netlink notification when health reporter flips to
>> a bad state.
>
> It really pays to split your patches into trivial vs controversial ones.
not so trivial for git anyway...
>
> Will it be fine to merge this series without patch 6 (and 3) then?
we will have to resend, so I will remove just ethtool stats part for now
sorry for the noise
> Patches 2, 4 and 5 are dependency for another health reporters that
> Konrad did:
> https://lore.kernel.org/intel-wired-lan/20241211110357.196167-1-
> konrad.knitter@intel.com
>
>> I think Jiri worked on a daemon what could capture more
>> data from user space ? I may be misremembering...
>
> We would love to read more on that, then with more knowledge revisit
> what to do about our needs covered by this patch.
still interested ofc
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 6/7] ice: dump ethtool stats and skb by Tx hang devlink health reporter
2024-12-16 4:53 ` Przemek Kitszel
2024-12-16 12:58 ` Przemek Kitszel
@ 2025-02-11 14:10 ` Jiri Pirko
1 sibling, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2025-02-11 14:10 UTC (permalink / raw)
To: Przemek Kitszel
Cc: Jakub Kicinski, Tony Nguyen, Knitter, Konrad, davem, pabeni,
edumazet, andrew+netdev, netdev, wojciech.drewek,
mateusz.polchlopek, joe, horms, apw, lukas.bulwahn, dwaipayanray1,
Igor Bagnucki, Pucha Himasekhar Reddy
Mon, Dec 16, 2024 at 05:53:03AM +0100, przemyslaw.kitszel@intel.com wrote:
>On 12/13/24 04:00, Jakub Kicinski wrote:
>> On Wed, 11 Dec 2024 14:32:14 -0800 Tony Nguyen wrote:
>> > From: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>> >
>> > Print the ethtool stats and skb diagnostic information as part of Tx hang
>> > devlink health dump.
>> >
>> > Move the declarations of ethtool functions that devlink health uses out
>> > to a new file: ice_ethtool_common.h
>> >
>> > To utilize our existing ethtool code in this context, convert it to
>> > non-static.
>>
>> This is going too far, user space is fully capable of capturing this
>> data. It gets a netlink notification when health reporter flips to
>> a bad state.
>
>It really pays to split your patches into trivial vs controversial ones.
>
>Will it be fine to merge this series without patch 6 (and 3) then?
>Patches 2, 4 and 5 are dependency for another health reporters that
>Konrad did:
>https://lore.kernel.org/intel-wired-lan/20241211110357.196167-1-konrad.knitter@intel.com
>
>> I think Jiri worked on a daemon what could capture more
>> data from user space ? I may be misremembering...
>
>We would love to read more on that, then with more knowledge revisit
>what to do about our needs covered by this patch.
I will keep you in loop. Working on devlinkd as a part of systemd. Will
cc you for the initial rfc.
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH net-next 7/7] ice: Add MDD logging via devlink health
2024-12-11 22:32 [PATCH net-next 0/7][pull request] ice: add support for devlink health events Tony Nguyen
` (5 preceding siblings ...)
2024-12-11 22:32 ` [PATCH net-next 6/7] ice: dump ethtool stats and skb by " Tony Nguyen
@ 2024-12-11 22:32 ` Tony Nguyen
6 siblings, 0 replies; 15+ messages in thread
From: Tony Nguyen @ 2024-12-11 22:32 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, netdev
Cc: Ben Shelton, anthony.l.nguyen, przemyslaw.kitszel,
wojciech.drewek, mateusz.polchlopek, joe, horms, jiri, apw,
lukas.bulwahn, dwaipayanray1, Igor Bagnucki,
Pucha Himasekhar Reddy
From: Ben Shelton <benjamin.h.shelton@intel.com>
Add a devlink health reporter for MDD events. The 'dump' handler will
return the information captured in each call to ice_handle_mdd_event().
A device reset (CORER/PFR) will put the reporter back in healthy state.
Signed-off-by: Ben Shelton <benjamin.h.shelton@intel.com>
Reviewed-by: Igor Bagnucki <igor.bagnucki@intel.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Co-developed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
.../net/ethernet/intel/ice/devlink/health.c | 77 +++++++++++++++++++
.../net/ethernet/intel/ice/devlink/health.h | 11 +++
drivers/net/ethernet/intel/ice/ice_main.c | 6 ++
3 files changed, 94 insertions(+)
diff --git a/drivers/net/ethernet/intel/ice/devlink/health.c b/drivers/net/ethernet/intel/ice/devlink/health.c
index b0abb6d4e3e4..d9b852ccf99e 100644
--- a/drivers/net/ethernet/intel/ice/devlink/health.c
+++ b/drivers/net/ethernet/intel/ice/devlink/health.c
@@ -27,6 +27,79 @@ static void ice_devlink_health_report(struct devlink_health_reporter *reporter,
devlink_health_report(reporter, msg, priv_ctx);
}
+struct ice_mdd_event {
+ enum ice_mdd_src src;
+ u16 vf_num;
+ u16 queue;
+ u8 pf_num;
+ u8 event;
+};
+
+static const char *ice_mdd_src_to_str(enum ice_mdd_src src)
+{
+ switch (src) {
+ case ICE_MDD_SRC_TX_PQM:
+ return "tx_pqm";
+ case ICE_MDD_SRC_TX_TCLAN:
+ return "tx_tclan";
+ case ICE_MDD_SRC_TX_TDPU:
+ return "tx_tdpu";
+ case ICE_MDD_SRC_RX:
+ return "rx";
+ default:
+ return "invalid";
+ }
+}
+
+static int
+ice_mdd_reporter_dump(struct devlink_health_reporter *reporter,
+ struct devlink_fmsg *fmsg, void *priv_ctx,
+ struct netlink_ext_ack *extack)
+{
+ struct ice_mdd_event *mdd_event = priv_ctx;
+ const char *src;
+
+ if (!mdd_event)
+ return 0;
+
+ src = ice_mdd_src_to_str(mdd_event->src);
+
+ devlink_fmsg_obj_nest_start(fmsg);
+ devlink_fmsg_put(fmsg, "src", src);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, mdd_event, pf_num);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, mdd_event, vf_num);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, mdd_event, event);
+ ICE_DEVLINK_FMSG_PUT_FIELD(fmsg, mdd_event, queue);
+ devlink_fmsg_obj_nest_end(fmsg);
+
+ return 0;
+}
+
+/**
+ * ice_report_mdd_event - Report an MDD event through devlink health
+ * @pf: the PF device structure
+ * @src: the HW block that was the source of this MDD event
+ * @pf_num: the pf_num on which the MDD event occurred
+ * @vf_num: the vf_num on which the MDD event occurred
+ * @event: the event type of the MDD event
+ * @queue: the queue on which the MDD event occurred
+ *
+ * Report an MDD event that has occurred on this PF.
+ */
+void ice_report_mdd_event(struct ice_pf *pf, enum ice_mdd_src src, u8 pf_num,
+ u16 vf_num, u8 event, u16 queue)
+{
+ struct ice_mdd_event ev = {
+ .src = src,
+ .pf_num = pf_num,
+ .vf_num = vf_num,
+ .event = event,
+ .queue = queue,
+ };
+
+ ice_devlink_health_report(pf->health_reporters.mdd, "MDD event", &ev);
+}
+
static void ice_dump_ethtool_stats_to_fmsg(struct devlink_fmsg *fmsg,
struct net_device *netdev)
{
@@ -168,6 +241,7 @@ ice_init_devlink_rep(struct ice_pf *pf,
.dump = ice_ ## _name ## _reporter_dump, \
}
+ICE_DEFINE_HEALTH_REPORTER_OPS(mdd);
ICE_DEFINE_HEALTH_REPORTER_OPS(tx_hang);
/**
@@ -180,6 +254,7 @@ void ice_health_init(struct ice_pf *pf)
{
struct ice_health *reps = &pf->health_reporters;
+ reps->mdd = ice_init_devlink_rep(pf, &ice_mdd_reporter_ops);
reps->tx_hang = ice_init_devlink_rep(pf, &ice_tx_hang_reporter_ops);
}
@@ -201,6 +276,7 @@ static void ice_deinit_devl_reporter(struct devlink_health_reporter *reporter)
*/
void ice_health_deinit(struct ice_pf *pf)
{
+ ice_deinit_devl_reporter(pf->health_reporters.mdd);
ice_deinit_devl_reporter(pf->health_reporters.tx_hang);
}
@@ -220,5 +296,6 @@ void ice_health_assign_healthy_state(struct devlink_health_reporter *reporter)
*/
void ice_health_clear(struct ice_pf *pf)
{
+ ice_health_assign_healthy_state(pf->health_reporters.mdd);
ice_health_assign_healthy_state(pf->health_reporters.tx_hang);
}
diff --git a/drivers/net/ethernet/intel/ice/devlink/health.h b/drivers/net/ethernet/intel/ice/devlink/health.h
index 92e40d790e72..a08c7bd174cf 100644
--- a/drivers/net/ethernet/intel/ice/devlink/health.h
+++ b/drivers/net/ethernet/intel/ice/devlink/health.h
@@ -16,9 +16,17 @@
struct ice_pf;
struct ice_tx_ring;
+enum ice_mdd_src {
+ ICE_MDD_SRC_TX_PQM,
+ ICE_MDD_SRC_TX_TCLAN,
+ ICE_MDD_SRC_TX_TDPU,
+ ICE_MDD_SRC_RX,
+};
+
/**
* struct ice_health - stores ice devlink health reporters and accompanied data
* @tx_hang: devlink health reporter for tx_hang event
+ * @mdd: devlink health reporter for MDD detection event
* @tx_hang_buf: pre-allocated place to put info for Tx hang reporter from
* non-sleeping context
* @tx_ring: ring that the hang occured on
@@ -27,6 +35,7 @@ struct ice_tx_ring;
* @vsi_num: VSI owning the queue that the hang occured on
*/
struct ice_health {
+ struct devlink_health_reporter *mdd;
struct devlink_health_reporter *tx_hang;
struct_group_tagged(ice_health_tx_hang_buf, tx_hang_buf,
struct ice_tx_ring *tx_ring;
@@ -43,6 +52,8 @@ void ice_health_clear(struct ice_pf *pf);
void ice_prep_tx_hang_report(struct ice_pf *pf, struct ice_tx_ring *tx_ring,
u16 vsi_num, u32 head, u32 intr);
+void ice_report_mdd_event(struct ice_pf *pf, enum ice_mdd_src src, u8 pf_num,
+ u16 vf_num, u8 event, u16 queue);
void ice_report_tx_hang(struct ice_pf *pf);
#endif /* _HEALTH_H_ */
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 316f5109bd3f..1701f7143f24 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -1816,6 +1816,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
if (netif_msg_tx_err(pf))
dev_info(dev, "Malicious Driver Detection event %d on TX queue %d PF# %d VF# %d\n",
event, queue, pf_num, vf_num);
+ ice_report_mdd_event(pf, ICE_MDD_SRC_TX_PQM, pf_num, vf_num,
+ event, queue);
wr32(hw, GL_MDET_TX_PQM, 0xffffffff);
}
@@ -1829,6 +1831,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
if (netif_msg_tx_err(pf))
dev_info(dev, "Malicious Driver Detection event %d on TX queue %d PF# %d VF# %d\n",
event, queue, pf_num, vf_num);
+ ice_report_mdd_event(pf, ICE_MDD_SRC_TX_TCLAN, pf_num, vf_num,
+ event, queue);
wr32(hw, GL_MDET_TX_TCLAN_BY_MAC(hw), U32_MAX);
}
@@ -1842,6 +1846,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
if (netif_msg_rx_err(pf))
dev_info(dev, "Malicious Driver Detection event %d on RX queue %d PF# %d VF# %d\n",
event, queue, pf_num, vf_num);
+ ice_report_mdd_event(pf, ICE_MDD_SRC_RX, pf_num, vf_num, event,
+ queue);
wr32(hw, GL_MDET_RX, 0xffffffff);
}
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread