PERFORCE change 197123 for review

Takuya ASADA syuu at FreeBSD.org
Wed Aug 3 10:52:13 UTC 2011


http://p4web.freebsd.org/@@197123?ac=10

Change 197123 by syuu at kikurage on 2011/08/03 10:51:23

	mq_bpf support for ixgbe

Affected files ...

.. //depot/projects/soc2011/mq_bpf/src/sys/dev/ixgbe/ixgbe.c#2 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/dev/ixgbe/ixgbe.h#2 edit

Differences ...

==== //depot/projects/soc2011/mq_bpf/src/sys/dev/ixgbe/ixgbe.c#2 (text+ko) ====

@@ -195,6 +195,12 @@
 static void	ixgbe_reinit_fdir(void *, int);
 #endif
 
+static int	ixgbe_get_rxqueue_len(struct ifnet *);
+static int	ixgbe_get_txqueue_len(struct ifnet *);
+static int	ixgbe_get_rxqueue_affinity(struct ifnet *, int);
+static int	ixgbe_get_txqueue_affinity(struct ifnet *, int);
+
+
 /*********************************************************************
  *  FreeBSD Device Interface Entry Points
  *********************************************************************/
@@ -712,6 +718,10 @@
 			IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
 			break;
 		}
+
+		m_head->m_pkthdr.rxqueue = (uint32_t)-1;
+		m_head->m_pkthdr.txqueue = txr->me;
+
 		/* Send a copy of the frame to the BPF listener */
 		ETHER_BPF_MTAP(ifp, m_head);
 
@@ -806,6 +816,10 @@
 		}
 		enqueued++;
 		drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags);
+
+		next->m_pkthdr.rxqueue = (uint32_t)-1;
+		next->m_pkthdr.txqueue = txr->me;
+
 		/* Send a copy of the frame to the BPF listener */
 		ETHER_BPF_MTAP(ifp, next);
 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
@@ -2399,6 +2413,11 @@
 	ifp->if_transmit = ixgbe_mq_start;
 	ifp->if_qflush = ixgbe_qflush;
 #endif
+	ifp->if_get_rxqueue_len = ixgbe_get_rxqueue_len;
+	ifp->if_get_txqueue_len = ixgbe_get_txqueue_len;
+	ifp->if_get_rxqueue_affinity = ixgbe_get_rxqueue_affinity;
+	ifp->if_get_txqueue_affinity = ixgbe_get_txqueue_affinity;
+
 	ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 2;
 
 	ether_ifattach(ifp, adapter->hw.mac.addr);
@@ -2414,6 +2433,7 @@
 	ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4 | IFCAP_VLAN_HWCSUM;
 	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
 	ifp->if_capabilities |= IFCAP_JUMBO_MTU;
+	ifp->if_capabilities |= IFCAP_MULTIQUEUE;
 	ifp->if_capenable = ifp->if_capabilities;
 
 	/* Don't enable LRO by default */
@@ -4123,6 +4143,8 @@
 		struct mbuf	*sendmp, *mh, *mp;
 		u32		rsc, ptype;
 		u16		hlen, plen, hdr, vtag;
+		u32		rss;
+		u8		rsstype;
 		bool		eop;
  
 		/* Sync the ring. */
@@ -4150,6 +4172,9 @@
 		ptype = le32toh(cur->wb.lower.lo_dword.data) &
 		    IXGBE_RXDADV_PKTTYPE_MASK;
 		hdr = le16toh(cur->wb.lower.lo_dword.hs_rss.hdr_info);
+		rss = le32toh(cur->wb.lower.hi_dword.rss);
+		rsstype = le32toh(cur->wb.lower.lo_dword.data) &
+		    IXGBE_RXDADV_RSSTYPE_MASK;
 		vtag = le16toh(cur->wb.upper.vlan);
 		eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
 
@@ -4304,9 +4329,29 @@
 			if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
 				ixgbe_rx_checksum(staterr, sendmp, ptype);
 #if __FreeBSD_version >= 800000
-			sendmp->m_pkthdr.flowid = que->msix;
+			sendmp->m_pkthdr.flowid = rss;
 			sendmp->m_flags |= M_FLOWID;
+			switch (rsstype) {
+			case IXGBE_HASH_TCP_IPV4:
+				M_HASHTYPE_SET(sendmp, M_HASHTYPE_RSS_TCP_IPV4);
+				break;
+			case IXGBE_HASH_IPV4:
+			case IXGBE_HASH_UDP_IPV4:
+				M_HASHTYPE_SET(sendmp, M_HASHTYPE_RSS_IPV4);
+				break;
+			case IXGBE_HASH_TCP_IPV6:
+				M_HASHTYPE_SET(sendmp, M_HASHTYPE_RSS_TCP_IPV6);
+				break;
+			case IXGBE_HASH_IPV6:
+			case IXGBE_HASH_UDP_IPV6:
+				M_HASHTYPE_SET(sendmp, M_HASHTYPE_RSS_IPV6);
+				break;
+			default:
+				M_HASHTYPE_SET(sendmp, M_HASHTYPE_NONE);
+			}
 #endif
+			sendmp->m_pkthdr.rxqueue = que->msix;
+			sendmp->m_pkthdr.txqueue = (uint32_t)-1;
 		}
 next_desc:
 		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
@@ -5365,3 +5410,29 @@
 
 	return (error);
 }
+
+static int
+ixgbe_get_rxqueue_len(struct ifnet *ifp)
+{
+	struct adapter	*adapter = ifp->if_softc;
+	return (adapter->num_queues);
+}
+
+static int
+ixgbe_get_txqueue_len(struct ifnet *ifp)
+{
+	struct adapter	*adapter = ifp->if_softc;
+	return (adapter->num_queues);
+}
+
+static int
+ixgbe_get_rxqueue_affinity(struct ifnet *ifp, int queid)
+{
+	return (queid);
+}
+
+static int
+ixgbe_get_txqueue_affinity(struct ifnet *ifp, int queid)
+{
+	return (queid);
+}

==== //depot/projects/soc2011/mq_bpf/src/sys/dev/ixgbe/ixgbe.h#2 (text+ko) ====

@@ -366,10 +366,12 @@
 
 	struct ifmedia		media;
 	struct callout		timer;
+	struct callout		timer2;
 	int			msix;
 	int			if_flags;
 
 	struct mtx		core_mtx;
+	struct mtx		core_mtx2;
 
 	eventhandler_tag 	vlan_attach;
 	eventhandler_tag 	vlan_detach;
@@ -517,4 +519,12 @@
 		    rxr->next_to_refresh - 1);
 }       
 
+#define IXGBE_HASH_NONE		0x0
+#define IXGBE_HASH_TCP_IPV4	0x1
+#define IXGBE_HASH_IPV4		0x2
+#define IXGBE_HASH_TCP_IPV6	0x3
+#define IXGBE_HASH_IPV6		0x5
+#define IXGBE_HASH_UDP_IPV4	0x7
+#define IXGBE_HASH_UDP_IPV6	0x8
+
 #endif /* _IXGBE_H_ */


More information about the p4-projects mailing list