[net-next,3/7] net: aquantia: Introduce rx refill threshold value
diff mbox series

Message ID 61fab9293b89737afcdd8b848f1685ce8cb6eb8f.1553353914.git.igor.russkikh@aquantia.com
State Accepted
Delegated to: David Miller
Headers show
  • net: aquantia: RX performance optimization patches
Related show

Commit Message

Igor Russkikh March 23, 2019, 3:23 p.m. UTC
Before that, we've refilled ring even on single descriptor move.
Under high packet load that caused page allocation logic to be triggered
too often. That made overall ring processing slower.

Moreover, with page buffer reuse implemented, we should give a chance
higher networking levels to process received packets faster, release
the pages they consumed and therefore give a higher chance for these
pages to be reused.

RX ring is now refilled only when AQ_CFG_RX_REFILL_THRES or more
descriptors were processed (32 by default). Under regular traffic this
gives quite enough time for packet to be consumed and page to be reused.

Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
 drivers/net/ethernet/aquantia/atlantic/aq_cfg.h  | 2 ++
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 4 ++++
 2 files changed, 6 insertions(+)

diff mbox series

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
index 80c16ab87771..551c5cc1714b 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
@@ -38,6 +38,8 @@ 
 #define AQ_CFG_RX_HDR_SIZE 256U
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
index 1b258694144c..21c486cecbad 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -418,6 +418,10 @@  int aq_ring_rx_fill(struct aq_ring_s *self)
 	int err = 0;
 	int i = 0;
+	if (aq_ring_avail_dx(self) < min_t(unsigned int, AQ_CFG_RX_REFILL_THRES,
+					   self->size / 2))
+		return err;
 	for (i = aq_ring_avail_dx(self); i--;
 		self->sw_tail = aq_ring_next_dx(self, self->sw_tail)) {
 		buff = &self->buff_ring[self->sw_tail];