kernel - Replace zalloc zones with kmalloc for PCBs
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 15 Jan 2010 19:09:19 +0000 (11:09 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 15 Jan 2010 19:09:19 +0000 (11:09 -0800)
* Use kmalloc to allocate PCBs instead of zalloc.  This removes over
  100MB of KVA reservation, particularly from inp_tcp.

* Solves an issue with maxfiles where too much KVA was being reserved
  by the network for PCBs.

* Replace all SCTP zalloc zones with kmalloc.

Reported-bu: Rumko, Peter Avalos <pavalos@theshell.com>

sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet/ip_divert.c
sys/netinet/raw_ip.c
sys/netinet/sctp_pcb.h
sys/netinet/sctputil.h
sys/netinet/tcp_subr.c
sys/netinet/tcp_syncache.c
sys/netinet/udp_usrreq.c
sys/netinet6/in6_pcb.c

index 46da87e..49ea73b 100644 (file)
@@ -88,8 +88,6 @@
 
 #include <machine/limits.h>
 
-#include <vm/vm_zone.h>
-
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/route.h>
@@ -205,17 +203,14 @@ in_pcballoc(struct socket *so, struct inpcbinfo *pcbinfo)
        int error;
 #endif
 
-       inp = zalloc(pcbinfo->ipi_zone);
-       if (inp == NULL)
-               return (ENOBUFS);
-       bzero(inp, sizeof *inp);
+       inp = kmalloc(pcbinfo->ipi_size, M_PCB, M_WAITOK|M_ZERO);
        inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
        inp->inp_pcbinfo = inp->inp_cpcbinfo = pcbinfo;
        inp->inp_socket = so;
 #ifdef IPSEC
        error = ipsec_init_policy(so, &inp->inp_sp);
        if (error != 0) {
-               zfree(pcbinfo->ipi_zone, inp);
+               kfree(inp, M_PCB);
                return (error);
        }
 #endif
@@ -655,7 +650,7 @@ in_pcbdetach(struct inpcb *inp)
 #endif /*IPSEC*/
        inp->inp_gencnt = ++ipi->ipi_gencnt;
        in_pcbremlists(inp);
-       so->so_pcb = 0;
+       so->so_pcb = NULL;
        sofree(so);
        if (inp->inp_options)
                m_free(inp->inp_options);
@@ -663,7 +658,7 @@ in_pcbdetach(struct inpcb *inp)
                rtfree(inp->inp_route.ro_rt);
        ip_freemoptions(inp->inp_moptions);
        inp->inp_vflag = 0;
-       zfree(ipi->ipi_zone, inp);
+       kfree(inp, M_PCB);
 }
 
 /*
index b8a75ac..9a4d142 100644 (file)
@@ -287,7 +287,7 @@ struct inpcbinfo {          /* XXX documentation, prefixes */
        u_short lastport;
        u_short lastlow;
        u_short lasthi;
-       struct  vm_zone *ipi_zone; /* zone to allocate pcbs from */
+       size_t  ipi_size;       /* allocation size for pcbs */
        u_int   ipi_count;      /* number of pcbs in this list */
        u_quad_t ipi_gencnt;    /* current generation count */
        int     cpu;            /* related protocol thread cpu or -1 */
index 02d1bfd..496c626 100644 (file)
@@ -62,8 +62,6 @@
 #include <sys/msgport.h>
 #endif
 
-#include <vm/vm_zone.h>
-
 #include <net/if.h>
 #include <net/route.h>
 
@@ -144,8 +142,7 @@ div_init(void)
        divcbinfo.porthashbase = hashinit(1, M_PCB, &divcbinfo.porthashmask);
        divcbinfo.wildcardhashbase = hashinit(1, M_PCB,
                                              &divcbinfo.wildcardhashmask);
-       divcbinfo.ipi_zone = zinit("divcb", sizeof(struct inpcb),
-                                  maxsockets, ZONE_INTERRUPT, 0);
+       divcbinfo.ipi_size = sizeof(struct inpcb);
        ip_divert_p = ip_divert;
 }
 
index b88cb43..097bad6 100644 (file)
@@ -54,8 +54,6 @@
 
 #include <machine/stdarg.h>
 
-#include <vm/vm_zone.h>
-
 #include <net/if.h>
 #include <net/route.h>
 
@@ -133,8 +131,7 @@ rip_init(void)
        ripcbinfo.porthashbase = hashinit(1, M_PCB, &ripcbinfo.porthashmask);
        ripcbinfo.wildcardhashbase = hashinit(1, M_PCB,
                                              &ripcbinfo.wildcardhashmask);
-       ripcbinfo.ipi_zone = zinit("ripcb", sizeof(struct inpcb),
-                                  maxsockets, ZONE_INTERRUPT, 0);
+       ripcbinfo.ipi_size = sizeof(struct inpcb);
 }
 
 /*
index 495d8a5..a6bd780 100644 (file)
@@ -172,12 +172,12 @@ struct sctp_epinfo {
        struct uma_zone *ipi_zone_chunk;
        struct uma_zone *ipi_zone_sockq;
 #else
-       struct vm_zone *ipi_zone_ep;
-       struct vm_zone *ipi_zone_asoc;
-       struct vm_zone *ipi_zone_laddr;
-       struct vm_zone *ipi_zone_net;
-       struct vm_zone *ipi_zone_chunk;
-       struct vm_zone *ipi_zone_sockq;
+       struct malloc_type ipi_zone_ep;
+       struct malloc_type ipi_zone_asoc;
+       struct malloc_type ipi_zone_laddr;
+       struct malloc_type ipi_zone_net;
+       struct malloc_type ipi_zone_chunk;
+       struct malloc_type ipi_zone_sockq;
 #endif
 #endif
 #if defined(__NetBSD__) || defined(__OpenBSD__)
index db389fd..85b7749 100644 (file)
@@ -68,8 +68,6 @@ struct mbuf *sctp_m_copym(struct mbuf *m, int off, int len, int wait);
 #if defined(__FreeBSD__) || defined(__DragonFly__)
 #if __FreeBSD_version >= 500000
 #include <vm/uma.h>
-#else
-#include <vm/vm_zone.h>
 #endif
 #elif defined(__NetBSD__) || defined(__OpenBSD__)
 #include <sys/pool.h>
@@ -85,8 +83,12 @@ struct mbuf *sctp_m_copym(struct mbuf *m, int off, int len, int wait);
        uma_zone_set_max(zone, number); \
 }
 #else
-#define SCTP_ZONE_INIT(zone, name, size, number) \
-       zone = zinit(name, size, number, ZONE_INTERRUPT, 0);
+#define SCTP_ZONE_INIT(zone, name, size, number)       \
+       do {                                            \
+               zone.ks_shortdesc = name;               \
+               zone.ks_size = size;                    \
+               malloc_init(&zone);                     \
+       } while(0)
 #endif
 #elif defined(__APPLE__)
 #define SCTP_ZONE_INIT(zone, name, size, number) \
@@ -110,7 +112,7 @@ struct mbuf *sctp_m_copym(struct mbuf *m, int off, int len, int wait);
 #endif
 #elif defined(__DragonFly__)
 #define SCTP_ZONE_GET(zone) \
-               zalloc(zone);
+       kmalloc(zone.ks_size, &zone, M_WAITOK|M_ZERO)
 #elif defined(__APPLE__)
 #define SCTP_ZONE_GET(zone) \
        zalloc(zone);
@@ -133,7 +135,7 @@ struct mbuf *sctp_m_copym(struct mbuf *m, int off, int len, int wait);
 #endif
 #elif defined(__DragonFly__)
 #define SCTP_ZONE_FREE(zone, element) \
-       zfree(zone, element);
+       kfree(element, &zone)
 #elif defined(__APPLE__)
 #define SCTP_ZONE_FREE(zone, element) \
        zfree(zone, element);
index 99f96c0..6736d05 100644 (file)
@@ -93,8 +93,6 @@
 #include <sys/in_cksum.h>
 #include <sys/ktr.h>
 
-#include <vm/vm_zone.h>
-
 #include <net/route.h>
 #include <net/if.h>
 #include <net/netisr.h>
@@ -209,10 +207,6 @@ static int do_tcpdrain = 1;
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, do_tcpdrain, CTLFLAG_RW, &do_tcpdrain, 0,
      "Enable tcp_drain routine for extra help when low on mbufs");
 
-/* XXX JH */
-SYSCTL_INT(_net_inet_tcp, OID_AUTO, pcbcount, CTLFLAG_RD,
-    &tcbinfo[0].ipi_count, 0, "Number of active PCBs");
-
 static int icmp_may_rst = 1;
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, icmp_may_rst, CTLFLAG_RW, &icmp_may_rst, 0,
     "Certain ICMP unreachable messages may abort connections in SYN_SENT");
@@ -330,7 +324,6 @@ tcp_init(void)
 {
        struct inpcbporthead *porthashbase;
        u_long porthashmask;
-       struct vm_zone *ipi_zone;
        int hashsize = TCBHASHSIZE;
        int cpu;
 
@@ -357,8 +350,6 @@ tcp_init(void)
        }
        tcp_tcbhashsize = hashsize;
        porthashbase = hashinit(hashsize, M_PCB, &porthashmask);
-       ipi_zone = zinit("tcpcb", sizeof(struct inp_tp), maxsockets,
-                        ZONE_INTERRUPT, 0);
 
        for (cpu = 0; cpu < ncpus2; cpu++) {
                in_pcbinfo_init(&tcbinfo[cpu]);
@@ -369,7 +360,7 @@ tcp_init(void)
                tcbinfo[cpu].porthashmask = porthashmask;
                tcbinfo[cpu].wildcardhashbase = hashinit(hashsize, M_PCB,
                    &tcbinfo[cpu].wildcardhashmask);
-               tcbinfo[cpu].ipi_zone = ipi_zone;
+               tcbinfo[cpu].ipi_size = sizeof(struct inp_tp);
                TAILQ_INIT(&tcpcbackq[cpu]);
        }
 
index 92fd387..9ff269d 100644 (file)
 #define        IPSEC
 #endif /*FAST_IPSEC*/
 
-#include <vm/vm_zone.h>
-
 static int tcp_syncookies = 1;
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, syncookies, CTLFLAG_RW,
     &tcp_syncookies, 0,
@@ -176,7 +174,6 @@ struct msgrec {
 static void syncache_timer_handler(netmsg_t);
 
 struct tcp_syncache {
-       struct  vm_zone *zone;
        u_int   hashsize;
        u_int   hashmask;
        u_int   bucket_limit;
@@ -279,8 +276,7 @@ syncache_free(struct syncache *sc)
                                  rt_mask(rt), rt->rt_flags, NULL);
                RTFREE(rt);
        }
-
-       zfree(tcp_syncache.zone, sc);
+       kfree(sc, M_SYNCACHE);
 }
 
 void
@@ -341,15 +337,6 @@ syncache_init(void)
                                    0, syncache_timer_handler);
                }
        }
-
-       /*
-        * Allocate the syncache entries.  Allow the zone to allocate one
-        * more entry than cache limit, so a new entry can bump out an
-        * older one.
-        */
-       tcp_syncache.zone = zinit("syncache", sizeof(struct syncache),
-           tcp_syncache.cache_limit * ncpus2, ZONE_INTERRUPT, 0);
-       tcp_syncache.cache_limit -= 1;
 }
 
 static void
@@ -967,14 +954,9 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
        }
 
        /*
-        * This allocation is guaranteed to succeed because we
-        * preallocate one more syncache entry than cache_limit.
-        */
-       sc = zalloc(tcp_syncache.zone);
-
-       /*
         * Fill in the syncache values.
         */
+       sc = kmalloc(sizeof(struct syncache), M_SYNCACHE, M_WAITOK|M_ZERO);
        sc->sc_tp = tp;
        sc->sc_inp_gencnt = tp->t_inpcb->inp_gencnt;
        sc->sc_ipopts = ipopts;
@@ -1357,15 +1339,10 @@ syncookie_lookup(struct in_conninfo *inc, struct tcphdr *th, struct socket *so)
        data = data >> SYNCOOKIE_WNDBITS;
 
        /*
-        * This allocation is guaranteed to succeed because we
-        * preallocate one more syncache entry than cache_limit.
-        */
-       sc = zalloc(tcp_syncache.zone);
-
-       /*
         * Fill in the syncache values.
         * XXX duplicate code from syncache_add
         */
+       sc = kmalloc(sizeof(struct syncache), M_SYNCACHE, M_WAITOK|M_ZERO);
        sc->sc_ipopts = NULL;
        sc->sc_inc.inc_fport = inc->inc_fport;
        sc->sc_inc.inc_lport = inc->inc_lport;
index ec7efaf..373c407 100644 (file)
@@ -89,8 +89,6 @@
 
 #include <machine/stdarg.h>
 
-#include <vm/vm_zone.h>
-
 #include <net/if.h>
 #include <net/route.h>
 #include <net/netmsg2.h>
@@ -199,8 +197,7 @@ udp_init(void)
                                        &udbinfo.porthashmask);
        udbinfo.wildcardhashbase = hashinit(UDBHASHSIZE, M_PCB,
                                            &udbinfo.wildcardhashmask);
-       udbinfo.ipi_zone = zinit("udpcb", sizeof(struct inpcb), maxsockets,
-                                ZONE_INTERRUPT, 0);
+       udbinfo.ipi_size = sizeof(struct inpcb);
        udp_thread_init();
 }
 
index 44f3592..8f1b820 100644 (file)
@@ -699,7 +699,7 @@ in6_pcbdetach(struct inpcb *inp)
        ip_freemoptions(inp->inp_moptions);
 
        inp->inp_vflag = 0;
-       zfree(ipi->ipi_zone, inp);
+       kfree(inp, M_PCB);
 }
 
 /*