diff mbox series

[net-next] ionic: add support for ethtool extended stat link_down_count

Message ID 20230602173252.35711-1-shannon.nelson@amd.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next] ionic: add support for ethtool extended stat link_down_count | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 4 maintainers not CCed: pabeni@redhat.com edumazet@google.com simon.horman@corigine.com allen.hubbe@amd.com
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 35 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Nelson, Shannon June 2, 2023, 5:32 p.m. UTC
From: Nitya Sunkad <nitya.sunkad@amd.com>

Following the example of 9a0f830f8026 ("ethtool: linkstate: add a statistic
for PHY down events"), added support for link down events.

Added callback ionic_get_link_ext_stats to ionic_ethtool.c to support
link_down_count, a property of netdev that gets incremented every time
the device link goes down.

Run ethtool -I <devname> to display the device link down count.

Signed-off-by: Nitya Sunkad <nitya.sunkad@amd.com>
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
---
 drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 9 +++++++++
 drivers/net/ethernet/pensando/ionic/ionic_lif.c     | 1 +
 drivers/net/ethernet/pensando/ionic/ionic_lif.h     | 1 +
 3 files changed, 11 insertions(+)

Comments

s-vadapalli June 3, 2023, 6:11 a.m. UTC | #1
On 02-06-2023 23:02, Shannon Nelson wrote:
> From: Nitya Sunkad <nitya.sunkad@amd.com>
> 
> Following the example of 9a0f830f8026 ("ethtool: linkstate: add a statistic
> for PHY down events"), added support for link down events.

s/added/add.

> 
> Added callback ionic_get_link_ext_stats to ionic_ethtool.c to support

s/Added/Add.

> link_down_count, a property of netdev that gets incremented every time
> the device link goes down.

Please use imperative mood when writing commit messages.
Also, I think it is a good practice to Cc all the email IDs generated by
./scripts/get_maintainer.pl.

> 
> Run ethtool -I <devname> to display the device link down count.
> 
> Signed-off-by: Nitya Sunkad <nitya.sunkad@amd.com>
> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>

Apart from my comments above, the patch looks good to me.

Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>

> ---
>  drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 9 +++++++++
>  drivers/net/ethernet/pensando/ionic/ionic_lif.c     | 1 +
>  drivers/net/ethernet/pensando/ionic/ionic_lif.h     | 1 +
>  3 files changed, 11 insertions(+)
> 
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
> index 9b2b96fa36af..4c527a06e7d9 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
> @@ -104,6 +104,14 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
>  	memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
>  }
>  
> +static void ionic_get_link_ext_stats(struct net_device *netdev,
> +				     struct ethtool_link_ext_stats *stats)
> +{
> +	struct ionic_lif *lif = netdev_priv(netdev);
> +
> +	stats->link_down_events = lif->link_down_count;
> +}
> +
>  static int ionic_get_link_ksettings(struct net_device *netdev,
>  				    struct ethtool_link_ksettings *ks)
>  {
> @@ -1074,6 +1082,7 @@ static const struct ethtool_ops ionic_ethtool_ops = {
>  	.get_regs_len		= ionic_get_regs_len,
>  	.get_regs		= ionic_get_regs,
>  	.get_link		= ethtool_op_get_link,
> +	.get_link_ext_stats	= ionic_get_link_ext_stats,
>  	.get_link_ksettings	= ionic_get_link_ksettings,
>  	.set_link_ksettings	= ionic_set_link_ksettings,
>  	.get_coalesce		= ionic_get_coalesce,
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> index 957027e546b3..6ccc1ea91992 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> @@ -168,6 +168,7 @@ static void ionic_link_status_check(struct ionic_lif *lif)
>  		}
>  	} else {
>  		if (netif_carrier_ok(netdev)) {
> +			lif->link_down_count++;
>  			netdev_info(netdev, "Link down\n");
>  			netif_carrier_off(netdev);
>  		}
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
> index c9c4c46d5a16..fd2ea670e7d8 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
> @@ -201,6 +201,7 @@ struct ionic_lif {
>  	u64 hw_features;
>  	bool registered;
>  	u16 lif_type;
> +	unsigned int link_down_count;
>  	unsigned int nmcast;
>  	unsigned int nucast;
>  	unsigned int nvlans;
Jakub Kicinski June 3, 2023, 6:47 a.m. UTC | #2
On Fri, 2 Jun 2023 10:32:52 -0700 Shannon Nelson wrote:
> Following the example of 9a0f830f8026 ("ethtool: linkstate: add a statistic
> for PHY down events"), added support for link down events.
> 
> Added callback ionic_get_link_ext_stats to ionic_ethtool.c to support
> link_down_count, a property of netdev that gets incremented every time
> the device link goes down.

Hm, could you say more about motivation? The ethtool stat is supposed to
come from HW and represent PHY-level flap count. It's used primarily to
find bad cables in a datacenter. Is this also the use case for ionic?
It's unclear to me whether ionic interfaces are seeing an actual PHY or
just some virtual link state of the IPU and in the latter case it's not
really a match.
Nelson, Shannon June 5, 2023, 4:26 p.m. UTC | #3
On 6/2/23 11:47 PM, Jakub Kicinski wrote:
> On Fri, 2 Jun 2023 10:32:52 -0700 Shannon Nelson wrote:
>> Following the example of 9a0f830f8026 ("ethtool: linkstate: add a statistic
>> for PHY down events"), added support for link down events.
>>
>> Added callback ionic_get_link_ext_stats to ionic_ethtool.c to support
>> link_down_count, a property of netdev that gets incremented every time
>> the device link goes down.
> 
> Hm, could you say more about motivation? The ethtool stat is supposed to
> come from HW and represent PHY-level flap count. It's used primarily to
> find bad cables in a datacenter. Is this also the use case for ionic?
> It's unclear to me whether ionic interfaces are seeing an actual PHY or
> just some virtual link state of the IPU and in the latter case it's not
> really a match.

This is a fair question - yes, it is possible that the FW could fake it, 
but normally this is a signal from the HW.  However, I suppose it would 
be best to only have the PF reporting this counter, and not the VFs, 
which is currently the case here.  I'll have Nitya modify this for PF only.

Thanks,
sln
Nelson, Shannon June 5, 2023, 4:31 p.m. UTC | #4
On 6/2/23 11:11 PM, Siddharth Vadapalli wrote:
> On 02-06-2023 23:02, Shannon Nelson wrote:
>> From: Nitya Sunkad <nitya.sunkad@amd.com>
>>
>> Following the example of 9a0f830f8026 ("ethtool: linkstate: add a statistic
>> for PHY down events"), added support for link down events.
> 
> s/added/add. >
>>
>> Added callback ionic_get_link_ext_stats to ionic_ethtool.c to support
> 
> s/Added/Add >
>> link_down_count, a property of netdev that gets incremented every time
>> the device link goes down.
> 
> Please use imperative mood when writing commit messages.

We'll get these fixed up in a re-spin.

> Also, I think it is a good practice to Cc all the email IDs generated by
> ./scripts/get_maintainer.pl.

Thanks, I'll keep that in mind.

sln

> 
>>
>> Run ethtool -I <devname> to display the device link down count.
>>
>> Signed-off-by: Nitya Sunkad <nitya.sunkad@amd.com>
>> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
> 
> Apart from my comments above, the patch looks good to me.
> 
> Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>
> 
>> ---
>>   drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 9 +++++++++
>>   drivers/net/ethernet/pensando/ionic/ionic_lif.c     | 1 +
>>   drivers/net/ethernet/pensando/ionic/ionic_lif.h     | 1 +
>>   3 files changed, 11 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
>> index 9b2b96fa36af..4c527a06e7d9 100644
>> --- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
>> +++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
>> @@ -104,6 +104,14 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
>>        memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
>>   }
>>
>> +static void ionic_get_link_ext_stats(struct net_device *netdev,
>> +                                  struct ethtool_link_ext_stats *stats)
>> +{
>> +     struct ionic_lif *lif = netdev_priv(netdev);
>> +
>> +     stats->link_down_events = lif->link_down_count;
>> +}
>> +
>>   static int ionic_get_link_ksettings(struct net_device *netdev,
>>                                    struct ethtool_link_ksettings *ks)
>>   {
>> @@ -1074,6 +1082,7 @@ static const struct ethtool_ops ionic_ethtool_ops = {
>>        .get_regs_len           = ionic_get_regs_len,
>>        .get_regs               = ionic_get_regs,
>>        .get_link               = ethtool_op_get_link,
>> +     .get_link_ext_stats     = ionic_get_link_ext_stats,
>>        .get_link_ksettings     = ionic_get_link_ksettings,
>>        .set_link_ksettings     = ionic_set_link_ksettings,
>>        .get_coalesce           = ionic_get_coalesce,
>> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
>> index 957027e546b3..6ccc1ea91992 100644
>> --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
>> +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
>> @@ -168,6 +168,7 @@ static void ionic_link_status_check(struct ionic_lif *lif)
>>                }
>>        } else {
>>                if (netif_carrier_ok(netdev)) {
>> +                     lif->link_down_count++;
>>                        netdev_info(netdev, "Link down\n");
>>                        netif_carrier_off(netdev);
>>                }
>> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
>> index c9c4c46d5a16..fd2ea670e7d8 100644
>> --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
>> +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
>> @@ -201,6 +201,7 @@ struct ionic_lif {
>>        u64 hw_features;
>>        bool registered;
>>        u16 lif_type;
>> +     unsigned int link_down_count;
>>        unsigned int nmcast;
>>        unsigned int nucast;
>>        unsigned int nvlans;
> 
> --
> Regards,
> Siddharth.
Jakub Kicinski June 5, 2023, 7:05 p.m. UTC | #5
On Mon, 5 Jun 2023 09:26:25 -0700 Shannon Nelson wrote:
> > Hm, could you say more about motivation? The ethtool stat is supposed to
> > come from HW and represent PHY-level flap count. It's used primarily to
> > find bad cables in a datacenter. Is this also the use case for ionic?
> > It's unclear to me whether ionic interfaces are seeing an actual PHY or
> > just some virtual link state of the IPU and in the latter case it's not
> > really a match.  
> 
> This is a fair question - yes, it is possible that the FW could fake it, 
> but normally this is a signal from the HW.  However, I suppose it would 
> be best to only have the PF reporting this counter, and not the VFs, 
> which is currently the case here.  I'll have Nitya modify this for PF only.

Perfect, thanks!
diff mbox series

Patch

diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index 9b2b96fa36af..4c527a06e7d9 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -104,6 +104,14 @@  static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
 	memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
 }
 
+static void ionic_get_link_ext_stats(struct net_device *netdev,
+				     struct ethtool_link_ext_stats *stats)
+{
+	struct ionic_lif *lif = netdev_priv(netdev);
+
+	stats->link_down_events = lif->link_down_count;
+}
+
 static int ionic_get_link_ksettings(struct net_device *netdev,
 				    struct ethtool_link_ksettings *ks)
 {
@@ -1074,6 +1082,7 @@  static const struct ethtool_ops ionic_ethtool_ops = {
 	.get_regs_len		= ionic_get_regs_len,
 	.get_regs		= ionic_get_regs,
 	.get_link		= ethtool_op_get_link,
+	.get_link_ext_stats	= ionic_get_link_ext_stats,
 	.get_link_ksettings	= ionic_get_link_ksettings,
 	.set_link_ksettings	= ionic_set_link_ksettings,
 	.get_coalesce		= ionic_get_coalesce,
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index 957027e546b3..6ccc1ea91992 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -168,6 +168,7 @@  static void ionic_link_status_check(struct ionic_lif *lif)
 		}
 	} else {
 		if (netif_carrier_ok(netdev)) {
+			lif->link_down_count++;
 			netdev_info(netdev, "Link down\n");
 			netif_carrier_off(netdev);
 		}
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
index c9c4c46d5a16..fd2ea670e7d8 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
@@ -201,6 +201,7 @@  struct ionic_lif {
 	u64 hw_features;
 	bool registered;
 	u16 lif_type;
+	unsigned int link_down_count;
 	unsigned int nmcast;
 	unsigned int nucast;
 	unsigned int nvlans;