bnxt_en: Update for net-next
Michael Chan
maintainerv2 cover bnxt_en: Update for net-next
This patchset contains 2 features:
- The page pool implementation for the normal RX path (non-XDP) for paged buffers in the aggregation ring.
- Saving of the ring error counters across reset.
v2: The hwmon patches are dropped for now while Kalesh is reworking them.
Michael Chan (4):
bnxt_en: Increment rx_resets counter in bnxt_disable_napi()
bnxt_en: Save ring error counters across reset
bnxt_en: Display the ring error counters under ethtool -S
bnxt_en: Add tx_resets ring counter
Somnath Kotur (2):
bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP
bnxt_en: Let the page pool manage the DMA mapping
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 144 ++++++++---------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 24 ++- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 49 +++--- 3 files changed, 107 insertions(+), 110 deletions(-)
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 1/6 bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP
From: Somnath Kotur <[email protected]>
Convert to use the page pool buffers for the aggregation ring when running in non-XDP mode. This simplifies the driver and we benefit from the recycling of pages. Adjust the page pool size to account for the aggregation ring size.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 71 +++++------------------ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 - 2 files changed, 14 insertions(+), 60 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +14 -57
@@ -877,48 +877,15 @@ static inline int bnxt_alloc_rx_page(struct bnxt *bp,struct rx_bd *rxbd = &rxr->rx_agg_desc_ring[RX_RING (prod)][RX_IDX (prod)];struct bnxt_sw_rx_agg_bd *rx_agg_buf; -struct pci_dev *pdev = bp->pdev;struct page *page;dma_addr_t mapping;u16 sw_prod = rxr->rx_sw_agg_prod;unsigned int offset =0 ; -if (BNXT_RX_PAGE_MODE (bp)) { - page =__bnxt_alloc_rx_page (bp, &mapping, rxr, &offset, gfp); - -if (!page) -return -ENOMEM ; - - }else { -if (PAGE_SIZE >BNXT_RX_PAGE_SIZE ) { - page = rxr->rx_page; -if (!page) { - page =alloc_page (gfp); -if (!page) -return -ENOMEM ; - rxr->rx_page = page; - rxr->rx_page_offset =0 ; - } - offset = rxr->rx_page_offset; - rxr->rx_page_offset +=BNXT_RX_PAGE_SIZE ; -if (rxr->rx_page_offset ==PAGE_SIZE ) - rxr->rx_page =NULL ; -else -get_page (page); - }else { - page =alloc_page (gfp); -if (!page) -return -ENOMEM ; - } + page =__bnxt_alloc_rx_page (bp, &mapping, rxr, &offset, gfp); - mapping =dma_map_page_attrs (&pdev->dev, page, offset, -BNXT_RX_PAGE_SIZE ,DMA_FROM_DEVICE , -DMA_ATTR_WEAK_ORDERING ); -if (dma_mapping_error (&pdev->dev, mapping)) { -__free_page (page); -return -EIO ; - } - } +if (!page) +return -ENOMEM ;if (unlikely (test_bit (sw_prod, rxr->rx_agg_bmap))) sw_prod =bnxt_find_next_agg_idx (rxr, sw_prod);
@@ -1204,6 +1171,7 @@ static struct sk_buff *bnxt_rx_agg_pages_skb(struct bnxt *bp, total_frag_len =__bnxt_rx_agg_pages (bp, cpr, shinfo, idx, agg_bufs, tpa,NULL );if (!total_frag_len) { +skb_mark_for_recycle (skb);dev_kfree_skb (skb);return NULL ; }
@@ -1794,6 +1762,7 @@ static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi,return ; }skb_record_rx_queue (skb, bnapi->index); +skb_mark_for_recycle (skb);napi_gro_receive (&bnapi->napi, skb); }
@@ -3002,30 +2971,16 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)if (!page)continue ; -if (BNXT_RX_PAGE_MODE (bp)) { -dma_unmap_page_attrs (&pdev->dev, rx_agg_buf->mapping, -BNXT_RX_PAGE_SIZE , bp->rx_dir, -DMA_ATTR_WEAK_ORDERING ); - rx_agg_buf->page =NULL ; -__clear_bit (i, rxr->rx_agg_bmap); - -page_pool_recycle_direct (rxr->page_pool, page); - }else { -dma_unmap_page_attrs (&pdev->dev, rx_agg_buf->mapping, -BNXT_RX_PAGE_SIZE ,DMA_FROM_DEVICE , -DMA_ATTR_WEAK_ORDERING ); - rx_agg_buf->page =NULL ; -__clear_bit (i, rxr->rx_agg_bmap); +dma_unmap_page_attrs (&pdev->dev, rx_agg_buf->mapping, +BNXT_RX_PAGE_SIZE , bp->rx_dir, +DMA_ATTR_WEAK_ORDERING ); + rx_agg_buf->page =NULL ; +__clear_bit (i, rxr->rx_agg_bmap); -__free_page (page); - } +page_pool_recycle_direct (rxr->page_pool, page); } skip_rx_agg_free: -if (rxr->rx_page) { -__free_page (rxr->rx_page); - rxr->rx_page =NULL ; - } map = rxr->rx_tpa_idx_map;if (map)memset (map->agg_idx_bmap,0 ,sizeof (map->agg_idx_bmap));
@@ -3244,7 +3199,9 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp, {struct page_pool_params pp = {0 }; - pp.pool_size = bp->rx_ring_size; + pp.pool_size = bp->rx_agg_ring_size; +if (BNXT_RX_PAGE_MODE (bp)) + pp.pool_size += bp->rx_ring_size; pp.nid =dev_to_node (&bp->pdev->dev); pp.napi = &rxr->bnapi->napi; pp.dev = &bp->pdev->dev;
drivers/net/ethernet/broadcom/bnxt/bnxt.h +0 -3
@@ -919,9 +919,6 @@ struct bnxt_rx_ring_info {unsigned long *rx_agg_bmap;u16 rx_agg_bmap_size; -struct page *rx_page; -unsigned int rx_page_offset; -dma_addr_t rx_desc_mapping[MAX_RX_PAGES ];dma_addr_t rx_agg_desc_mapping[MAX_RX_AGG_PAGES ];
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 2/6 bnxt_en: Let the page pool manage the DMA mapping
In reply to Michael ChanFrom: Somnath Kotur <[email protected]>
Use the page pool's ability to maintain DMA mappings for us. This avoids re-mapping of the recycled pages.
---
v2: Use PAGE_SIZE for pp.max_len.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 32 +++++++---------------- 1 file changed, 10 insertions(+), 22 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +10 -22
@@ -761,7 +761,6 @@ static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping, unsigned int *offset, gfp_t gfp) { -struct device *dev = &bp->pdev->dev;struct page *page;if (PAGE_SIZE >BNXT_RX_PAGE_SIZE ) {
@@ -774,12 +773,7 @@ static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,if (!page)return NULL ; - *mapping =dma_map_page_attrs (dev, page, *offset,BNXT_RX_PAGE_SIZE , - bp->rx_dir,DMA_ATTR_WEAK_ORDERING ); -if (dma_mapping_error (dev, *mapping)) { -page_pool_recycle_direct (rxr->page_pool, page); -return NULL ; - } + *mapping =page_pool_get_dma_addr (page) + *offset;return page; }
@@ -998,8 +992,8 @@ static struct sk_buff *bnxt_rx_multi_page_skb(struct bnxt *bp,return NULL ; } dma_addr -= bp->rx_dma_offset; -dma_unmap_page_attrs (&bp->pdev->dev, dma_addr,BNXT_RX_PAGE_SIZE , - bp->rx_dir,DMA_ATTR_WEAK_ORDERING ); +dma_sync_single_for_cpu (&bp->pdev->dev, dma_addr,BNXT_RX_PAGE_SIZE , + bp->rx_dir); skb =build_skb (data_ptr - bp->rx_offset,BNXT_RX_PAGE_SIZE );if (!skb) {page_pool_recycle_direct (rxr->page_pool, page);
@@ -1032,8 +1026,8 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,return NULL ; } dma_addr -= bp->rx_dma_offset; -dma_unmap_page_attrs (&bp->pdev->dev, dma_addr,BNXT_RX_PAGE_SIZE , - bp->rx_dir,DMA_ATTR_WEAK_ORDERING ); +dma_sync_single_for_cpu (&bp->pdev->dev, dma_addr,BNXT_RX_PAGE_SIZE , + bp->rx_dir);if (unlikely (!payload)) payload =eth_get_headlen (bp->dev, data_ptr, len);
@@ -1149,9 +1143,8 @@ static u32 __bnxt_rx_agg_pages(struct bnxt *bp,return 0 ; } -dma_unmap_page_attrs (&pdev->dev, mapping,BNXT_RX_PAGE_SIZE , - bp->rx_dir, -DMA_ATTR_WEAK_ORDERING ); +dma_sync_single_for_cpu (&pdev->dev, mapping,BNXT_RX_PAGE_SIZE , + bp->rx_dir); total_frag_len += frag_len; prod =NEXT_RX_AGG (prod);
@@ -2947,10 +2940,6 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr) rx_buf->data =NULL ;if (BNXT_RX_PAGE_MODE (bp)) { - mapping -= bp->rx_dma_offset; -dma_unmap_page_attrs (&pdev->dev, mapping, -BNXT_RX_PAGE_SIZE , bp->rx_dir, -DMA_ATTR_WEAK_ORDERING );page_pool_recycle_direct (rxr->page_pool, data); }else { dma_unmap_single_attrs(&pdev->dev, mapping,
@@ -2971,9 +2960,6 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)if (!page)continue ; -dma_unmap_page_attrs (&pdev->dev, rx_agg_buf->mapping, -BNXT_RX_PAGE_SIZE , bp->rx_dir, -DMA_ATTR_WEAK_ORDERING ); rx_agg_buf->page =NULL ;__clear_bit (i, rxr->rx_agg_bmap);
@@ -3205,7 +3191,9 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp, pp.nid =dev_to_node (&bp->pdev->dev); pp.napi = &rxr->bnapi->napi; pp.dev = &bp->pdev->dev; - pp.dma_dir =DMA_BIDIRECTIONAL ; + pp.dma_dir = bp->rx_dir; + pp.max_len =PAGE_SIZE ; + pp.flags =PP_FLAG_DMA_MAP |PP_FLAG_DMA_SYNC_DEV ;if (PAGE_SIZE >BNXT_RX_PAGE_SIZE ) pp.flags |=PP_FLAG_PAGE_FRAG ;
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 3/6 bnxt_en: Increment rx_resets counter in bnxt_disable_napi()
In reply to Michael ChanIf we are doing a complete reset with irq_re_init set to true in bnxt_close_nic(), all the ring structures will be freed. New structures will be allocated in bnxt_open_nic(). The current code increments rx_resets counter in bnxt_enable_napi() if bnapi->in_reset is true. In a complete reset, bnapi->in_reset will never be true since the structure is just allocated.
Increment the rx_resets counter in bnxt_disable_napi() instead. This will allow us to save all the ring error counters including the rx_resets counters in the next patch.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +7 -5
@@ -9393,10 +9393,14 @@ static void bnxt_disable_napi(struct bnxt *bp)return ;for (i =0 ; i < bp->cp_nr_rings; i++) { -struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring; +struct bnxt_napi *bnapi = bp->bnapi[i]; +struct bnxt_cp_ring_info *cpr; -napi_disable (&bp->bnapi[i]->napi); -if (bp->bnapi[i]->rx_ring) + cpr = &bnapi->cp_ring; +if (bnapi->in_reset) + cpr->sw_stats.rx.rx_resets++; +napi_disable (&bnapi->napi); +if (bnapi->rx_ring)cancel_work_sync (&cpr->dim.work); } }
@@ -9413,8 +9417,6 @@ static void bnxt_enable_napi(struct bnxt *bp) bnapi->tx_fault =0 ; cpr = &bnapi->cp_ring; -if (bnapi->in_reset) - cpr->sw_stats.rx.rx_resets++; bnapi->in_reset = false; bnapi->tx_pkts =0 ;
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 4/6 bnxt_en: Save ring error counters across reset
In reply to Michael ChanCurrently, the ring counters are stored in the per ring datastructure. During reset, all the rings are freed together with the associated datastructures. As a result, all the ring error counters will be reset to zero.
Add logic to keep track of the total error counts of all the rings and save them before reset (including ifdown). The next patch will display these total ring error counters under ethtool -S.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 32 ++++++++++++++++++++++- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 15 +++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +31 -1
@@ -10685,8 +10685,10 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,bnxt_free_skbs (bp);/* Save ring stats before shutdown */ -if (bp->bnapi && irq_re_init) +if (bp->bnapi && irq_re_init) {bnxt_get_ring_stats (bp, &bp->net_stats_prev); +bnxt_get_ring_err_stats (bp, &bp->ring_err_stats_prev); + }if (irq_re_init) {bnxt_free_irq (bp);bnxt_del_napi (bp);
@@ -10935,6 +10937,34 @@ bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)clear_bit (BNXT_STATE_READ_STATS , &bp->state); } +static void bnxt_get_one_ring_err_stats (struct bnxt *bp, +struct bnxt_total_ring_err_stats *stats, +struct bnxt_cp_ring_info *cpr) +{ +struct bnxt_sw_stats *sw_stats = &cpr->sw_stats; +u64 *hw_stats = cpr->stats.sw_stats; + + stats->rx_total_l4_csum_errors += sw_stats->rx.rx_l4_csum_errors; + stats->rx_total_resets += sw_stats->rx.rx_resets; + stats->rx_total_buf_errors += sw_stats->rx.rx_buf_errors; + stats->rx_total_oom_discards += sw_stats->rx.rx_oom_discards; + stats->rx_total_netpoll_discards += sw_stats->rx.rx_netpoll_discards; + stats->rx_total_ring_discards += +BNXT_GET_RING_STATS64 (hw_stats, rx_discard_pkts); + stats->tx_total_ring_discards += +BNXT_GET_RING_STATS64 (hw_stats, tx_discard_pkts); + stats->total_missed_irqs += sw_stats->cmn.missed_irqs; +} + +void bnxt_get_ring_err_stats (struct bnxt *bp, +struct bnxt_total_ring_err_stats *stats) +{ +int i; + +for (i =0 ; i < bp->cp_nr_rings; i++) +bnxt_get_one_ring_err_stats (bp, stats, &bp->bnapi[i]->cp_ring); +} +static bool bnxt_mc_list_updated (struct bnxt *bp,u32 *rx_mask) {struct net_device *dev = bp->dev;
drivers/net/ethernet/broadcom/bnxt/bnxt.h +15 -0
@@ -948,6 +948,17 @@ struct bnxt_sw_stats {struct bnxt_cmn_sw_stats cmn; }; +struct bnxt_total_ring_err_stats { +u64 rx_total_l4_csum_errors; +u64 rx_total_resets; +u64 rx_total_buf_errors; +u64 rx_total_oom_discards; +u64 rx_total_netpoll_discards; +u64 rx_total_ring_discards; +u64 tx_total_ring_discards; +u64 total_missed_irqs; +}; +struct bnxt_stats_mem {u64 *sw_stats;u64 *hw_masks;
@@ -2018,6 +2029,8 @@ struct bnxt {u8 pri2cos_idx[8 ];u8 pri2cos_valid; +struct bnxt_total_ring_err_stats ring_err_stats_prev; +u16 hwrm_max_req_len;u16 hwrm_max_ext_req_len;unsigned int hwrm_cmd_timeout;
@@ -2344,6 +2357,8 @@ int bnxt_half_open_nic(struct bnxt *bp);void bnxt_half_close_nic (struct bnxt *bp);void bnxt_reenable_sriov (struct bnxt *bp);int bnxt_close_nic (struct bnxt *,bool ,bool ); +void bnxt_get_ring_err_stats (struct bnxt *bp, +struct bnxt_total_ring_err_stats *stats);int bnxt_dbg_hwrm_rd_reg (struct bnxt *bp,u32 reg_off,u16 num_words,u32 *reg_buf);void bnxt_fw_exception (struct bnxt *bp);
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 5/6 bnxt_en: Display the ring error counters under ethtool -S
In reply to Michael ChanThe existing driver displays the sum of 4 ring counters under ethtool -S. These counters are in the array bnxt_sw_func_stats. These counters are summed at the time of ethtool -S and will be lost when the device is reset.
Replace these counters with the new total ring error counters added in the last patch. These new counters are saved before reset. ethtool -S will now display the sum of the saved counters plus the current counters.
--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +23 -25
@@ -339,13 +339,15 @@ enum { RX_NETPOLL_DISCARDS, }; -static struct { -u64 counter; -char string[ETH_GSTRING_LEN ]; -} bnxt_sw_func_stats[] = { - {0 ,"rx_total_discard_pkts" }, - {0 ,"tx_total_discard_pkts" }, - {0 ,"rx_total_netpoll_discards" }, +static const char *const bnxt_ring_err_stats_arr[] = { +"rx_total_l4_csum_errors" , +"rx_total_resets" , +"rx_total_buf_errors" , +"rx_total_oom_discards" , +"rx_total_netpoll_discards" , +"rx_total_ring_discards" , +"tx_total_ring_discards" , +"total_missed_irqs" , };#define NUM_RING_RX_SW_STATS ARRAY_SIZE(bnxt_rx_sw_stats_str)
@@ -495,7 +497,7 @@ static const struct { BNXT_TX_STATS_PRI_ENTRIES(tx_packets), }; -#define BNXT_NUM_SW_FUNC_STATS ARRAY_SIZE(bnxt_sw_func_stats) +#define BNXT_NUM_RING_ERR_STATS ARRAY_SIZE(bnxt_ring_err_stats_arr)#define BNXT_NUM_PORT_STATS ARRAY_SIZE(bnxt_port_stats_arr)#define BNXT_NUM_STATS_PRI \ (ARRAY_SIZE(bnxt_rx_bytes_pri_arr) + \
@@ -532,7 +534,7 @@ static int bnxt_get_num_stats(struct bnxt *bp) {int num_stats =bnxt_get_num_ring_stats (bp); - num_stats +=BNXT_NUM_SW_FUNC_STATS ; + num_stats +=BNXT_NUM_RING_ERR_STATS ;if (bp->flags &BNXT_FLAG_PORT_STATS ) num_stats +=BNXT_NUM_PORT_STATS ;
@@ -583,18 +585,17 @@ static bool is_tx_ring(struct bnxt *bp, int ring_num)static void bnxt_get_ethtool_stats (struct net_device *dev,struct ethtool_stats *stats,u64 *buf) { -u32 i, j =0 ; +struct bnxt_total_ring_err_stats ring_err_stats = {0 };struct bnxt *bp =netdev_priv (dev); +u64 *curr, *prev;u32 tpa_stats; +u32 i, j =0 ;if (!bp->bnapi) { - j +=bnxt_get_num_ring_stats (bp) +BNXT_NUM_SW_FUNC_STATS ; + j +=bnxt_get_num_ring_stats (bp); goto skip_ring_stats; } -for (i =0 ; i <BNXT_NUM_SW_FUNC_STATS ; i++) - bnxt_sw_func_stats[i].counter =0 ; - tpa_stats =bnxt_get_num_tpa_ring_stats (bp);for (i =0 ; i < bp->cp_nr_rings; i++) {struct bnxt_napi *bnapi = bp->bnapi[i];
@@ -631,19 +632,16 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, sw = (u64 *)&cpr->sw_stats.cmn;for (k =0 ; k <NUM_RING_CMN_SW_STATS ; j++, k++) buf[j] = sw[k]; - - bnxt_sw_func_stats[RX_TOTAL_DISCARDS ].counter += -BNXT_GET_RING_STATS64 (sw_stats, rx_discard_pkts); - bnxt_sw_func_stats[TX_TOTAL_DISCARDS ].counter += -BNXT_GET_RING_STATS64 (sw_stats, tx_discard_pkts); - bnxt_sw_func_stats[RX_NETPOLL_DISCARDS ].counter += - cpr->sw_stats.rx.rx_netpoll_discards; } -for (i =0 ; i <BNXT_NUM_SW_FUNC_STATS ; i++, j++) - buf[j] = bnxt_sw_func_stats[i].counter; +bnxt_get_ring_err_stats (bp, &ring_err_stats); skip_ring_stats: + curr = &ring_err_stats.rx_total_l4_csum_errors; + prev = &bp->ring_err_stats_prev.rx_total_l4_csum_errors; +for (i =0 ; i <BNXT_NUM_RING_ERR_STATS ; i++, j++, curr++, prev++) + buf[j] = *curr + *prev; +if (bp->flags &BNXT_FLAG_PORT_STATS ) {u64 *port_stats = bp->port_stats.sw_stats;
@@ -745,8 +743,8 @@ static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) buf +=ETH_GSTRING_LEN ; } } -for (i =0 ; i <BNXT_NUM_SW_FUNC_STATS ; i++) { -strcpy (buf, bnxt_sw_func_stats[i].string); +for (i =0 ; i <BNXT_NUM_RING_ERR_STATS ; i++) { +strscpy (buf, bnxt_ring_err_stats_arr[i],ETH_GSTRING_LEN ); buf +=ETH_GSTRING_LEN ; }
Signature · 1 line
2.30.1
Michael Chan
maintainerPATCH v2 6/6 bnxt_en: Add tx_resets ring counter
In reply to Michael ChanAdd a new tx_resets ring counter. This counter will be saved as tx_total_resets across any reset. Since we currently do a full reset in bnxt_sched_reset_txr(), the per ring counter will always be cleared during reset. Only the tx_total_resets count will be meaningful and we only display this under ethtool -S.
---
v2: Fix typo in commit message.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 ++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 1 + 3 files changed, 10 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -0
@@ -9397,6 +9397,8 @@ static void bnxt_disable_napi(struct bnxt *bp)struct bnxt_cp_ring_info *cpr; cpr = &bnapi->cp_ring; +if (bnapi->tx_fault) + cpr->sw_stats.tx.tx_resets++;if (bnapi->in_reset) cpr->sw_stats.rx.rx_resets++;napi_disable (&bnapi->napi);
@@ -10951,6 +10953,7 @@ static void bnxt_get_one_ring_err_stats(struct bnxt *bp, stats->rx_total_netpoll_discards += sw_stats->rx.rx_netpoll_discards; stats->rx_total_ring_discards +=BNXT_GET_RING_STATS64 (hw_stats, rx_discard_pkts); + stats->tx_total_resets += sw_stats->tx.tx_resets; stats->tx_total_ring_discards +=BNXT_GET_RING_STATS64 (hw_stats, tx_discard_pkts); stats->total_missed_irqs += sw_stats->cmn.missed_irqs;
drivers/net/ethernet/broadcom/bnxt/bnxt.h +6 -0
@@ -939,12 +939,17 @@ struct bnxt_rx_sw_stats {u64 rx_netpoll_discards; }; +struct bnxt_tx_sw_stats { +u64 tx_resets; +}; +struct bnxt_cmn_sw_stats {u64 missed_irqs; };struct bnxt_sw_stats {struct bnxt_rx_sw_stats rx; +struct bnxt_tx_sw_stats tx;struct bnxt_cmn_sw_stats cmn; };
@@ -955,6 +960,7 @@ struct bnxt_total_ring_err_stats {u64 rx_total_oom_discards;u64 rx_total_netpoll_discards;u64 rx_total_ring_discards; +u64 tx_total_resets;u64 tx_total_ring_discards;u64 total_missed_irqs; };
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +1 -0
@@ -346,6 +346,7 @@ static const char *const bnxt_ring_err_stats_arr[] = {"rx_total_oom_discards" ,"rx_total_netpoll_discards" ,"rx_total_ring_discards" , +"tx_total_resets" ,"tx_total_ring_discards" , "total_missed_irqs", };
Signature · 1 line
2.30.1
Jakub Kicinski
maintainerQuoted 1 line · On Thu, 17 Aug 2023 16:19:05 -0700 Michael Chan wrote:
- Saving of the ring error counters across reset.
Thank you for following up!
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 8 lines · On Thu, 17 Aug 2023 16:19:05 -0700 you wrote:
This patchset contains 2 features:
- The page pool implementation for the normal RX path (non-XDP) for paged buffers in the aggregation ring.
- Saving of the ring error counters across reset.
[...]
Here is the summary with links:
- [net-next,v2,1/6] bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP
https://git.kernel.org/netdev/net-next/c/86b05508f775 - [net-next,v2,2/6] bnxt_en: Let the page pool manage the DMA mapping https://git.kernel.org/netdev/net-next/c/578fcfd26e2a - [net-next,v2,3/6] bnxt_en: Increment rx_resets counter in bnxt_disable_napi() https://git.kernel.org/netdev/net-next/c/d38c19b13b10 - [net-next,v2,4/6] bnxt_en: Save ring error counters across reset https://git.kernel.org/netdev/net-next/c/4c70dbe3c008 - [net-next,v2,5/6] bnxt_en: Display the ring error counters under ethtool -S https://git.kernel.org/netdev/net-next/c/a080b47a04c5 - [net-next,v2,6/6] bnxt_en: Add tx_resets ring counter https://git.kernel.org/netdev/net-next/c/8becd1961c73
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html