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