From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Jakub Kicinski <kuba@kernel.org>
Cc: Andrew Lunn <andrew@lunn.ch>,
Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
Tariq Toukan <tariqt@nvidia.com>, Gal Pressman <gal@nvidia.com>,
intel-wired-lan@lists.osuosl.org,
Donald Hunter <donald.hunter@gmail.com>,
Carolina Jubran <cjubran@nvidia.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org
Subject: Re: [Intel-wired-lan] [PATCH net-next v3 1/4] ethtool: add FEC bins histogram report
Date: Thu, 18 Sep 2025 11:53:53 +0100 [thread overview]
Message-ID: <3091c796-acad-4c87-9782-3b67210147c2@linux.dev> (raw)
In-Reply-To: <20250917174148.0c909f92@kernel.org>
On 18/09/2025 01:41, Jakub Kicinski wrote:
> On Tue, 16 Sep 2025 19:12:54 +0000 Vadim Fedorenko wrote:
>> IEEE 802.3ck-2022 defines counters for FEC bins and 802.3df-2024
>> clarifies it a bit further. Implement reporting interface through as
>> addition to FEC stats available in ethtool.
>> diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
>> index 7a7594713f1f..de5008266884 100644
>> --- a/Documentation/netlink/specs/ethtool.yaml
>> +++ b/Documentation/netlink/specs/ethtool.yaml
>> @@ -1219,6 +1219,23 @@ attribute-sets:
>> name: udp-ports
>> type: nest
>> nested-attributes: tunnel-udp
>> + -
>> + name: fec-hist
>> + attr-cnt-name: __ethtool-a-fec-hist-cnt
>
> s/__/--/
That will bring strong inconsistency in schema. All other attributes
have counter attribute with __ in the beginning:
name: fec-stat
attr-cnt-name: __ethtool-a-fec-stat-cnt
name: stats-grp
attr-cnt-name: __ethtool-a-stats-grp-cnt
name: stats
attr-cnt-name: __ethtool-a-stats-cnt
>
>> + attributes:
>> + -
>> + name: bin-low
>> + type: u32
>> + -
>> + name: bin-high
>> + type: u32
>
> We should add some doc: strings here so that the important info like
> which one is inclusive is rendered right in the API reference
Yep, will add some doc
>
>> + -
>> + name: bin-val
>> + type: uint
>> + -
>> + name: bin-val-per-lane
>> + type: binary
>
> probably good to doc this too
ack
>
>> + sub-type: u64
>> -
>> name: fec-stat
>> attr-cnt-name: __ethtool-a-fec-stat-cnt
>> @@ -1242,6 +1259,11 @@ attribute-sets:
>> name: corr-bits
>> type: binary
>> sub-type: u64
>> + -
>> + name: hist
>> + type: nest
>> + multi-attr: True
>> + nested-attributes: fec-hist
>> -
>> name: fec
>> attr-cnt-name: __ethtool-a-fec-cnt
>> diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst
>> index ab20c644af24..b270886c5f5d 100644
>> --- a/Documentation/networking/ethtool-netlink.rst
>> +++ b/Documentation/networking/ethtool-netlink.rst
>> @@ -1541,6 +1541,11 @@ Drivers fill in the statistics in the following structure:
>> .. kernel-doc:: include/linux/ethtool.h
>> :identifiers: ethtool_fec_stats
>>
>> +Statistics may have FEC bins histogram attribute ``ETHTOOL_A_FEC_STAT_HIST``
>> +as defined in IEEE 802.3ck-2022 and 802.3df-2024. Nested attributes will have
>> +the range of FEC errors in the bin (inclusive) and the amount of error events
>> +in the bin.
>
> Does this sound better?
>
> Optional ``ETHTOOL_A_FEC_STAT_HIST`` attributes form a FEC error
> histogram, as defined in IEEE 802.3ck-2022 and 802.3df-2024
> (histogram of number of errors within a single FEC block).
> Each ``ETHTOOL_A_FEC_STAT_HIST`` entry contains error count
> (optionally also broken down by SerDes lane) as well as metadata
> about the bin. Bin range (low, high) is inclusive.
Ack
>
>> static void
>> -nsim_get_fec_stats(struct net_device *dev, struct ethtool_fec_stats *fec_stats)
>> +nsim_get_fec_stats(struct net_device *dev, struct ethtool_fec_stats *fec_stats,
>> + struct ethtool_fec_hist *hist)
>> {
>> + struct ethtool_fec_hist_value *values = hist->values;
>> +
>> + hist->ranges = netdevsim_fec_ranges;
>> +
>> fec_stats->corrected_blocks.total = 123;
>> fec_stats->uncorrectable_blocks.total = 4;
>> +
>> + values[0].bin_value = 445;
>
> Bin 0 had per lane breakdown, can't core add up the lanes for the
> driver?
Like it's done for blocks counter? Should we force drivers to keep 'sum'
value equal to ETHTOOL_STAT_NOT_SET when they provide per-lane values?
>
>> + values[1].bin_value = 12;
>> + values[2].bin_value = 2;
>> + values[0].bin_value_per_lane[0] = 125;
>> + values[0].bin_value_per_lane[1] = 120;
>> + values[0].bin_value_per_lane[2] = 100;
>> + values[0].bin_value_per_lane[3] = 100;
>> }
>
>> +/**
>> + * struct ethtool_fec_hist_range - error bits range for FEC bins histogram
>
> Don't say "FEC bin histogram" I think the word histogram implies that
> the data is bin'ed up.
Ack
>
>> + * statistics
>> + * @low: low bound of the bin (inclusive)
>> + * @high: high bound of the bin (inclusive)
>> + */
>
>> @@ -113,7 +114,11 @@ static int fec_prepare_data(const struct ethnl_req_info *req_base,
>> struct ethtool_fec_stats stats;
>>
>> ethtool_stats_init((u64 *)&stats, sizeof(stats) / 8);
>> - dev->ethtool_ops->get_fec_stats(dev, &stats);
>> + ethtool_stats_init((u64 *)data->fec_stat_hist.values,
>> + ETHTOOL_FEC_HIST_MAX *
>> + sizeof(struct ethtool_fec_hist_value) / 8);
>
> sizeof(data->fec_stat_hist.values) / 8
>
> would save you the multiplication?
yeah...
>
>> + dev->ethtool_ops->get_fec_stats(dev, &stats,
>> + &data->fec_stat_hist);
>>
>> fec_stats_recalc(&data->corr, &stats.corrected_blocks);
>> fec_stats_recalc(&data->uncorr, &stats.uncorrectable_blocks);
>
>> +static int fec_put_hist(struct sk_buff *skb, const struct ethtool_fec_hist *hist)
>
> over 80 chars, please wrap (checkpatch --max-line-length=80)
ouch, that's proper strict check! :)
>
>> +{
>> + const struct ethtool_fec_hist_range *ranges = hist->ranges;
>> + const struct ethtool_fec_hist_value *values = hist->values;
>> + struct nlattr *nest;
>> + int i, j;
>> +
>> + if (!ranges)
>> + return 0;
>> +
>> + for (i = 0; i < ETHTOOL_FEC_HIST_MAX; i++) {
>> + if (i && !ranges[i].low && !ranges[i].high)
>
> low and high should probably be unsigned now
ack
>
>> + break;
>> +
>> + if (WARN_ON_ONCE(values[i].bin_value == ETHTOOL_STAT_NOT_SET))
>> + break;
>> +
>> + nest = nla_nest_start(skb, ETHTOOL_A_FEC_STAT_HIST);
>> + if (!nest)
>> + return -EMSGSIZE;
>> +
>> + if (nla_put_u32(skb, ETHTOOL_A_FEC_HIST_BIN_LOW,
>> + ranges[i].low) ||
>> + nla_put_u32(skb, ETHTOOL_A_FEC_HIST_BIN_HIGH,
>> + ranges[i].high) ||
>> + nla_put_uint(skb, ETHTOOL_A_FEC_HIST_BIN_VAL,
>> + values[i].bin_value))
>> + goto err_cancel_hist;
>> + for (j = 0; j < ETHTOOL_MAX_LANES; j++) {
>> + if (values[i].bin_value_per_lane[j] == ETHTOOL_STAT_NOT_SET)
>
> You know, bin_value could be 'sum', and bin_value_per_lane could be
> simply 'per_lane'.
SG, I'll change it
>
>> + break;
>> + }
>
> {} brackets unnecessary
>
>> + if (j && nla_put_64bit(skb, ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE,
>> + sizeof(u64) * j,
>> + values[i].bin_value_per_lane,
>> + ETHTOOL_A_FEC_STAT_PAD))
>> + goto err_cancel_hist;
>> +
>> + nla_nest_end(skb, nest);
>> + }
>> +
>> + return 0;
>> +
>> +err_cancel_hist:
>> + nla_nest_cancel(skb, nest);
>> + return -EMSGSIZE;
>> +}
>
> We need a selftest. Add a case to stats.py and do basic sanity checking
> on what the kernel spits out? Maybe 2 test cases - one for overall and
> one for per-lane, cause mlx5 doesn't have per lane and we'd like the
> test to pass there.
Yeah, sure, I'll add them as another patch to this series
WARNING: multiple messages have this Message-ID (diff)
From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Jakub Kicinski <kuba@kernel.org>
Cc: Andrew Lunn <andrew@lunn.ch>,
Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
Tariq Toukan <tariqt@nvidia.com>, Gal Pressman <gal@nvidia.com>,
intel-wired-lan@lists.osuosl.org,
Donald Hunter <donald.hunter@gmail.com>,
Carolina Jubran <cjubran@nvidia.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org
Subject: Re: [PATCH net-next v3 1/4] ethtool: add FEC bins histogram report
Date: Thu, 18 Sep 2025 11:53:53 +0100 [thread overview]
Message-ID: <3091c796-acad-4c87-9782-3b67210147c2@linux.dev> (raw)
In-Reply-To: <20250917174148.0c909f92@kernel.org>
On 18/09/2025 01:41, Jakub Kicinski wrote:
> On Tue, 16 Sep 2025 19:12:54 +0000 Vadim Fedorenko wrote:
>> IEEE 802.3ck-2022 defines counters for FEC bins and 802.3df-2024
>> clarifies it a bit further. Implement reporting interface through as
>> addition to FEC stats available in ethtool.
>> diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
>> index 7a7594713f1f..de5008266884 100644
>> --- a/Documentation/netlink/specs/ethtool.yaml
>> +++ b/Documentation/netlink/specs/ethtool.yaml
>> @@ -1219,6 +1219,23 @@ attribute-sets:
>> name: udp-ports
>> type: nest
>> nested-attributes: tunnel-udp
>> + -
>> + name: fec-hist
>> + attr-cnt-name: __ethtool-a-fec-hist-cnt
>
> s/__/--/
That will bring strong inconsistency in schema. All other attributes
have counter attribute with __ in the beginning:
name: fec-stat
attr-cnt-name: __ethtool-a-fec-stat-cnt
name: stats-grp
attr-cnt-name: __ethtool-a-stats-grp-cnt
name: stats
attr-cnt-name: __ethtool-a-stats-cnt
>
>> + attributes:
>> + -
>> + name: bin-low
>> + type: u32
>> + -
>> + name: bin-high
>> + type: u32
>
> We should add some doc: strings here so that the important info like
> which one is inclusive is rendered right in the API reference
Yep, will add some doc
>
>> + -
>> + name: bin-val
>> + type: uint
>> + -
>> + name: bin-val-per-lane
>> + type: binary
>
> probably good to doc this too
ack
>
>> + sub-type: u64
>> -
>> name: fec-stat
>> attr-cnt-name: __ethtool-a-fec-stat-cnt
>> @@ -1242,6 +1259,11 @@ attribute-sets:
>> name: corr-bits
>> type: binary
>> sub-type: u64
>> + -
>> + name: hist
>> + type: nest
>> + multi-attr: True
>> + nested-attributes: fec-hist
>> -
>> name: fec
>> attr-cnt-name: __ethtool-a-fec-cnt
>> diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst
>> index ab20c644af24..b270886c5f5d 100644
>> --- a/Documentation/networking/ethtool-netlink.rst
>> +++ b/Documentation/networking/ethtool-netlink.rst
>> @@ -1541,6 +1541,11 @@ Drivers fill in the statistics in the following structure:
>> .. kernel-doc:: include/linux/ethtool.h
>> :identifiers: ethtool_fec_stats
>>
>> +Statistics may have FEC bins histogram attribute ``ETHTOOL_A_FEC_STAT_HIST``
>> +as defined in IEEE 802.3ck-2022 and 802.3df-2024. Nested attributes will have
>> +the range of FEC errors in the bin (inclusive) and the amount of error events
>> +in the bin.
>
> Does this sound better?
>
> Optional ``ETHTOOL_A_FEC_STAT_HIST`` attributes form a FEC error
> histogram, as defined in IEEE 802.3ck-2022 and 802.3df-2024
> (histogram of number of errors within a single FEC block).
> Each ``ETHTOOL_A_FEC_STAT_HIST`` entry contains error count
> (optionally also broken down by SerDes lane) as well as metadata
> about the bin. Bin range (low, high) is inclusive.
Ack
>
>> static void
>> -nsim_get_fec_stats(struct net_device *dev, struct ethtool_fec_stats *fec_stats)
>> +nsim_get_fec_stats(struct net_device *dev, struct ethtool_fec_stats *fec_stats,
>> + struct ethtool_fec_hist *hist)
>> {
>> + struct ethtool_fec_hist_value *values = hist->values;
>> +
>> + hist->ranges = netdevsim_fec_ranges;
>> +
>> fec_stats->corrected_blocks.total = 123;
>> fec_stats->uncorrectable_blocks.total = 4;
>> +
>> + values[0].bin_value = 445;
>
> Bin 0 had per lane breakdown, can't core add up the lanes for the
> driver?
Like it's done for blocks counter? Should we force drivers to keep 'sum'
value equal to ETHTOOL_STAT_NOT_SET when they provide per-lane values?
>
>> + values[1].bin_value = 12;
>> + values[2].bin_value = 2;
>> + values[0].bin_value_per_lane[0] = 125;
>> + values[0].bin_value_per_lane[1] = 120;
>> + values[0].bin_value_per_lane[2] = 100;
>> + values[0].bin_value_per_lane[3] = 100;
>> }
>
>> +/**
>> + * struct ethtool_fec_hist_range - error bits range for FEC bins histogram
>
> Don't say "FEC bin histogram" I think the word histogram implies that
> the data is bin'ed up.
Ack
>
>> + * statistics
>> + * @low: low bound of the bin (inclusive)
>> + * @high: high bound of the bin (inclusive)
>> + */
>
>> @@ -113,7 +114,11 @@ static int fec_prepare_data(const struct ethnl_req_info *req_base,
>> struct ethtool_fec_stats stats;
>>
>> ethtool_stats_init((u64 *)&stats, sizeof(stats) / 8);
>> - dev->ethtool_ops->get_fec_stats(dev, &stats);
>> + ethtool_stats_init((u64 *)data->fec_stat_hist.values,
>> + ETHTOOL_FEC_HIST_MAX *
>> + sizeof(struct ethtool_fec_hist_value) / 8);
>
> sizeof(data->fec_stat_hist.values) / 8
>
> would save you the multiplication?
yeah...
>
>> + dev->ethtool_ops->get_fec_stats(dev, &stats,
>> + &data->fec_stat_hist);
>>
>> fec_stats_recalc(&data->corr, &stats.corrected_blocks);
>> fec_stats_recalc(&data->uncorr, &stats.uncorrectable_blocks);
>
>> +static int fec_put_hist(struct sk_buff *skb, const struct ethtool_fec_hist *hist)
>
> over 80 chars, please wrap (checkpatch --max-line-length=80)
ouch, that's proper strict check! :)
>
>> +{
>> + const struct ethtool_fec_hist_range *ranges = hist->ranges;
>> + const struct ethtool_fec_hist_value *values = hist->values;
>> + struct nlattr *nest;
>> + int i, j;
>> +
>> + if (!ranges)
>> + return 0;
>> +
>> + for (i = 0; i < ETHTOOL_FEC_HIST_MAX; i++) {
>> + if (i && !ranges[i].low && !ranges[i].high)
>
> low and high should probably be unsigned now
ack
>
>> + break;
>> +
>> + if (WARN_ON_ONCE(values[i].bin_value == ETHTOOL_STAT_NOT_SET))
>> + break;
>> +
>> + nest = nla_nest_start(skb, ETHTOOL_A_FEC_STAT_HIST);
>> + if (!nest)
>> + return -EMSGSIZE;
>> +
>> + if (nla_put_u32(skb, ETHTOOL_A_FEC_HIST_BIN_LOW,
>> + ranges[i].low) ||
>> + nla_put_u32(skb, ETHTOOL_A_FEC_HIST_BIN_HIGH,
>> + ranges[i].high) ||
>> + nla_put_uint(skb, ETHTOOL_A_FEC_HIST_BIN_VAL,
>> + values[i].bin_value))
>> + goto err_cancel_hist;
>> + for (j = 0; j < ETHTOOL_MAX_LANES; j++) {
>> + if (values[i].bin_value_per_lane[j] == ETHTOOL_STAT_NOT_SET)
>
> You know, bin_value could be 'sum', and bin_value_per_lane could be
> simply 'per_lane'.
SG, I'll change it
>
>> + break;
>> + }
>
> {} brackets unnecessary
>
>> + if (j && nla_put_64bit(skb, ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE,
>> + sizeof(u64) * j,
>> + values[i].bin_value_per_lane,
>> + ETHTOOL_A_FEC_STAT_PAD))
>> + goto err_cancel_hist;
>> +
>> + nla_nest_end(skb, nest);
>> + }
>> +
>> + return 0;
>> +
>> +err_cancel_hist:
>> + nla_nest_cancel(skb, nest);
>> + return -EMSGSIZE;
>> +}
>
> We need a selftest. Add a case to stats.py and do basic sanity checking
> on what the kernel spits out? Maybe 2 test cases - one for overall and
> one for per-lane, cause mlx5 doesn't have per lane and we'd like the
> test to pass there.
Yeah, sure, I'll add them as another patch to this series
next prev parent reply other threads:[~2025-09-18 10:54 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-16 19:12 [Intel-wired-lan] [PATCH net-next v3 0/4] add FEC bins histogram report via ethtool Vadim Fedorenko
2025-09-16 19:12 ` Vadim Fedorenko
2025-09-16 19:12 ` [Intel-wired-lan] [PATCH net-next v3 1/4] ethtool: add FEC bins histogram report Vadim Fedorenko
2025-09-16 19:12 ` Vadim Fedorenko
2025-09-17 11:27 ` [Intel-wired-lan] " Loktionov, Aleksandr
2025-09-17 11:27 ` Loktionov, Aleksandr
2025-09-18 10:58 ` Vadim Fedorenko
2025-09-19 15:47 ` Tony Nguyen
2025-09-18 0:41 ` Jakub Kicinski
2025-09-18 0:41 ` Jakub Kicinski
2025-09-18 10:53 ` Vadim Fedorenko [this message]
2025-09-18 10:53 ` Vadim Fedorenko
2025-09-18 13:59 ` [Intel-wired-lan] " Jakub Kicinski
2025-09-18 13:59 ` Jakub Kicinski
2025-09-16 19:12 ` [Intel-wired-lan] [PATCH net-next v3 2/4] net/mlx5e: Don't query FEC statistics when FEC is disabled Vadim Fedorenko
2025-09-16 19:12 ` Vadim Fedorenko
2025-09-17 11:26 ` [Intel-wired-lan] " Loktionov, Aleksandr
2025-09-17 11:26 ` Loktionov, Aleksandr
2025-09-16 19:12 ` [Intel-wired-lan] [PATCH net-next v3 3/4] net/mlx5e: Add logic to read RS-FEC histogram bin ranges from PPHCR Vadim Fedorenko
2025-09-16 19:12 ` Vadim Fedorenko
2025-09-17 11:25 ` [Intel-wired-lan] " Loktionov, Aleksandr
2025-09-17 11:25 ` Loktionov, Aleksandr
2025-09-18 0:46 ` Jakub Kicinski
2025-09-18 0:46 ` Jakub Kicinski
2025-09-18 14:25 ` [Intel-wired-lan] " Carolina Jubran
2025-09-18 14:25 ` Carolina Jubran
2025-09-18 14:35 ` [Intel-wired-lan] " Jakub Kicinski
2025-09-18 14:35 ` Jakub Kicinski
2025-09-18 15:16 ` [Intel-wired-lan] " Carolina Jubran
2025-09-18 15:16 ` Carolina Jubran
2025-09-18 15:40 ` [Intel-wired-lan] " Jakub Kicinski
2025-09-18 15:40 ` Jakub Kicinski
2025-09-18 19:41 ` [Intel-wired-lan] " Carolina Jubran
2025-09-18 19:41 ` Carolina Jubran
2025-09-18 22:18 ` [Intel-wired-lan] " Jakub Kicinski
2025-09-18 22:18 ` Jakub Kicinski
2025-09-19 9:35 ` [Intel-wired-lan] " Carolina Jubran
2025-09-19 9:35 ` Carolina Jubran
2025-09-16 19:12 ` [Intel-wired-lan] [PATCH net-next v3 4/4] net/mlx5e: Report RS-FEC histogram statistics via ethtool Vadim Fedorenko
2025-09-16 19:12 ` Vadim Fedorenko
2025-09-17 11:24 ` [Intel-wired-lan] " Loktionov, Aleksandr
2025-09-17 11:24 ` Loktionov, Aleksandr
2025-09-18 0:48 ` Jakub Kicinski
2025-09-18 0:48 ` Jakub Kicinski
2025-09-18 14:32 ` [Intel-wired-lan] " Vadim Fedorenko
2025-09-18 14:32 ` Vadim Fedorenko
2025-09-18 14:40 ` [Intel-wired-lan] " Jakub Kicinski
2025-09-18 14:40 ` Jakub Kicinski
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=3091c796-acad-4c87-9782-3b67210147c2@linux.dev \
--to=vadim.fedorenko@linux.dev \
--cc=andrew@lunn.ch \
--cc=cjubran@nvidia.com \
--cc=donald.hunter@gmail.com \
--cc=gal@nvidia.com \
--cc=horms@kernel.org \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=kuba@kernel.org \
--cc=michael.chan@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=tariqt@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.