Module Name: src Committed By: msaitoh Date: Wed Sep 8 09:09:47 UTC 2021
Modified Files: src/sys/dev/pci/ixgbe: ix_txrx.c Log Message: Reduce bus_dmamap_sync() cost. - Don't sync whole descriptor ring but limited counts(rx_process_limit) descriptors. - Dont' sync every loop. To generate a diff of this commit: cvs rdiff -u -r1.93 -r1.94 src/sys/dev/pci/ixgbe/ix_txrx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/ixgbe/ix_txrx.c diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.93 src/sys/dev/pci/ixgbe/ix_txrx.c:1.94 --- src/sys/dev/pci/ixgbe/ix_txrx.c:1.93 Wed Sep 8 08:46:28 2021 +++ src/sys/dev/pci/ixgbe/ix_txrx.c Wed Sep 8 09:09:47 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ix_txrx.c,v 1.93 2021/09/08 08:46:28 msaitoh Exp $ */ +/* $NetBSD: ix_txrx.c,v 1.94 2021/09/08 09:09:47 msaitoh Exp $ */ /****************************************************************************** @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.93 2021/09/08 08:46:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.94 2021/09/08 09:09:47 msaitoh Exp $"); #include "opt_inet.h" #include "opt_inet6.h" @@ -1804,9 +1804,11 @@ ixgbe_rxeof(struct ix_queue *que) struct ixgbe_rx_buf *rbuf, *nbuf; int i, nextp, processed = 0; u32 staterr = 0; - u32 loopcount = 0; + u32 loopcount = 0, numdesc; u32 limit = adapter->rx_process_limit; bool discard_multidesc = rxr->discard_multidesc; + bool wraparound = false; + unsigned int syncremain; #ifdef RSS u16 pkt_info; #endif @@ -1823,6 +1825,24 @@ ixgbe_rxeof(struct ix_queue *que) } #endif /* DEV_NETMAP */ + /* Sync the ring. The size is rx_process_limit or the first half */ + if ((rxr->next_to_check + limit) <= rxr->num_desc) { + /* Non-wraparound */ + numdesc = limit; + syncremain = 0; + } else { + /* Wraparound. Sync the first half. */ + numdesc = rxr->num_desc - rxr->next_to_check; + + /* Set the size of the last half */ + syncremain = limit - numdesc; + } + bus_dmamap_sync(rxr->rxdma.dma_tag->dt_dmat, + rxr->rxdma.dma_map, + sizeof(union ixgbe_adv_rx_desc) * rxr->next_to_check, + sizeof(union ixgbe_adv_rx_desc) * numdesc, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + /* * The max number of loop is rx_process_limit. If discard_multidesc is * true, continue processing to not to send broken packet to the upper @@ -1839,9 +1859,22 @@ ixgbe_rxeof(struct ix_queue *que) bool eop; bool discard = false; - /* Sync the ring. */ - ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + if (wraparound) { + /* Sync the last half. */ + KASSERT(syncremain != 0); + numdesc = syncremain; + wraparound = false; + } else if (__predict_false(loopcount >= limit)) { + KASSERT(discard_multidesc == true); + numdesc = 1; + } else + numdesc = 0; + + if (numdesc != 0) + bus_dmamap_sync(rxr->rxdma.dma_tag->dt_dmat, + rxr->rxdma.dma_map, 0, + sizeof(union ixgbe_adv_rx_desc) * numdesc, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); cur = &rxr->rx_base[i]; staterr = le32toh(cur->wb.upper.status_error); @@ -2105,8 +2138,10 @@ next_desc: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Advance our pointers to the next descriptor. */ - if (++i == rxr->num_desc) + if (++i == rxr->num_desc) { + wraparound = true; i = 0; + } rxr->next_to_check = i; /* Now send to the stack or do LRO */