From 85cf3fb4b31bd597b5debda1bf1f67fb23da7814 Mon Sep 17 00:00:00 2001 From: Narayan Reddy Date: Mon, 15 Jan 2024 17:03:23 +0000 Subject: [PATCH] nvethernet: remove calling of osi_update_stats_counter remove osi_update_stats_counter and add logic in nvethernet itself to take care of incrementing the value Bug 4284096 Bug 4449611 Change-Id: I0b7e6f03651b0d092d136baf0efd1caffc762205 Signed-off-by: Narayan Reddy Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3053871 (cherry picked from commit bdb1fedec9f3781a3100bd2838271551df31984f) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3074753 (cherry picked from commit d31b03a583adf52a7978ef14a9cc0c7d3005ccb0) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3081228 Reviewed-by: Bhadram Varka Reviewed-by: Srinivas Ramachandran GVS: Gerrit_Virtual_Submit Tested-by: Bhadram Varka --- .../net/ethernet/nvidia/nvethernet/ether_linux.c | 15 +++++---------- .../net/ethernet/nvidia/nvethernet/ether_linux.h | 13 ++++++++++++- drivers/net/ethernet/nvidia/nvethernet/osd.c | 11 ++++------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index d4caf56d..92b53d23 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -1144,8 +1144,7 @@ static void ether_adjust_link(struct net_device *dev) new_state = 1; pdata->oldlink = 1; val = pdata->xstats.link_connect_count; - pdata->xstats.link_connect_count = - osi_update_stats_counter(val, 1UL); + pdata->xstats.link_connect_count = update_stats_counter(val, 1UL); } } else if (pdata->oldlink) { new_state = 1; @@ -1153,8 +1152,7 @@ static void ether_adjust_link(struct net_device *dev) pdata->speed = 0; pdata->oldduplex = -1; val = pdata->xstats.link_disconnect_count; - pdata->xstats.link_disconnect_count = - osi_update_stats_counter(val, 1UL); + pdata->xstats.link_disconnect_count = update_stats_counter(val, 1UL); ether_en_dis_monitor_clks(pdata, OSI_DISABLE); } else { /* Nothing here */ @@ -1351,8 +1349,7 @@ static irqreturn_t ether_tx_chan_isr(int irq, void *data) raw_spin_unlock_irqrestore(&pdata->rlock, flags); val = pdata->xstats.tx_normal_irq_n[chan]; - pdata->xstats.tx_normal_irq_n[chan] = - osi_update_stats_counter(val, 1U); + pdata->xstats.tx_normal_irq_n[chan] = update_stats_counter(val, 1U); if (likely(napi_schedule_prep(&tx_napi->napi))) { __napi_schedule_irqoff(&tx_napi->napi); @@ -1398,8 +1395,7 @@ static irqreturn_t ether_rx_chan_isr(int irq, void *data) raw_spin_unlock_irqrestore(&pdata->rlock, flags); val = pdata->xstats.rx_normal_irq_n[chan]; - pdata->xstats.rx_normal_irq_n[chan] = - osi_update_stats_counter(val, 1U); + pdata->xstats.rx_normal_irq_n[chan] = update_stats_counter(val, 1U); if (likely(napi_schedule_prep(&rx_napi->napi))) { __napi_schedule_irqoff(&rx_napi->napi); @@ -4373,8 +4369,7 @@ static enum hrtimer_restart ether_tx_usecs_hrtimer(struct hrtimer *data) unsigned long val; val = pdata->xstats.tx_usecs_swtimer_n[tx_napi->chan]; - pdata->xstats.tx_usecs_swtimer_n[tx_napi->chan] = - osi_update_stats_counter(val, 1U); + pdata->xstats.tx_usecs_swtimer_n[tx_napi->chan] = update_stats_counter(val, 1U); atomic_set(&pdata->tx_napi[tx_napi->chan]->tx_usecs_timer_armed, OSI_DISABLE); diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index de79cf65..4b9c0491 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved */ +/* Copyright (c) 2019-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved */ #ifndef ETHER_LINUX_H #define ETHER_LINUX_H @@ -857,6 +857,17 @@ int ether_tc_setup_cbs(struct ether_priv_data *pdata, */ int ether_get_tx_ts(struct ether_priv_data *pdata); void ether_restart_lane_bringup_task(struct tasklet_struct *t); +static inline nveu64_t update_stats_counter(nveu64_t last_value, nveu64_t incr) +{ + nveu64_t temp = last_value + incr; + + if (temp < last_value) { + /* Stats overflow, so reset it to zero */ + temp = 0UL; + } + + return temp; +} #ifdef ETHER_NVGRO void ether_nvgro_purge_timer(struct timer_list *t); #endif /* ETHER_NVGRO */ diff --git a/drivers/net/ethernet/nvidia/nvethernet/osd.c b/drivers/net/ethernet/nvidia/nvethernet/osd.c index 12853f06..58a037ec 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/osd.c +++ b/drivers/net/ethernet/nvidia/nvethernet/osd.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2019-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved */ +/* Copyright (c) 2019-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved */ #include "ether_linux.h" @@ -226,8 +226,7 @@ static inline int ether_alloc_skb(struct ether_priv_data *pdata, rx_swcx->buf_phy_addr = pdata->resv_buf_phy_addr; rx_swcx->flags |= OSI_RX_SWCX_BUF_VALID; val = pdata->xstats.re_alloc_rxbuf_failed[chan]; - pdata->xstats.re_alloc_rxbuf_failed[chan] = - osi_update_stats_counter(val, 1UL); + pdata->xstats.re_alloc_rxbuf_failed[chan] = update_stats_counter(val, 1UL); return 0; } @@ -248,8 +247,7 @@ static inline int ether_alloc_skb(struct ether_priv_data *pdata, rx_swcx->buf_phy_addr = pdata->resv_buf_phy_addr; rx_swcx->flags |= OSI_RX_SWCX_BUF_VALID; val = pdata->xstats.re_alloc_rxbuf_failed[chan]; - pdata->xstats.re_alloc_rxbuf_failed[chan] = - osi_update_stats_counter(val, 1UL); + pdata->xstats.re_alloc_rxbuf_failed[chan] = update_stats_counter(val, 1UL); return 0; } @@ -682,8 +680,7 @@ static void osd_receive_packet(void *priv, struct osi_rx_ring *rx_ring, if ((rx_pkt_cx->flags & OSI_PKT_CX_VLAN) == OSI_PKT_CX_VLAN) { val = pdata->osi_dma->dstats.rx_vlan_pkt_n; - pdata->osi_dma->dstats.rx_vlan_pkt_n = - osi_update_stats_counter(val, 1UL); + pdata->osi_dma->dstats.rx_vlan_pkt_n = update_stats_counter(val, 1UL); } #endif /* !OSI_STRIPPED_LIB */