igb(4) - flowid

Patch poprawiający rozkładanie przerwań w przypadku pracy na PPPoE:

http://static.ipfw.ru/patches/igb_flowid.diff

Kopia:

igb_flowid.diff
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;