Author: bz
Date: Sun Mar  7 15:58:44 2010
New Revision: 204838
URL: http://svn.freebsd.org/changeset/base/204838

Log:
  Destroy TCP UMA zones (empty or not) upon network stack teardown
  to not leak them, otherwise making UMA/vmstat unhappy with every stoped vnet.
  We will still leak pages (especially for zones marked NOFREE).
  
  Reshuffle cleanup order in tcp_destroy() to get rid of what we can
  easily free first.
  
  Sponsored by: ISPsystem
  Reviewed by:  rwatson
  MFC after:    5 days

Modified:
  head/sys/netinet/tcp_reass.c
  head/sys/netinet/tcp_subr.c
  head/sys/netinet/tcp_timewait.c
  head/sys/netinet/tcp_var.h

Modified: head/sys/netinet/tcp_reass.c
==============================================================================
--- head/sys/netinet/tcp_reass.c        Sun Mar  7 15:37:58 2010        
(r204837)
+++ head/sys/netinet/tcp_reass.c        Sun Mar  7 15:58:44 2010        
(r204838)
@@ -132,6 +132,15 @@ tcp_reass_init(void)
            tcp_reass_zone_change, NULL, EVENTHANDLER_PRI_ANY);
 }
 
+#ifdef VIMAGE
+void
+tcp_reass_destroy(void)
+{
+
+       uma_zdestroy(V_tcp_reass_zone);
+}
+#endif
+
 int
 tcp_reass(struct tcpcb *tp, struct tcphdr *th, int *tlenp, struct mbuf *m)
 {

Modified: head/sys/netinet/tcp_subr.c
==============================================================================
--- head/sys/netinet/tcp_subr.c Sun Mar  7 15:37:58 2010        (r204837)
+++ head/sys/netinet/tcp_subr.c Sun Mar  7 15:58:44 2010        (r204838)
@@ -459,15 +459,21 @@ void
 tcp_destroy(void)
 {
 
-       tcp_tw_destroy();
+       tcp_reass_destroy();
        tcp_hc_destroy();
        syncache_destroy();
+       tcp_tw_destroy();
 
        /* XXX check that hashes are empty! */
        hashdestroy(V_tcbinfo.ipi_hashbase, M_PCB,
            V_tcbinfo.ipi_hashmask);
        hashdestroy(V_tcbinfo.ipi_porthashbase, M_PCB,
            V_tcbinfo.ipi_porthashmask);
+
+       uma_zdestroy(V_sack_hole_zone);
+       uma_zdestroy(V_tcpcb_zone);
+       uma_zdestroy(V_tcbinfo.ipi_zone);
+
        INP_INFO_LOCK_DESTROY(&V_tcbinfo);
 }
 #endif

Modified: head/sys/netinet/tcp_timewait.c
==============================================================================
--- head/sys/netinet/tcp_timewait.c     Sun Mar  7 15:37:58 2010        
(r204837)
+++ head/sys/netinet/tcp_timewait.c     Sun Mar  7 15:58:44 2010        
(r204838)
@@ -185,6 +185,8 @@ tcp_tw_destroy(void)
        while((tw = TAILQ_FIRST(&V_twq_2msl)) != NULL)
                tcp_twclose(tw, 0);
        INP_INFO_WUNLOCK(&V_tcbinfo);
+
+       uma_zdestroy(V_tcptw_zone);
 }
 #endif
 

Modified: head/sys/netinet/tcp_var.h
==============================================================================
--- head/sys/netinet/tcp_var.h  Sun Mar  7 15:37:58 2010        (r204837)
+++ head/sys/netinet/tcp_var.h  Sun Mar  7 15:58:44 2010        (r204838)
@@ -657,6 +657,9 @@ char        *tcp_log_addrs(struct in_conninfo 
            const void *);
 int     tcp_reass(struct tcpcb *, struct tcphdr *, int *, struct mbuf *);
 void    tcp_reass_init(void);
+#ifdef VIMAGE
+void    tcp_reass_destroy(void);
+#endif
 void    tcp_input(struct mbuf *, int);
 u_long  tcp_maxmtu(struct in_conninfo *, int *);
 u_long  tcp_maxmtu6(struct in_conninfo *, int *);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to