PERFORCE change 195038 for review

Takuya ASADA syuu at FreeBSD.org
Mon Jun 20 16:16:19 UTC 2011


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

Change 195038 by syuu at kikurage on 2011/06/20 16:15:36

	mbuf.h and priv.h aren't commited on previous commit mistakenly, so added them
	SOFTRSS MQ-BPF TX Handling, MQ BPF on igb bug fix

Affected files ...

.. //depot/projects/soc2011/mq_bpf/src/sys/amd64/conf/GENERIC#2 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#6 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#8 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/if.h#3 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/if_ethersubr.c#3 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/sys/mbuf.h#3 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/sys/priv.h#2 edit
.. //depot/projects/soc2011/mq_bpf/tests/queue_affinity.c#3 edit

Differences ...

==== //depot/projects/soc2011/mq_bpf/src/sys/amd64/conf/GENERIC#2 (text+ko) ====


==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#6 (text+ko) ====

@@ -655,15 +655,15 @@
 	adapter->ifp->if_rxq_num = adapter->num_queues;
 	adapter->ifp->if_txq_num = adapter->num_queues;
 	adapter->ifp->if_rxq_affinity = 
-		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		(u_long *)malloc(sizeof(u_long) * adapter->ifp->if_rxq_num,
 		M_DEVBUF, M_NOWAIT);
 	adapter->ifp->if_txq_affinity = 
-		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		(u_long *)malloc(sizeof(u_long) * adapter->ifp->if_txq_num,
 		M_DEVBUF, M_NOWAIT);
-	for (i = 0; i < adapter->num_queues; i++) {
+	for (i = 0; i < adapter->ifp->if_rxq_num; i++)
 		adapter->ifp->if_rxq_affinity[i] = i;
-		adapter->ifp->if_rxq_affinity[i] = i;
-	}
+	for (i = 0; i < adapter->ifp->if_txq_num; i++)
+		adapter->ifp->if_txq_affinity[i] = i;
 	INIT_DEBUGOUT("igb_attach: end");
 
 	return (0);

==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#8 (text+ko) ====

@@ -1615,6 +1615,8 @@
 	case BIOCTXQAFFINITY:
 		{
 			u_long index;
+			struct ifnet *ifp;
+
 			if (d->bd_bif == NULL) {
 				log(LOG_ERR, "d->bd_bif == NULL\n");
 				/*
@@ -1624,7 +1626,7 @@
 				SDT_PROBE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, -1, -1);
 				break;
 			}
-			struct ifnet *const ifp = d->bd_bif->bif_ifp;
+			ifp = d->bd_bif->bif_ifp;
 			index = *(u_long *)addr;
 			if (index > ifp->if_txq_num) {
 				log(LOG_ERR, "BIOCTXQAFFINITY: index too large index:%lx txq_num:%x\n", index, ifp->if_txq_num);
@@ -1645,6 +1647,7 @@
 
 	case BIOCENAQMASK:
 		{
+			int i;
 			struct ifnet *ifp;
 
 			if (d->bd_bif == NULL) {
@@ -1663,20 +1666,30 @@
 				break;
 			}
 			ifp = d->bd_bif->bif_ifp;
+			if (!(ifp->if_capenable & IFCAP_MULTIQUEUE)) {
 #ifdef SOFTRSS
-			if (!(ifp->if_capenable & IFCAP_MULTIQUEUE)) {
 				ifp->if_rxq_num = netisr_get_cpucount();
-				ifp->if_capabilities |= IFCAP_MULTIQUEUE;
-				ifp->if_capenable |= IFCAP_MULTIQUEUE;
-			}
+				ifp->if_txq_num = 1;
+				ifp->if_capabilities |= IFCAP_SOFT_MULTIQUEUE;
+				ifp->if_capenable |= IFCAP_SOFT_MULTIQUEUE;
+				ifp->if_rxq_affinity = 
+					(u_long *)malloc(sizeof(u_long) * ifp->if_rxq_num,
+					M_DEVBUF, M_NOWAIT);
+				ifp->if_txq_affinity = 
+					(u_long *)malloc(sizeof(u_long) * ifp->if_txq_num,
+					M_DEVBUF, M_NOWAIT);
+				for (i = 0; i < ifp->if_rxq_num; i++)
+					ifp->if_rxq_affinity[i] = i;
+				for (i = 0; i < ifp->if_txq_num; i++)
+					ifp->if_txq_affinity[i] = i;
 #else
-			if (!(ifp->if_capenable & IFCAP_MULTIQUEUE)) {
 				log(LOG_ERR, "if doesn't support multiqueue");
 				error = EINVAL;
 				SDT_PROBE1(bpf, functions, bpfioctl_biocenaqmask, entry, -1);
 				break;
+#endif
 			}
-#endif
+
 			log(LOG_DEBUG, "if_rxq_num:%d\n", ifp->if_rxq_num);
 			log(LOG_DEBUG, "if_txq_num:%d\n", ifp->if_txq_num);
 			d->bd_qmask.qm_enabled = TRUE;

==== //depot/projects/soc2011/mq_bpf/src/sys/net/if.h#3 (text+ko) ====

@@ -221,6 +221,7 @@
 #define	IFCAP_VLAN_HWTSO	0x40000 /* can do IFCAP_TSO on VLANs */
 #define	IFCAP_LINKSTATE		0x80000 /* the runtime link state is dynamic */
 #define IFCAP_MULTIQUEUE	0x100000
+#define IFCAP_SOFT_MULTIQUEUE	0x200000
 
 #define IFCAP_HWCSUM	(IFCAP_RXCSUM | IFCAP_TXCSUM)
 #define	IFCAP_TSO	(IFCAP_TSO4 | IFCAP_TSO6)

==== //depot/projects/soc2011/mq_bpf/src/sys/net/if_ethersubr.c#3 (text+ko) ====

@@ -445,6 +445,13 @@
 	}
 #endif
 
+#ifdef SOFTRSS
+	if (ifp->if_capenable & IFCAP_SOFT_MULTIQUEUE) {
+		m->m_pkthdr.rxqid = (uint32_t)-1;
+		m->m_pkthdr.txqid = 0;
+	}
+#endif
+
 	/*
 	 * Queue message on interface, update output statistics if
 	 * successful, and start output if interface not yet active.

==== //depot/projects/soc2011/mq_bpf/src/sys/sys/mbuf.h#3 (text+ko) ====

@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)mbuf.h	8.5 (Berkeley) 2/19/95
- * $FreeBSD: src/sys/sys/mbuf.h,v 1.239 2010/08/19 11:31:03 anchie Exp $
+ * $FreeBSD: src/sys/sys/mbuf.h,v 1.241 2011/06/05 10:07:12 rwatson Exp $
  */
 
 #ifndef _SYS_MBUF_H_
@@ -118,8 +118,8 @@
 	uint32_t	 flowid;	/* packet's 4-tuple system 
 					 * flow identifier
 					 */
-	uint32_t	 rxqid;
-	uint32_t	 txqid;
+	uint32_t	rxqid;
+	uint32_t	txqid;
 	/* variables for hardware checksum */
 	int		 csum_flags;	/* flags regarding checksum */
 	int		 csum_data;	/* data field used by csum routines */
@@ -201,7 +201,10 @@
 #define	M_PROTO6	0x00080000 /* protocol-specific */
 #define	M_PROTO7	0x00100000 /* protocol-specific */
 #define	M_PROTO8	0x00200000 /* protocol-specific */
-#define	M_FLOWID	0x00400000 /* flowid is valid */
+#define	M_FLOWID	0x00400000 /* deprecated: flowid is valid */
+#define	M_DISTRIBUTED	0x00800000 /* at least one layer has load balanced */
+#define	M_HASHTYPEBITS	0x0F000000 /* mask of bits holding flowid hash type */
+
 /*
  * For RELENG_{6,7} steal these flags for limited multiple routing table
  * support. In RELENG_8 and beyond, use just one flag and a tag.
@@ -217,11 +220,45 @@
     (M_PROTO1|M_PROTO2|M_PROTO3|M_PROTO4|M_PROTO5|M_PROTO6|M_PROTO7|M_PROTO8)
 
 /*
+ * Network interface cards are able to hash protocol fields (such as IPv4
+ * addresses and TCP port numbers) classify packets into flows.  These flows
+ * can then be used to maintain ordering while delivering packets to the OS
+ * via parallel input queues, as well as to provide a stateless affinity
+ * model.  NIC drivers can pass up the hash via m->m_pkthdr.flowid, and set
+ * m_flag fields to indicate how the hash should be interpreted by the
+ * network stack.
+ *
+ * Most NICs support RSS, which provides ordering and explicit affinity, and
+ * use the hash m_flag bits to indicate what header fields were covered by
+ * the hash.  M_HASHTYPE_OPAQUE can be set by non-RSS cards or configurations
+ * that provide an opaque flow identifier, allowing for ordering and
+ * distribution without explicit affinity.
+ */
+#define	M_HASHTYPE_SHIFT		24
+#define	M_HASHTYPE_NONE			0x0
+#define	M_HASHTYPE_RSS_IPV4		0x1	/* IPv4 2-tuple */
+#define	M_HASHTYPE_RSS_TCP_IPV4		0x2	/* TCPv4 4-tuple */
+#define	M_HASHTYPE_RSS_IPV6		0x3	/* IPv6 2-tuple */
+#define	M_HASHTYPE_RSS_TCP_IPV6		0x4	/* TCPv6 4-tuple */
+#define	M_HASHTYPE_RSS_IPV6_EX		0x5	/* IPv6 2-tuple + ext hdrs */
+#define	M_HASHTYPE_RSS_TCP_IPV6_EX	0x6	/* TCPv6 4-tiple + ext hdrs */
+#define	M_HASHTYPE_OPAQUE		0xf	/* ordering, not affinity */
+
+#define	M_HASHTYPE_CLEAR(m)	(m)->m_flags &= ~(M_HASHTYPEBITS)
+#define	M_HASHTYPE_GET(m)	(((m)->m_flags & M_HASHTYPEBITS) >> \
+				    M_HASHTYPE_SHIFT)
+#define	M_HASHTYPE_SET(m, v)	do {					\
+	(m)->m_flags &= ~M_HASHTYPEBITS;				\
+	(m)->m_flags |= ((v) << M_HASHTYPE_SHIFT);			\
+} while (0)
+#define	M_HASHTYPE_TEST(m, v)	(M_HASHTYPE_GET(m) == (v))
+
+/*
  * Flags preserved when copying m_pkthdr.
  */
 #define	M_COPYFLAGS \
     (M_PKTHDR|M_EOR|M_RDONLY|M_PROTOFLAGS|M_SKIP_FIREWALL|M_BCAST|M_MCAST|\
-     M_FRAG|M_FIRSTFRAG|M_LASTFRAG|M_VLANTAG|M_PROMISC|M_FIB)
+     M_FRAG|M_FIRSTFRAG|M_LASTFRAG|M_VLANTAG|M_PROMISC|M_FIB|M_HASHTYPEBITS)
 
 /*
  * External buffer types: identify ext_buf type.

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

@@ -388,6 +388,7 @@
 #define	PRIV_NETINET_REUSEPORT	504	/* Allow [rapid] port/address reuse. */
 #define	PRIV_NETINET_SETHDROPTS	505	/* Set certain IPv4/6 header options. */
 #define	PRIV_NETINET_BINDANY	506	/* Allow bind to any address. */
+#define	PRIV_NETINET_HASHKEY	507	/* Get and set hash keys for IPv4/6 */
 
 /*
  * IPX/SPX privileges.

==== //depot/projects/soc2011/mq_bpf/tests/queue_affinity.c#3 (text+ko) ====

@@ -48,23 +48,23 @@
 
 	printf("rxq affinity: ");
 	for (i = 0; i < rxqlen; i++) {
-		int val = i;
+		u_long val = (u_long)i;
 		if ((err = ioctl(bpf, BIOCRXQAFFINITY, &val)) > 0) {
 			fprintf(stderr, "ioctl failed\n");
 			return err;
 		}
-		printf("%d:%d ", i, val);
+		printf("%d:%lu ", i, val);
 	}
 	printf("\n");
 
 	printf("txq affinity: ");
 	for (i = 0; i < txqlen; i++) {
-		int val = i;
+		u_long val = (u_long)i;
 		if ((err = ioctl(bpf, BIOCTXQAFFINITY, &val)) > 0) {
 			fprintf(stderr, "ioctl failed\n");
 			return err;
 		}
-		printf("%d:%d ", i, val);
+		printf("%d:%lu ", i, val);
 	}
 	printf("\n");
 }


More information about the p4-projects mailing list