From owner-svn-src-all@FreeBSD.ORG Wed Dec 31 22:52:45 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C6A5DB93; Wed, 31 Dec 2014 22:52:45 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A78FC255A; Wed, 31 Dec 2014 22:52:45 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sBVMqje7020933; Wed, 31 Dec 2014 22:52:45 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sBVMqi1J020929; Wed, 31 Dec 2014 22:52:44 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201412312252.sBVMqi1J020929@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Wed, 31 Dec 2014 22:52:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r276484 - in head/sys: netinet netinet6 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Dec 2014 22:52:45 -0000 Author: adrian Date: Wed Dec 31 22:52:43 2014 New Revision: 276484 URL: https://svnweb.freebsd.org/changeset/base/276484 Log: Migrate the RSS IPv6 hash code to use pointers to the v6 addresses rather than passing them in by value. The eventual aim is to do incremental hash construction rather than all of the memcpy()'ing into a contiguous buffer for the hash function, which does show up as taking quite a bit of CPU during profiling. Tested: * a variety of laptops/desktop setups I have, with v6 connectivity Differential Revision: D1404 Reviewed by: bz, rpaulo Modified: head/sys/netinet/in_rss.c head/sys/netinet/in_rss.h head/sys/netinet6/in6_pcbgroup.c head/sys/netinet6/udp6_usrreq.c Modified: head/sys/netinet/in_rss.c ============================================================================== --- head/sys/netinet/in_rss.c Wed Dec 31 22:49:02 2014 (r276483) +++ head/sys/netinet/in_rss.c Wed Dec 31 22:52:43 2014 (r276484) @@ -346,16 +346,16 @@ rss_hash_ip4_4tuple(struct in_addr src, * Hash an IPv6 2-tuple. */ uint32_t -rss_hash_ip6_2tuple(struct in6_addr src, struct in6_addr dst) +rss_hash_ip6_2tuple(const struct in6_addr *src, const struct in6_addr *dst) { - uint8_t data[sizeof(src) + sizeof(dst)]; + uint8_t data[sizeof(*src) + sizeof(*dst)]; u_int datalen; datalen = 0; - bcopy(&src, &data[datalen], sizeof(src)); - datalen += sizeof(src); - bcopy(&dst, &data[datalen], sizeof(dst)); - datalen += sizeof(dst); + bcopy(src, &data[datalen], sizeof(*src)); + datalen += sizeof(*src); + bcopy(dst, &data[datalen], sizeof(*dst)); + datalen += sizeof(*dst); return (rss_hash(datalen, data)); } @@ -363,18 +363,18 @@ rss_hash_ip6_2tuple(struct in6_addr src, * Hash an IPv6 4-tuple. */ uint32_t -rss_hash_ip6_4tuple(struct in6_addr src, u_short srcport, - struct in6_addr dst, u_short dstport) +rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport, + const struct in6_addr *dst, u_short dstport) { - uint8_t data[sizeof(src) + sizeof(dst) + sizeof(srcport) + + uint8_t data[sizeof(*src) + sizeof(*dst) + sizeof(srcport) + sizeof(dstport)]; u_int datalen; datalen = 0; - bcopy(&src, &data[datalen], sizeof(src)); - datalen += sizeof(src); - bcopy(&dst, &data[datalen], sizeof(dst)); - datalen += sizeof(dst); + bcopy(src, &data[datalen], sizeof(*src)); + datalen += sizeof(*src); + bcopy(dst, &data[datalen], sizeof(*dst)); + datalen += sizeof(*dst); bcopy(&srcport, &data[datalen], sizeof(srcport)); datalen += sizeof(srcport); bcopy(&dstport, &data[datalen], sizeof(dstport)); Modified: head/sys/netinet/in_rss.h ============================================================================== --- head/sys/netinet/in_rss.h Wed Dec 31 22:49:02 2014 (r276483) +++ head/sys/netinet/in_rss.h Wed Dec 31 22:52:43 2014 (r276484) @@ -112,10 +112,10 @@ u_int rss_gethashconfig(void); uint32_t rss_hash_ip4_4tuple(struct in_addr src, u_short srcport, struct in_addr dst, u_short dstport); uint32_t rss_hash_ip4_2tuple(struct in_addr src, struct in_addr dst); -uint32_t rss_hash_ip6_4tuple(struct in6_addr src, u_short srcport, - struct in6_addr dst, u_short dstport); -uint32_t rss_hash_ip6_2tuple(struct in6_addr src, - struct in6_addr dst); +uint32_t rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport, + const struct in6_addr *dst, u_short dstport); +uint32_t rss_hash_ip6_2tuple(const struct in6_addr *src, + const struct in6_addr *dst); /* * Network stack interface to query desired CPU affinity of a packet. Modified: head/sys/netinet6/in6_pcbgroup.c ============================================================================== --- head/sys/netinet6/in6_pcbgroup.c Wed Dec 31 22:49:02 2014 (r276483) +++ head/sys/netinet6/in6_pcbgroup.c Wed Dec 31 22:52:43 2014 (r276484) @@ -105,7 +105,7 @@ in6_pcbgroup_bytuple(struct inpcbinfo *p switch (pcbinfo->ipi_hashfields) { case IPI_HASHFIELDS_4TUPLE: #ifdef RSS - hash = rss_hash_ip6_4tuple(*faddrp, fport, *laddrp, lport); + hash = rss_hash_ip6_4tuple(faddrp, fport, laddrp, lport); #else hash = faddrp->s6_addr32[3] ^ fport; #endif @@ -113,7 +113,7 @@ in6_pcbgroup_bytuple(struct inpcbinfo *p case IPI_HASHFIELDS_2TUPLE: #ifdef RSS - hash = rss_hash_ip6_2tuple(*faddrp, *laddrp); + hash = rss_hash_ip6_2tuple(faddrp, laddrp); #else hash = faddrp->s6_addr32[3] ^ laddrp->s6_addr32[3]; #endif Modified: head/sys/netinet6/udp6_usrreq.c ============================================================================== --- head/sys/netinet6/udp6_usrreq.c Wed Dec 31 22:49:02 2014 (r276483) +++ head/sys/netinet6/udp6_usrreq.c Wed Dec 31 22:52:43 2014 (r276484) @@ -841,7 +841,7 @@ udp6_output(struct inpcb *inp, struct mb * XXX .. and we should likely cache this in the inpcb. */ #ifdef RSS - m->m_pkthdr.flowid = rss_hash_ip6_2tuple(*faddr, *laddr); + m->m_pkthdr.flowid = rss_hash_ip6_2tuple(faddr, laddr); M_HASHTYPE_SET(m, M_HASHTYPE_RSS_IPV6); #endif flags = 0;