Date: Mon, 20 Jun 2011 16:16:18 GMT From: Takuya ASADA <syuu@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 195038 for review Message-ID: <201106201616.p5KGGIec044585@skunkworks.freebsd.org>
index | next in thread | raw e-mail
http://p4web.freebsd.org/@@195038?ac=10 Change 195038 by syuu@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"); }help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106201616.p5KGGIec044585>
