PERFORCE change 89728 for review
Robert Watson
rwatson at FreeBSD.org
Sun Jan 15 09:19:59 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=89728
Change 89728 by rwatson at rwatson_peppercorn on 2006/01/15 17:19:04
Allocate ipq fragment reassembly queue headers using UMA rather than
the mbuf allocator.
Affected files ...
.. //depot/projects/netsmp/src/sys/netinet/ip_input.c#7 edit
Differences ...
==== //depot/projects/netsmp/src/sys/netinet/ip_input.c#7 (text+ko) ====
@@ -107,17 +107,6 @@
&ip_keepfaith, 0,
"Enable packet capture for FAITH IPv4->IPv6 translater daemon");
-static int nipq = 0; /* total # of reass queues */
-static int maxnipq;
-SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragpackets, CTLFLAG_RW,
- &maxnipq, 0,
- "Maximum number of IPv4 fragment reassembly queue entries");
-
-static int maxfragsperpacket;
-SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragsperpacket, CTLFLAG_RW,
- &maxfragsperpacket, 0,
- "Maximum number of IPv4 fragments allowed per packet");
-
static int ip_sendsourcequench = 0;
SYSCTL_INT(_net_inet_ip, OID_AUTO, sendsourcequench, CTLFLAG_RW,
&ip_sendsourcequench, 0,
@@ -166,22 +155,41 @@
SYSCTL_STRUCT(_net_inet_ip, IPCTL_STATS, stats, CTLFLAG_RW,
&ipstat, ipstat, "IP statistics (struct ipstat, netinet/ip_var.h)");
-/* Packet reassembly stuff */
+/*
+ * IP datagram reassembly.
+ */
#define IPREASS_NHASH_LOG2 6
#define IPREASS_NHASH (1 << IPREASS_NHASH_LOG2)
#define IPREASS_HMASK (IPREASS_NHASH - 1)
#define IPREASS_HASH(x,y) \
(((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK)
+/*
+ * For historical reasons, the max ipq size is maintained outside of the UMA
+ * zone. At some point, it would be good to start using the UMA zone max.
+ */
+static uma_zone_t ipq_zone;
static TAILQ_HEAD(ipqhead, ipq) ipq[IPREASS_NHASH];
-struct mtx ipqlock;
-struct callout ipport_tick_callout;
+static struct mtx ipqlock;
#define IPQ_LOCK() mtx_lock(&ipqlock)
#define IPQ_UNLOCK() mtx_unlock(&ipqlock)
#define IPQ_LOCK_INIT() mtx_init(&ipqlock, "ipqlock", NULL, MTX_DEF)
#define IPQ_LOCK_ASSERT() mtx_assert(&ipqlock, MA_OWNED)
+static int nipq = 0; /* total # of reass queues */
+static int maxnipq;
+SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragpackets, CTLFLAG_RW,
+ &maxnipq, 0,
+ "Maximum number of IPv4 fragment reassembly queue entries");
+
+static int maxfragsperpacket;
+SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragsperpacket, CTLFLAG_RW,
+ &maxfragsperpacket, 0,
+ "Maximum number of IPv4 fragments allowed per packet");
+
+struct callout ipport_tick_callout;
+
#ifdef IPCTL_DEFMTU
SYSCTL_INT(_net_inet_ip, IPCTL_DEFMTU, mtu, CTLFLAG_RW,
&ip_mtu, 0, "Default MTU");
@@ -249,6 +257,8 @@
TAILQ_INIT(&ipq[i]);
maxnipq = nmbclusters / 32;
maxfragsperpacket = 16;
+ ipq_zone = uma_zcreate("ipq", sizeof(struct ipq), NULL, NULL, NULL,
+ NULL, UMA_ALIGN_PTR, 0);
/* Start ipport_tick. */
callout_init(&ipport_tick_callout, CALLOUT_MPSAFE);
@@ -865,12 +875,12 @@
* If first fragment to arrive, create a reassembly queue.
*/
if (fp == NULL) {
- if ((t = m_get(M_DONTWAIT, MT_FTABLE)) == NULL)
+ fp = uma_zalloc(ipq_zone, M_NOWAIT);
+ if (fp == NULL)
goto dropfrag;
- fp = mtod(t, struct ipq *);
#ifdef MAC
if (mac_init_ipq(fp, M_NOWAIT) != 0) {
- m_free(t);
+ uma_zfree(ipq_zone, fp);
goto dropfrag;
}
mac_create_ipq(m, fp);
@@ -1038,7 +1048,7 @@
ip->ip_dst = fp->ipq_dst;
TAILQ_REMOVE(head, fp, ipq_list);
nipq--;
- (void) m_free(dtom(fp));
+ uma_zfree(ipq_zone, fp);
m->m_len += (ip->ip_hl << 2);
m->m_data -= (ip->ip_hl << 2);
/* some debugging cruft by sklower, below, will go away soon */
@@ -1079,7 +1089,7 @@
m_freem(q);
}
TAILQ_REMOVE(fhp, fp, ipq_list);
- (void) m_free(dtom(fp));
+ uma_zfree(ipq_zone, fp);
nipq--;
}
More information about the p4-projects
mailing list