Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Oct 2015 17:34:18 +0000 (UTC)
From:      Sean Bruno <sbruno@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r289238 - head/sys/dev/ixgbe
Message-ID:  <201510131734.t9DHYI4e003241@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sbruno
Date: Tue Oct 13 17:34:18 2015
New Revision: 289238
URL: https://svnweb.freebsd.org/changeset/base/289238

Log:
  Add support for sysctl knobs to live tune the per interrupt rx/tx packet
  processing limits in ixgbe(4)
  
  Differential Revision:	https://reviews.freebsd.org/D3719
  Submitted by:	jason wolfe (j-nitrology.com)
  MFC after:	2 weeks

Modified:
  head/sys/dev/ixgbe/if_ix.c
  head/sys/dev/ixgbe/if_ixv.c
  head/sys/dev/ixgbe/ix_txrx.c
  head/sys/dev/ixgbe/ixgbe.h

Modified: head/sys/dev/ixgbe/if_ix.c
==============================================================================
--- head/sys/dev/ixgbe/if_ix.c	Tue Oct 13 17:31:11 2015	(r289237)
+++ head/sys/dev/ixgbe/if_ix.c	Tue Oct 13 17:34:18 2015	(r289238)
@@ -170,6 +170,8 @@ static void	ixgbe_add_device_sysctls(str
 static void     ixgbe_add_hw_stats(struct adapter *);
 
 /* Sysctl handlers */
+static void	ixgbe_set_sysctl_value(struct adapter *, const char *,
+		    const char *, int *, int);
 static int	ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
 static int	ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
 static int	ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
@@ -461,6 +463,15 @@ ixgbe_attach(device_t dev)
 		goto err_out;
 	}
 
+	/* Sysctls for limiting the amount of work done in the taskqueues */
+	ixgbe_set_sysctl_value(adapter, "rx_processing_limit",
+	    "max number of rx packets to process",
+	    &adapter->rx_process_limit, ixgbe_rx_process_limit);
+
+	ixgbe_set_sysctl_value(adapter, "tx_processing_limit",
+	    "max number of tx packets to process",
+	&adapter->tx_process_limit, ixgbe_tx_process_limit);
+
 	/* Do descriptor calc and sanity checks */
 	if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
 	    ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
@@ -2877,9 +2888,6 @@ ixgbe_initialize_transmit_units(struct a
 		/* Cache the tail address */
 		txr->tail = IXGBE_TDT(j);
 
-		/* Set the processing limit */
-		txr->process_limit = ixgbe_tx_process_limit;
-
 		/* Disable Head Writeback */
 		switch (hw->mac.type) {
 		case ixgbe_mac_82598EB:
@@ -3136,9 +3144,6 @@ ixgbe_initialize_receive_units(struct ad
 		IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
 		IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
 
-		/* Set the processing limit */
-		rxr->process_limit = ixgbe_rx_process_limit;
-
 		/* Set the driver rx tail address */
 		rxr->tail =  IXGBE_RDT(rxr->me);
 	}
@@ -4458,6 +4463,16 @@ ixgbe_add_hw_stats(struct adapter *adapt
 			"1024-1522 byte frames transmitted");
 }
 
+static void
+ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
+    const char *description, int *limit, int value)
+{
+	*limit = value;
+	SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
+	    SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
+	    OID_AUTO, name, CTLFLAG_RW, limit, value, description);
+}
+
 /*
 ** Set flow control using sysctl:
 ** Flow control values:

Modified: head/sys/dev/ixgbe/if_ixv.c
==============================================================================
--- head/sys/dev/ixgbe/if_ixv.c	Tue Oct 13 17:31:11 2015	(r289237)
+++ head/sys/dev/ixgbe/if_ixv.c	Tue Oct 13 17:34:18 2015	(r289238)
@@ -115,6 +115,8 @@ static void	ixv_save_stats(struct adapte
 static void	ixv_init_stats(struct adapter *);
 static void	ixv_update_stats(struct adapter *);
 static void	ixv_add_stats_sysctls(struct adapter *);
+static void	ixv_set_sysctl_value(struct adapter *, const char *,
+		    const char *, int *, int);
 
 /* The MSI/X Interrupt handlers */
 static void	ixv_msix_que(void *);
@@ -325,6 +327,15 @@ ixv_attach(device_t dev)
 		goto err_out;
 	}
 
+	/* Sysctls for limiting the amount of work done in the taskqueues */
+	ixv_set_sysctl_value(adapter, "rx_processing_limit",
+	    "max number of rx packets to process",
+	    &adapter->rx_process_limit, ixv_rx_process_limit);
+
+	ixv_set_sysctl_value(adapter, "tx_processing_limit",
+	    "max number of tx packets to process",
+	    &adapter->tx_process_limit, ixv_tx_process_limit);
+
 	/* Do descriptor calc and sanity checks */
 	if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
 	    ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
@@ -1600,9 +1611,6 @@ ixv_initialize_transmit_units(struct ada
 		/* Set Tx Tail register */
 		txr->tail = IXGBE_VFTDT(i);
 
-		/* Set the processing limit */
-		txr->process_limit = ixv_tx_process_limit;
-
 		/* Set Ring parameters */
 		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i),
 		       (tdba & 0x00000000ffffffffULL));
@@ -1691,9 +1699,6 @@ ixv_initialize_receive_units(struct adap
 		reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
 		IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), reg);
 
-		/* Set the processing limit */
-		rxr->process_limit = ixv_rx_process_limit;
-
 		/* Capture Rx Tail index */
 		rxr->tail = IXGBE_VFRDT(rxr->me);
 
@@ -2122,6 +2127,16 @@ ixv_add_stats_sysctls(struct adapter *ad
 			"# of times not enough descriptors were available during TX");
 }
 
+static void
+ixv_set_sysctl_value(struct adapter *adapter, const char *name,
+	const char *description, int *limit, int value)
+{
+	*limit = value;
+	SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
+	    SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
+	    OID_AUTO, name, CTLFLAG_RW, limit, value, description);
+}
+
 /**********************************************************************
  *
  *  This routine is called only when em_display_debug_stats is enabled.

Modified: head/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- head/sys/dev/ixgbe/ix_txrx.c	Tue Oct 13 17:31:11 2015	(r289237)
+++ head/sys/dev/ixgbe/ix_txrx.c	Tue Oct 13 17:34:18 2015	(r289238)
@@ -986,12 +986,12 @@ ixgbe_tso_setup(struct tx_ring *txr, str
 void
 ixgbe_txeof(struct tx_ring *txr)
 {
-#ifdef DEV_NETMAP
 	struct adapter		*adapter = txr->adapter;
+#ifdef DEV_NETMAP
 	struct ifnet		*ifp = adapter->ifp;
 #endif
 	u32			work, processed = 0;
-	u16			limit = txr->process_limit;
+	u32			limit = adapter->tx_process_limit;
 	struct ixgbe_tx_buf	*buf;
 	union ixgbe_adv_tx_desc *txd;
 
@@ -1747,7 +1747,7 @@ ixgbe_rxeof(struct ix_queue *que)
 	struct lro_entry	*queued;
 	int			i, nextp, processed = 0;
 	u32			staterr = 0;
-	u16			count = rxr->process_limit;
+	u32			count = adapter->rx_process_limit;
 	union ixgbe_adv_rx_desc	*cur;
 	struct ixgbe_rx_buf	*rbuf, *nbuf;
 	u16			pkt_info;

Modified: head/sys/dev/ixgbe/ixgbe.h
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.h	Tue Oct 13 17:31:11 2015	(r289237)
+++ head/sys/dev/ixgbe/ixgbe.h	Tue Oct 13 17:34:18 2015	(r289238)
@@ -365,7 +365,6 @@ struct tx_ring {
 	volatile u16		tx_avail;
 	u16			next_avail_desc;
 	u16			next_to_clean;
-	u16			process_limit;
 	u16			num_desc;
 	u32			txd_cmd;
 	bus_dma_tag_t		txtag;
@@ -407,7 +406,6 @@ struct rx_ring {
         u16 			next_to_check;
 	u16			num_desc;
 	u16			mbuf_sz;
-	u16			process_limit;
 	char			mtx_name[16];
 	struct ixgbe_rx_buf	*rx_buffers;
 	bus_dma_tag_t		ptag;
@@ -539,6 +537,7 @@ struct adapter {
 	 */
 	struct tx_ring		*tx_rings;
 	u32			num_tx_desc;
+	u32			tx_process_limit;
 
 	/*
 	 * Receive rings:
@@ -547,6 +546,7 @@ struct adapter {
 	struct rx_ring		*rx_rings;
 	u64			active_queues;
 	u32			num_rx_desc;
+	u32			rx_process_limit;
 
 	/* Multicast array memory */
 	struct ixgbe_mc_addr	*mta;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510131734.t9DHYI4e003241>