svn commit: r205754 - stable/8/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Sat Mar 27 17:34:57 UTC 2010
Author: bz
Date: Sat Mar 27 17:34:57 2010
New Revision: 205754
URL: http://svn.freebsd.org/changeset/base/205754
Log:
MFC r204140:
Split up ip_drain() into an outer lock and iterator part and
a "locked" version that will only handle a single network stack
instance. The latter is called directly from ip_destroy().
Hook up an ip_destroy() function to release resources from the
legacy IP network layer upon virtual network stack teardown.
Reviewed by: rwatson
Modified:
stable/8/sys/netinet/in_proto.c
stable/8/sys/netinet/ip_input.c
stable/8/sys/netinet/ip_var.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
Modified: stable/8/sys/netinet/in_proto.c
==============================================================================
--- stable/8/sys/netinet/in_proto.c Sat Mar 27 17:33:19 2010 (r205753)
+++ stable/8/sys/netinet/in_proto.c Sat Mar 27 17:34:57 2010 (r205754)
@@ -114,6 +114,9 @@ struct protosw inetsw[] = {
.pr_domain = &inetdomain,
.pr_protocol = IPPROTO_IP,
.pr_init = ip_init,
+#ifdef VIMAGE
+ .pr_destroy = ip_destroy,
+#endif
.pr_slowtimo = ip_slowtimo,
.pr_drain = ip_drain,
.pr_usrreqs = &nousrreqs
Modified: stable/8/sys/netinet/ip_input.c
==============================================================================
--- stable/8/sys/netinet/ip_input.c Sat Mar 27 17:33:19 2010 (r205753)
+++ stable/8/sys/netinet/ip_input.c Sat Mar 27 17:34:57 2010 (r205754)
@@ -199,6 +199,7 @@ static struct mtx ipqlock;
static void maxnipq_update(void);
static void ipq_zone_change(void *);
+static void ip_drain_locked(void);
SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, fragpackets, CTLFLAG_RD,
&VNET_NAME(nipq), 0,
@@ -368,6 +369,22 @@ ip_init(void)
netisr_register(&ip_nh);
}
+#ifdef VIMAGE
+void
+ip_destroy(void)
+{
+
+ /* Cleanup in_ifaddr hash table; should be empty. */
+ hashdestroy(V_in_ifaddrhashtbl, M_IFADDR, V_in_ifaddrhmask);
+
+ IPQ_LOCK();
+ ip_drain_locked();
+ IPQ_UNLOCK();
+
+ uma_zdestroy(V_ipq_zone);
+}
+#endif
+
void
ip_fini(void *xtp)
{
@@ -1237,23 +1254,32 @@ ip_slowtimo(void)
/*
* Drain off all datagram fragments.
*/
+static void
+ip_drain_locked(void)
+{
+ int i;
+
+ IPQ_LOCK_ASSERT();
+
+ for (i = 0; i < IPREASS_NHASH; i++) {
+ while(!TAILQ_EMPTY(&V_ipq[i])) {
+ IPSTAT_ADD(ips_fragdropped,
+ TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
+ ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
+ }
+ }
+}
+
void
ip_drain(void)
{
VNET_ITERATOR_DECL(vnet_iter);
- int i;
VNET_LIST_RLOCK_NOSLEEP();
IPQ_LOCK();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
- for (i = 0; i < IPREASS_NHASH; i++) {
- while(!TAILQ_EMPTY(&V_ipq[i])) {
- IPSTAT_ADD(ips_fragdropped,
- TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
- ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
- }
- }
+ ip_drain_locked();
CURVNET_RESTORE();
}
IPQ_UNLOCK();
Modified: stable/8/sys/netinet/ip_var.h
==============================================================================
--- stable/8/sys/netinet/ip_var.h Sat Mar 27 17:33:19 2010 (r205753)
+++ stable/8/sys/netinet/ip_var.h Sat Mar 27 17:34:57 2010 (r205754)
@@ -212,6 +212,9 @@ int ip_fragment(struct ip *ip, struct mb
u_long if_hwassist_flags, int sw_csum);
void ip_forward(struct mbuf *m, int srcrt);
void ip_init(void);
+#ifdef VIMAGE
+void ip_destroy(void);
+#endif
extern int
(*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *,
struct ip_moptions *);
More information about the svn-src-all
mailing list