svn commit: r281294 - head/sys/netinet
Gleb Smirnoff
glebius at FreeBSD.org
Thu Apr 9 08:52:03 UTC 2015
Author: glebius
Date: Thu Apr 9 08:52:02 2015
New Revision: 281294
URL: https://svnweb.freebsd.org/changeset/base/281294
Log:
o Since we always update either fragdrop or fragtimeout stat counter when we
free a fragment, provide two inline functions that do that for us:
ipq_drop() and ipq_timeout().
o Rename ip_free_f() to ipq_free() to match the name scheme of IP reassembly.
o Remove assertion from ipq_free(), since it requires extra argument to be
passed, but locking scheme is simple enough and function is static.
Sponsored by: Nginx, Inc.
Modified:
head/sys/netinet/ip_input.c
Modified: head/sys/netinet/ip_input.c
==============================================================================
--- head/sys/netinet/ip_input.c Thu Apr 9 08:37:16 2015 (r281293)
+++ head/sys/netinet/ip_input.c Thu Apr 9 08:52:02 2015 (r281294)
@@ -177,11 +177,27 @@ static struct mtx_padalign ipqlock[IPREA
#define IPQ_LOCK(i) mtx_lock(&ipqlock[(i)])
#define IPQ_UNLOCK(i) mtx_unlock(&ipqlock[(i)])
#define IPQ_LOCK_INIT(i) mtx_init(&ipqlock[(i)], "ipqlock", NULL, MTX_DEF)
-#define IPQ_LOCK_ASSERT(i) mtx_assert(&ipqlock[(i)], MA_OWNED)
static void maxnipq_update(void);
static void ipq_zone_change(void *);
static void ip_drain_vnet(void);
+static void ipq_free(struct ipqhead *, struct ipq *);
+
+static inline void
+ipq_timeout(struct ipqhead *head, struct ipq *fp)
+{
+
+ IPSTAT_ADD(ips_fragtimeout, fp->ipq_nfrags);
+ ipq_free(head, fp);
+}
+
+static inline void
+ipq_drop(struct ipqhead *head, struct ipq *fp)
+{
+
+ IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
+ ipq_free(head, fp);
+}
static VNET_DEFINE(int, maxnipq); /* Administrative limit on # reass queues. */
static VNET_DEFINE(int, nipq); /* Total # of reass queues */
@@ -209,8 +225,6 @@ SYSCTL_INT(_net_inet_ip, OID_AUTO, steal
"IP stealth mode, no TTL decrementation on forwarding");
#endif
-static void ip_freef(struct ipqhead *, int, struct ipq *);
-
/*
* IP statistics are stored in the "array" of counter(9)s.
*/
@@ -881,9 +895,7 @@ ip_reass_purge_element(int skip_bucket)
IPQ_LOCK(i);
r = TAILQ_LAST(&V_ipq[i], ipqhead);
if (r) {
- IPSTAT_ADD(ips_fragtimeout,
- r->ipq_nfrags);
- ip_freef(&V_ipq[i], i, r);
+ ipq_timeout(&V_ipq[i], r);
IPQ_UNLOCK(i);
return (i);
}
@@ -964,10 +976,8 @@ ip_reass(struct mbuf *m)
* lock is no longer held.
*/
do_purge = 1;
- } else {
- IPSTAT_ADD(ips_fragtimeout, q->ipq_nfrags);
- ip_freef(head, hash, q);
- }
+ } else
+ ipq_timeout(head, q);
}
found:
@@ -1125,20 +1135,16 @@ found:
next = 0;
for (p = NULL, q = fp->ipq_frags; q; p = q, q = q->m_nextpkt) {
if (ntohs(GETIP(q)->ip_off) != next) {
- if (fp->ipq_nfrags > V_maxfragsperpacket) {
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, hash, fp);
- }
+ if (fp->ipq_nfrags > V_maxfragsperpacket)
+ ipq_drop(head, fp);
goto done;
}
next += ntohs(GETIP(q)->ip_len);
}
/* Make sure the last packet didn't have the IP_MF flag */
if (p->m_flags & M_IP_FRAG) {
- if (fp->ipq_nfrags > V_maxfragsperpacket) {
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, hash, fp);
- }
+ if (fp->ipq_nfrags > V_maxfragsperpacket)
+ ipq_drop(head, fp);
goto done;
}
@@ -1149,8 +1155,7 @@ found:
ip = GETIP(q);
if (next + (ip->ip_hl << 2) > IP_MAXPACKET) {
IPSTAT_INC(ips_toolong);
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, hash, fp);
+ ipq_drop(head, fp);
goto done;
}
@@ -1266,12 +1271,10 @@ done:
* associated datagrams.
*/
static void
-ip_freef(struct ipqhead *fhp, int i, struct ipq *fp)
+ipq_free(struct ipqhead *fhp, struct ipq *fp)
{
struct mbuf *q;
- IPQ_LOCK_ASSERT(i);
-
while (fp->ipq_frags) {
q = fp->ipq_frags;
fp->ipq_frags = q->m_nextpkt;
@@ -1304,11 +1307,8 @@ ip_slowtimo(void)
fpp = fp;
fp = TAILQ_NEXT(fp, ipq_list);
- if(--fpp->ipq_ttl == 0) {
- IPSTAT_ADD(ips_fragtimeout,
- fpp->ipq_nfrags);
- ip_freef(&V_ipq[i], i, fpp);
- }
+ if(--fpp->ipq_ttl == 0)
+ ipq_timeout(&V_ipq[i], fpp);
}
IPQ_UNLOCK(i);
}
@@ -1321,13 +1321,9 @@ ip_slowtimo(void)
for (i = 0; i < IPREASS_NHASH; i++) {
IPQ_LOCK(i);
while (V_nipq > V_maxnipq &&
- !TAILQ_EMPTY(&V_ipq[i])) {
- IPSTAT_ADD(ips_fragdropped,
- TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
- ip_freef(&V_ipq[i],
- i,
+ !TAILQ_EMPTY(&V_ipq[i]))
+ ipq_drop(&V_ipq[i],
TAILQ_FIRST(&V_ipq[i]));
- }
IPQ_UNLOCK(i);
}
}
@@ -1346,11 +1342,8 @@ ip_drain_vnet(void)
for (i = 0; i < IPREASS_NHASH; i++) {
IPQ_LOCK(i);
- while(!TAILQ_EMPTY(&V_ipq[i])) {
- IPSTAT_ADD(ips_fragdropped,
- TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
- ip_freef(&V_ipq[i], i, TAILQ_FIRST(&V_ipq[i]));
- }
+ while(!TAILQ_EMPTY(&V_ipq[i]))
+ ipq_drop(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
IPQ_UNLOCK(i);
}
}
More information about the svn-src-head
mailing list