e1000/e1000e: implement a simple interrupt moderation
Back before e1000-7.3.20, the e1000 driver had a simple algorithm that managed interrupt moderation. The driver was updated in 7.3.20 to have the new "adaptive" interrupt moderation but we have customer requests to redeploy the old way as an option. This patch adds the old functionality back. The new functionality can be enabled via module parameter or at runtime via ethtool. Module parameter: (InterruptThrottleRate=4) to use this new moderation method. Ethtool method: ethtool -C ethX rx-usecs 4 Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
edf15c1742
commit
eab2abf582
@@ -52,7 +52,7 @@
|
||||
|
||||
#include "e1000.h"
|
||||
|
||||
#define DRV_VERSION "1.0.2-k2"
|
||||
#define DRV_VERSION "1.0.2-k4"
|
||||
char e1000e_driver_name[] = "e1000e";
|
||||
const char e1000e_driver_version[] = DRV_VERSION;
|
||||
|
||||
@@ -4070,6 +4070,22 @@ link_up:
|
||||
}
|
||||
}
|
||||
|
||||
/* Simple mode for Interrupt Throttle Rate (ITR) */
|
||||
if (adapter->itr_setting == 4) {
|
||||
/*
|
||||
* Symmetric Tx/Rx gets a reduced ITR=2000;
|
||||
* Total asymmetrical Tx or Rx gets ITR=8000;
|
||||
* everyone else is between 2000-8000.
|
||||
*/
|
||||
u32 goc = (adapter->gotc + adapter->gorc) / 10000;
|
||||
u32 dif = (adapter->gotc > adapter->gorc ?
|
||||
adapter->gotc - adapter->gorc :
|
||||
adapter->gorc - adapter->gotc) / 10000;
|
||||
u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
|
||||
|
||||
ew32(ITR, 1000000000 / (itr * 256));
|
||||
}
|
||||
|
||||
/* Cause software interrupt to ensure Rx ring is cleaned */
|
||||
if (adapter->msix_entries)
|
||||
ew32(ICS, adapter->rx_ring->ims_val);
|
||||
|
Reference in New Issue
Block a user