Patch poprawiający rozkładanie przerwań w przypadku pracy na PPPoE:
http://static.ipfw.ru/patches/igb_flowid.diff
Kopia:
Index: sys/dev/e1000/if_igb.c
===================================================================
--- sys/dev/e1000/if_igb.c (revision 233938)
+++ sys/dev/e1000/if_igb.c (working copy)
@@ -370,6 +370,15 @@ SYSCTL_INT(_hw_igb, OID_AUTO, rx_process_limit, CT
&igb_rx_process_limit, 0,
"Maximum number of received packets to process at a time, -1 means unlimited");
+/*
+** Tune flowid generation. IF turned on,
+** mbuf flowid is set to adapter queue number
+*/
+static int igb_generate_flowid = TRUE;
+TUNABLE_INT("hw.igb.generate_flowid", &igb_generate_flowid);
+SYSCTL_INT(_hw_igb, OID_AUTO, generate_flowid, CTLFLAG_RW, &igb_generate_flowid, 0,
+ "Enable flowid generation");
+
#ifdef DEV_NETMAP /* see ixgbe.c for details */
#include <dev/netmap/if_igb_netmap.h>
#endif /* DEV_NETMAP */
@@ -513,6 +522,10 @@ igb_attach(device_t dev)
} else
adapter->num_rx_desc = igb_rxd;
+ igb_set_sysctl_value(adapter, "generate_flowid",
+ "Enable flowid generation", &adapter->generate_flowid,
+ igb_generate_flowid);
+
adapter->hw.mac.autoneg = DO_AUTO_NEG;
adapter->hw.phy.autoneg_wait_to_complete = FALSE;
adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
@@ -4742,8 +4755,10 @@ igb_rxeof(struct igb_queue *que, int count, int *d
rxr->fmp->m_flags |= M_VLANTAG;
}
#if __FreeBSD_version >= 800000
- rxr->fmp->m_pkthdr.flowid = que->msix;
- rxr->fmp->m_flags |= M_FLOWID;
+ if (adapter->generate_flowid != 0) {
+ rxr->fmp->m_pkthdr.flowid = que->msix;
+ rxr->fmp->m_flags |= M_FLOWID;
+ }
#endif
sendmp = rxr->fmp;
/* Make sure to set M_PKTHDR. */
Index: sys/dev/e1000/if_igb.h
===================================================================
--- sys/dev/e1000/if_igb.h (revision 233938)
+++ sys/dev/e1000/if_igb.h (working copy)
@@ -406,6 +406,7 @@ struct adapter {
u32 smartspeed;
u32 dmac;
int enable_aim;
+ int generate_flowid;
/* Interface queues */
struct igb_queue *queues;