svn commit: r266737 - head/sys/netinet

Adrian Chadd adrian at FreeBSD.org
Tue May 27 08:06:21 UTC 2014


Author: adrian
Date: Tue May 27 08:06:20 2014
New Revision: 266737
URL: http://svnweb.freebsd.org/changeset/base/266737

Log:
  The users of RSS shouldn't be directly concerned about hash -> CPU ID
  mappings.  Instead, they should be first mapping to an RSS bucket and
  then querying the RSS bucket -> CPU ID mapping to figure out the target
  CPU.
  
  When (if?) RSS rebalancing is implemented or some other (non round-robin)
  distribution of work from buckets to CPU IDs, various bits of code - both
  userland and kernel - will need to know how this mapping works.
  
  So, to support this:
  
  * Add a new function rss_m2bucket() - this maps an mbuf to a given bucket.
    Anything which is currently doing hash -> CPU work may instead wish to
    do hash -> bucket, and then query the bucket->cpuid map for which
    CPU it belongs on.  Or, map it to a bucket, then re-pin that bucket ->
    CPU during a rebalance operation.
  
  * For userland applications which wish to exploit affinity to RSS buckets,
    the bucket -> CPU ID mapping is now available via a sysctl.
    net.inet.rss.bucket_mapping lists the bucket to CPU ID mapping via
    a list of bucket:cpu pairs.

Modified:
  head/sys/netinet/in_rss.c
  head/sys/netinet/in_rss.h

Modified: head/sys/netinet/in_rss.c
==============================================================================
--- head/sys/netinet/in_rss.c	Tue May 27 07:16:43 2014	(r266736)
+++ head/sys/netinet/in_rss.c	Tue May 27 08:06:20 2014	(r266737)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/smp.h>
 #include <sys/sysctl.h>
+#include <sys/sbuf.h>
 
 #include <net/if.h>
 #include <net/if_var.h>
@@ -425,6 +426,24 @@ rss_hash2cpuid(uint32_t hash_val, uint32
 }
 
 /*
+ * Query the RSS bucket associated with the given hash value and
+ * type.
+ */
+int
+rss_hash2bucket(uint32_t hash_val, uint32_t hash_type, uint32_t *bucket_id)
+{
+
+	switch (hash_type) {
+	case M_HASHTYPE_RSS_IPV4:
+	case M_HASHTYPE_RSS_TCP_IPV4:
+		*bucket_id = rss_getbucket(hash_val);
+		return (0);
+	default:
+		return (-1);
+	}
+}
+
+/*
  * netisr CPU affinity lookup routine for use by protocols.
  */
 struct mbuf *
@@ -436,6 +455,16 @@ rss_m2cpuid(struct mbuf *m, uintptr_t so
 	return (m);
 }
 
+int
+rss_m2bucket(struct mbuf *m, uint32_t *bucket_id)
+{
+
+	M_ASSERTPKTHDR(m);
+
+	return(rss_hash2bucket(m->m_pkthdr.flowid, M_HASHTYPE_GET(m),
+	    bucket_id));
+}
+
 /*
  * Query the RSS hash algorithm.
  */
@@ -512,3 +541,31 @@ sysctl_rss_key(SYSCTL_HANDLER_ARGS)
 SYSCTL_PROC(_net_inet_rss, OID_AUTO, key,
     CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, sysctl_rss_key,
     "", "RSS keying material");
+
+static int
+sysctl_rss_bucket_mapping(SYSCTL_HANDLER_ARGS)
+{
+	struct sbuf *sb;
+	int error;
+	int i;
+
+	error = 0;
+	error = sysctl_wire_old_buffer(req, 0);
+	if (error != 0)
+		return (error);
+	sb = sbuf_new_for_sysctl(NULL, NULL, 512, req);
+	if (sb == NULL)
+		return (ENOMEM);
+	for (i = 0; i < rss_buckets; i++) {
+		sbuf_printf(sb, "%s%d:%d", i == 0 ? "" : " ",
+		    i,
+		    rss_getcpu(i));
+	}
+	error = sbuf_finish(sb);
+	sbuf_delete(sb);
+
+	return (error);
+}
+SYSCTL_PROC(_net_inet_rss, OID_AUTO, bucket_mapping,
+    CTLTYPE_STRING | CTLFLAG_RD, NULL, 0,
+    sysctl_rss_bucket_mapping, "", "RSS bucket -> CPU mapping");

Modified: head/sys/netinet/in_rss.h
==============================================================================
--- head/sys/netinet/in_rss.h	Tue May 27 07:16:43 2014	(r266736)
+++ head/sys/netinet/in_rss.h	Tue May 27 08:06:20 2014	(r266737)
@@ -91,5 +91,8 @@ uint32_t	rss_hash_ip6_2tuple(struct in6_
  */
 struct mbuf	*rss_m2cpuid(struct mbuf *m, uintptr_t source, u_int *cpuid);
 u_int		rss_hash2cpuid(uint32_t hash_val, uint32_t hash_type);
+int		rss_hash2bucket(uint32_t hash_val, uint32_t hash_type,
+		uint32_t *bucket_id);
+int		rss_m2bucket(struct mbuf *m, uint32_t *bucket_id);
 
 #endif /* !_NETINET_IN_RSS_H_ */


More information about the svn-src-all mailing list