Proposed patch, convert IFQ_MAXLEN to kernel tunable...
gnn at freebsd.org
gnn at freebsd.org
Tue Sep 23 19:30:01 UTC 2008
Hi,
It turns out that the last time anyone looked at this constant was
before 1994 and it's very likely time to turn it into a kernel
tunable. On hosts that have a high rate of packet transmission
packets can be dropped at the interface queue because this value is
too small. Rather than make a sweeping code change I propose the
following change to the macro and updating a couple of places in the
IP and IPv6 stacks that were using this macro to set their own global
variables.
I have tested this in my test lab at work, it is not as yet in
production at my day job, but will be soon.
Best,
George
Index: netinet/ip_input.c
===================================================================
--- netinet/ip_input.c (revision 183299)
+++ netinet/ip_input.c (working copy)
@@ -133,7 +133,6 @@
struct pfil_head inet_pfil_hook; /* Packet filter hooks */
static struct ifqueue ipintrq;
-static int ipqmaxlen = IFQ_MAXLEN;
extern struct domain inetdomain;
extern struct protosw inetsw[];
@@ -265,7 +264,7 @@
/* Initialize various other remaining things. */
ip_id = time_second & 0xffff;
- ipintrq.ifq_maxlen = ipqmaxlen;
+ ipintrq.ifq_maxlen = IFQ_MAXLEN;
mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF);
netisr_register(NETISR_IP, ip_input, &ipintrq, NETISR_MPSAFE);
}
Index: net/if.c
===================================================================
--- net/if.c (revision 183299)
+++ net/if.c (working copy)
@@ -135,7 +135,14 @@
#endif
int if_index = 0;
-int ifqmaxlen = IFQ_MAXLEN;
+
+int ifqmaxlen = 50;
+TUNABLE_INT("net.ifqmaxlen", &ifqmaxlen);
+
+SYSCTL_INT(_net, OID_AUTO, ifqmaxlen, CTLFLAG_RD,
+ &ifqmaxlen, 0,
+ "interface queue length");
+
struct ifnethead ifnet; /* depend on static init XXX */
struct ifgrouphead ifg_head;
struct mtx ifnet_lock;
Index: net/if.h
===================================================================
--- net/if.h (revision 183299)
+++ net/if.h (working copy)
@@ -221,7 +221,7 @@
#define IFCAP_WOL (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC)
#define IFCAP_TOE (IFCAP_TOE4 | IFCAP_TOE6)
-#define IFQ_MAXLEN 50
+#define IFQ_MAXLEN ifqmaxlen
#define IFNET_SLOWHZ 1 /* granularity is 1 second */
/*
Index: netinet6/ip6_input.c
===================================================================
--- netinet6/ip6_input.c (revision 183299)
+++ netinet6/ip6_input.c (working copy)
@@ -115,7 +115,6 @@
u_char ip6_protox[IPPROTO_MAX];
static struct ifqueue ip6intrq;
-static int ip6qmaxlen = IFQ_MAXLEN;
struct in6_ifaddr *in6_ifaddr;
extern struct callout in6_tmpaddrtimer_ch;
@@ -178,7 +177,7 @@
printf("%s: WARNING: unable to register pfil hook, "
"error %d\n", __func__, i);
- ip6intrq.ifq_maxlen = ip6qmaxlen;
+ ip6intrq.ifq_maxlen = IFQ_MAXLEN;
mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF);
netisr_register(NETISR_IPV6, ip6_input, &ip6intrq, 0);
scope6_init();
More information about the freebsd-net
mailing list