Index: sys/net/rss_config.h =================================================================== --- sys/net/rss_config.h +++ sys/net/rss_config.h @@ -93,6 +93,24 @@ #define RSS_HASH_PKT_EGRESS 1 /* + * Rate limited debugging routine. + */ +#define RSS_DEBUG(lps, format, ...) do { \ + if (rss_debug) { \ + static int t0, __cnt; \ + if (t0 != time_second) { \ + t0 = time_second; \ + __cnt = 0; \ + } \ + if (__cnt++ < lps) \ + printf("RSS (%s:%u): " format, __func__, __LINE__,\ + ##__VA_ARGS__); \ + } \ +} while (0) + +extern int rss_debug; + +/* * Device driver interfaces to query RSS properties that must be programmed * into hardware. */ Index: sys/net/rss_config.c =================================================================== --- sys/net/rss_config.c +++ sys/net/rss_config.c @@ -152,6 +152,15 @@ __DECONST(int *, &rss_basecpu), 0, "RSS base CPU"); /* + * Print verbose debugging messages. + * 0 - disable + * non-zero - enable + */ +int rss_debug = 0; +SYSCTL_INT(_net_inet_rss, OID_AUTO, debug, CTLFLAG_RWTUN, &rss_debug, 0, + "RSS debug level"); + +/* * RSS secret key, intended to prevent attacks on load-balancing. Its * effectiveness may be limited by algorithm choice and available entropy * during the boot. @@ -194,8 +203,8 @@ break; default: - printf("%s: invalid RSS hashalgo %u, coercing to %u", - __func__, rss_hashalgo, RSS_HASH_TOEPLITZ); + RSS_DEBUG(5, "invalid RSS hashalgo %u, coercing to %u\n", + rss_hashalgo, RSS_HASH_TOEPLITZ); rss_hashalgo = RSS_HASH_TOEPLITZ; } @@ -229,8 +238,8 @@ * ones. */ if (rss_bits == 0 || rss_bits > RSS_MAXBITS) { - printf("%s: RSS bits %u not valid, coercing to %u", - __func__, rss_bits, RSS_MAXBITS); + RSS_DEBUG(5, "RSS bits %u not valid, coercing to %u\n", + rss_bits, RSS_MAXBITS); rss_bits = RSS_MAXBITS; } @@ -241,9 +250,8 @@ */ rss_buckets = (1 << rss_bits); if (rss_buckets < rss_ncpus) - printf("%s: WARNING: rss_buckets (%u) less than " - "rss_ncpus (%u)\n", __func__, rss_buckets, - rss_ncpus); + RSS_DEBUG(5, "WARNING: rss_buckets (%u) less than " + "rss_ncpus (%u)\n", rss_buckets, rss_ncpus); rss_mask = rss_buckets - 1; } else { rss_bits = 0; Index: sys/netinet/in_rss.c =================================================================== --- sys/netinet/in_rss.c +++ sys/netinet/in_rss.c @@ -147,7 +147,7 @@ } /* No configured available hashtypes! */ - printf("%s: no available hashtypes!\n", __func__); + RSS_DEBUG(5, "no available hashtypes!\n"); return (-1); } @@ -183,7 +183,7 @@ * XXX For now this only handles hashing on incoming mbufs. */ if (dir != RSS_HASH_PKT_INGRESS) { - printf("%s: called on EGRESS packet!\n", __func__); + RSS_DEBUG(5, "called on EGRESS packet!\n"); return (-1); } @@ -192,11 +192,11 @@ * to have an IPv4 header in it. */ if (m->m_pkthdr.len < (sizeof(struct ip))) { - printf("%s: short mbuf pkthdr\n", __func__); + RSS_DEBUG(5, "short mbuf pkthdr\n"); return (-1); } if (m->m_len < (sizeof(struct ip))) { - printf("%s: short mbuf len\n", __func__); + RSS_DEBUG(5, "short mbuf len\n"); return (-1); } @@ -280,7 +280,7 @@ (proto == IPPROTO_TCP) && (is_frag == 0)) { if (m->m_len < iphlen + sizeof(struct tcphdr)) { - printf("%s: short TCP frame?\n", __func__); + RSS_DEBUG(5, "short TCP frame?\n"); return (-1); } th = (const struct tcphdr *)((c_caddr_t)ip + iphlen); @@ -295,7 +295,7 @@ (is_frag == 0)) { uh = (const struct udphdr *)((c_caddr_t)ip + iphlen); if (m->m_len < iphlen + sizeof(struct udphdr)) { - printf("%s: short UDP frame?\n", __func__); + RSS_DEBUG(5, "short UDP frame?\n"); return (-1); } return rss_proto_software_hash_v4(ip->ip_src, ip->ip_dst, @@ -313,7 +313,7 @@ hashval, hashtype); } else { - printf("%s: no available hashtypes!\n", __func__); + RSS_DEBUG(5, "no available hashtypes!\n"); return (-1); } } Index: sys/netinet6/in6_rss.c =================================================================== --- sys/netinet6/in6_rss.c +++ sys/netinet6/in6_rss.c @@ -147,6 +147,6 @@ } /* No configured available hashtypes! */ - printf("%s: no available hashtypes!\n", __func__); + RSS_DEBUG(5, "no available hashtypes!\n"); return (-1); }