Date: Fri, 19 Nov 2004 19:17:49 +0900 From: Shunsuke SHINOMIYA <shino@fornext.org> To: Jeremie Le Hen <jeremie@le-hen.org> Cc: freebsd-stable@freebsd.org Subject: Re[2]: serious networking (em) performance (ggate and NFS) problem Message-ID: <20041119185315.C43D.SHINO@fornext.org> In-Reply-To: <20041119080957.GL69710@obiwan.tataz.chchile.org> References: <20041119114233.C43B.SHINO@fornext.org> <20041119080957.GL69710@obiwan.tataz.chchile.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi, Jeremie, how is this?
To disable Interrupt Moderation, sysctl hw.em?.int_throttle_valve=0.
However, because this patch is just made now, it is not fully tested.
> > if you suppose your computer has sufficient performance, please try to
> > disable or adjust parameters of Interrupt Moderation of em.
>
> Nice ! It would be even better if there was a boot-time sysctl to
> configure the behaviour of this feature, or something like ifconfig
> link0 option of the fxp(4) driver.
--
Shunsuke SHINOMIYA <shino@fornext.org>
[-- Attachment #2 --]
--- if_em.c-1.44.2.3.orig Tue Nov 9 05:06:14 2004
+++ if_em.c Fri Nov 19 19:01:11 2004
@@ -182,6 +182,9 @@ static int em_sysctl_int_delay(SYSCTL_H
static void em_add_int_delay_sysctl(struct adapter *, const char *,
const char *, struct em_int_delay_info *,
int, int);
+#if 1
+static int em_sysctl_throttle_valve(SYSCTL_HANDLER_ARGS);
+#endif
/*********************************************************************
* FreeBSD Device Interface Entry Points
@@ -358,6 +361,13 @@ em_attach(device_t dev)
&adapter->tx_abs_int_delay,
E1000_REG_OFFSET(&adapter->hw, TADV),
em_tx_abs_int_delay_dflt);
+#if 1
+ SYSCTL_ADD_PROC(&adapter->sysctl_ctx,
+ SYSCTL_CHILDREN(adapter->sysctl_tree), OID_AUTO,
+ "int_throttle_valve", CTLTYPE_INT|CTLFLAG_RW,
+ adapter, 0, em_sysctl_throttle_valve, "IU",
+ "interrupt throttling rate");
+#endif
}
/* Parameters (to be read from user) */
@@ -403,6 +413,10 @@ em_attach(device_t dev)
*/
adapter->hw.report_tx_early = 1;
+#if 1
+#define MAX_INTS_PER_SEC 8000
+ adapter->throttle_valve = MAX_INTS_PER_SEC;
+#endif
if (em_allocate_pci_resources(adapter)) {
printf("em%d: Allocation of PCI resources failed\n",
@@ -2608,12 +2622,16 @@ em_initialize_receive_unit(struct adapte
if(adapter->hw.mac_type >= em_82540) {
E1000_WRITE_REG(&adapter->hw, RADV,
adapter->rx_abs_int_delay.value);
-
+#if 1
+ E1000_WRITE_REG(&adapter->hw, ITR,
+ 1000000000 / (adapter->throttle_valve * 256));
+#else
/* Set the interrupt throttling rate. Value is calculated
* as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
#define MAX_INTS_PER_SEC 8000
#define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256)
E1000_WRITE_REG(&adapter->hw, ITR, DEFAULT_ITR);
+#endif
}
/* Setup the Base and Length of the Rx Descriptor Ring */
@@ -3383,4 +3401,35 @@ em_add_int_delay_sysctl(struct adapter *
SYSCTL_CHILDREN(adapter->sysctl_tree),
OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW,
info, 0, em_sysctl_int_delay, "I", description);
+}
+
+static int
+em_sysctl_throttle_valve(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter;
+ int error;
+ u_int32_t valve;
+ int s;
+ int value;
+
+ adapter = (struct adapter *)arg1;
+ valve = adapter->throttle_valve;
+ error = sysctl_handle_int(oidp, &valve, 0, req);
+ if (error != 0 || req->newptr == NULL)
+ return error;
+ adapter->throttle_valve = valve;
+
+ s = splimp();
+
+ /* Set the interrupt throttling rate. Value is calculated
+ * as ITR = 1/(INTS_PER_SEC * 256ns) */
+ if(valve > 0)
+ value = 1000000000/(valve * 256);
+ else
+ value = 0;
+ E1000_WRITE_REG(&adapter->hw, ITR, value);
+
+ splx(s);
+
+ return 0;
}
--- if_em.h-1.25.2.1.orig Fri Nov 19 19:00:03 2004
+++ if_em.h Fri Nov 19 18:18:57 2004
@@ -353,6 +353,9 @@
u_int16_t link_speed;
u_int16_t link_duplex;
u_int32_t smartspeed;
+#if 1
+ u_int32_t throttle_valve;
+#endif
struct em_int_delay_info tx_int_delay;
struct em_int_delay_info tx_abs_int_delay;
struct em_int_delay_info rx_int_delay;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041119185315.C43D.SHINO>
