From 5a5cf6254f083fc6e5dd9828792f689ab52d4aa9 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Gampa Date: Wed, 26 Mar 2025 07:05:03 +0000 Subject: [PATCH] nvethernet: handling new CERT errors CERT INT08-C CERT STR07-C Jira NET-2907 Change-Id: If331caf9838840073792de5ac722f268920c4a87 Signed-off-by: Sanath Kumar Gampa Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3328902 Reviewed-by: Bhadram Varka Reviewed-by: Srinivas Ramachandran GVS: buildbot_gerritrpt Tested-by: mobile promotions Reviewed-by: mobile promotions --- .../ethernet/nvidia/nvethernet/ether_linux.c | 30 ++++++++++++------- .../ethernet/nvidia/nvethernet/ether_linux.h | 19 +++++++----- .../net/ethernet/nvidia/nvethernet/macsec.c | 6 ++-- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 027e2dce..e5c35e9b 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -3600,8 +3600,8 @@ static int ether_handle_tso(struct device *dev, tx_pkt_cx->mss = skb_shinfo(skb)->gso_size; } - if (((UINT_MAX - transport_offset) < tx_pkt_cx->tcp_udp_hdrlen) || - ((transport_offset + tx_pkt_cx->tcp_udp_hdrlen) > (unsigned int)skb->len)) { + if (unlikely(((UINT_MAX - transport_offset) < tx_pkt_cx->tcp_udp_hdrlen) || + ((transport_offset + tx_pkt_cx->tcp_udp_hdrlen) > (unsigned int)skb->len))) { dev_err(dev, "Invalid header length calculations\n"); ret = -EINVAL; goto func_exit; @@ -3642,11 +3642,15 @@ static void ether_tx_swcx_rollback(struct ether_priv_data *pdata, struct osi_tx_swcx *tx_swcx = NULL; while (count > 0) { - if ((pdata->osi_dma->tx_ring_sz == 0U) || (cur_tx_idx == 0U)) { + if (unlikely(pdata->osi_dma->tx_ring_sz == 0U)) { dev_err(dev, "Invalid Tx ring size or index\n"); break; } - DECR_TX_DESC_INDEX(cur_tx_idx, pdata->osi_dma->tx_ring_sz); + if (cur_tx_idx != 0U) { + DECR_TX_DESC_INDEX(cur_tx_idx, pdata->osi_dma->tx_ring_sz); + } else { + cur_tx_idx = pdata->osi_dma->tx_ring_sz - 1U; + } tx_swcx = tx_ring->tx_swcx + cur_tx_idx; if (tx_swcx->buf_phy_addr) { if ((tx_swcx->flags & OSI_PKT_CX_PAGED_BUF) == @@ -3728,7 +3732,7 @@ static int ether_tx_swcx_alloc(struct ether_priv_data *pdata, tx_pkt_cx->flags |= OSI_PKT_CX_PTP; } - if (pdata->osi_dma->tx_ring_sz == 0U) { + if (unlikely(pdata->osi_dma->tx_ring_sz == 0U)) { dev_err(dev, "Invalid Tx ring size\n"); goto exit_func; } @@ -3783,7 +3787,7 @@ static int ether_tx_swcx_alloc(struct ether_priv_data *pdata, tx_swcx->len = size; len -= size; offset += size; - if (cnt == (int)INT_MAX) { + if (unlikely(cnt == (int)INT_MAX)) { dev_err(dev, "Reached Max desc count\n"); ret = -ENOMEM; goto dma_map_failed; @@ -3827,7 +3831,7 @@ static int ether_tx_swcx_alloc(struct ether_priv_data *pdata, goto dma_map_failed; } offset += size; - if (cnt == (int)INT_MAX) { + if (unlikely(cnt == (int)INT_MAX)) { dev_err(dev, "Reached Max desc count\n"); ret = -ENOMEM; goto dma_map_failed; @@ -3850,7 +3854,7 @@ static int ether_tx_swcx_alloc(struct ether_priv_data *pdata, } size = min(len, max_data_len_per_txd); - if (skb_frag_off(frag) > UINT_MAX - offset) { + if (unlikely(skb_frag_off(frag) > UINT_MAX - offset)) { dev_err(dev, "Offset addition overflow detected:" "frag offset = %u, offset = %u\n", skb_frag_off(frag), offset); @@ -3873,7 +3877,7 @@ static int ether_tx_swcx_alloc(struct ether_priv_data *pdata, tx_swcx->len = size; len -= size; offset += size; - if (cnt == (int)INT_MAX) { + if (unlikely(cnt == (int)INT_MAX)) { dev_err(dev, "Reached Max desc count\n"); ret = -ENOMEM; goto dma_map_failed; @@ -7908,7 +7912,9 @@ int ether_suspend_noirq(struct device *dev) #ifdef CONFIG_DEBUG_FS t1 = ether_get_systime_us(); - pdata->suspend_profile_time = (t1 - t0); + if (t1 >= t0) { + pdata->suspend_profile_time = (t1 - t0); + } #endif return 0; } @@ -7943,7 +7949,9 @@ int ether_resume_noirq(struct device *dev) #ifdef CONFIG_DEBUG_FS t1 = ether_get_systime_us(); - pdata->resume_profile_time = (t1 - t0); + if (t1 >= t0) { + pdata->resume_profile_time = (t1 - t0); + } #endif return 0; } diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index f5fe7e48..668b1f5a 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -338,14 +338,19 @@ static inline bool valid_tx_len(unsigned int length) static inline int ether_avail_txdesc_cnt(struct osi_dma_priv_data *osi_dma, struct osi_tx_ring *tx_ring) { - int ret = -EINVAL; - - if ((osi_dma->tx_ring_sz == 0U) || (tx_ring->cur_tx_idx == 0U) || - (tx_ring->clean_idx < (tx_ring->cur_tx_idx - 1U))) { - return ret; + if (unlikely((osi_dma->tx_ring_sz == 0U) || + (tx_ring->cur_tx_idx >= osi_dma->tx_ring_sz))) { + return -EINVAL; + } + + if (tx_ring->clean_idx > (tx_ring->cur_tx_idx + 1U)) { + return ((tx_ring->clean_idx - (tx_ring->cur_tx_idx + 1U)) & + (osi_dma->tx_ring_sz - 1U)); + } else { + return (((tx_ring->clean_idx + osi_dma->tx_ring_sz) - + (tx_ring->cur_tx_idx + 1U)) & + (osi_dma->tx_ring_sz - 1U)); } - return ((tx_ring->clean_idx - tx_ring->cur_tx_idx - 1U) & - (osi_dma->tx_ring_sz - 1U)); } /** diff --git a/drivers/net/ethernet/nvidia/nvethernet/macsec.c b/drivers/net/ethernet/nvidia/nvethernet/macsec.c index 5fca08a5..fc5bc4e0 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/macsec.c +++ b/drivers/net/ethernet/nvidia/nvethernet/macsec.c @@ -1471,10 +1471,8 @@ int macsec_probe(struct ether_priv_data *pdata) ret = -1; goto genl_err; } else { - strncpy(macsec_pdata->nv_macsec_fam.name, - netdev_name(pdata->ndev), GENL_NAMSIZ - 1); - // Explicit null-termination to fix CERT STR07-C - macsec_pdata->nv_macsec_fam.name[GENL_NAMSIZ - 1] = '\0'; + snprintf(macsec_pdata->nv_macsec_fam.name, GENL_NAMSIZ, + netdev_name(pdata->ndev)); } ret = genl_register_family(&macsec_pdata->nv_macsec_fam); if (ret) {