kern_mbuf.c (243999) | kern_mbuf.c (245575) |
---|---|
1/*- 2 * Copyright (c) 2004, 2005, 3 * Bosko Milekic <bmilekic@FreeBSD.org>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2004, 2005, 3 * Bosko Milekic <bmilekic@FreeBSD.org>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/sys/kern/kern_mbuf.c 243999 2012-12-07 22:30:30Z pjd $"); | 29__FBSDID("$FreeBSD: head/sys/kern/kern_mbuf.c 245575 2013-01-17 21:28:31Z andre $"); |
30 31#include "opt_param.h" 32 33#include <sys/param.h> 34#include <sys/malloc.h> 35#include <sys/systm.h> 36#include <sys/mbuf.h> 37#include <sys/domain.h> --- 4 unchanged lines hidden (view full) --- 42#include <sys/sysctl.h> 43 44#include <security/mac/mac_framework.h> 45 46#include <vm/vm.h> 47#include <vm/vm_extern.h> 48#include <vm/vm_kern.h> 49#include <vm/vm_page.h> | 30 31#include "opt_param.h" 32 33#include <sys/param.h> 34#include <sys/malloc.h> 35#include <sys/systm.h> 36#include <sys/mbuf.h> 37#include <sys/domain.h> --- 4 unchanged lines hidden (view full) --- 42#include <sys/sysctl.h> 43 44#include <security/mac/mac_framework.h> 45 46#include <vm/vm.h> 47#include <vm/vm_extern.h> 48#include <vm/vm_kern.h> 49#include <vm/vm_page.h> |
50#include <vm/vm_map.h> |
|
50#include <vm/uma.h> 51#include <vm/uma_int.h> 52#include <vm/uma_dbg.h> 53 54/* 55 * In FreeBSD, Mbufs and Mbuf Clusters are allocated from UMA 56 * Zones. 57 * --- 41 unchanged lines hidden (view full) --- 99int nmbufs; /* limits number of mbufs */ 100int nmbclusters; /* limits number of mbuf clusters */ 101int nmbjumbop; /* limits number of page size jumbo clusters */ 102int nmbjumbo9; /* limits number of 9k jumbo clusters */ 103int nmbjumbo16; /* limits number of 16k jumbo clusters */ 104struct mbstat mbstat; 105 106/* | 51#include <vm/uma.h> 52#include <vm/uma_int.h> 53#include <vm/uma_dbg.h> 54 55/* 56 * In FreeBSD, Mbufs and Mbuf Clusters are allocated from UMA 57 * Zones. 58 * --- 41 unchanged lines hidden (view full) --- 100int nmbufs; /* limits number of mbufs */ 101int nmbclusters; /* limits number of mbuf clusters */ 102int nmbjumbop; /* limits number of page size jumbo clusters */ 103int nmbjumbo9; /* limits number of 9k jumbo clusters */ 104int nmbjumbo16; /* limits number of 16k jumbo clusters */ 105struct mbstat mbstat; 106 107/* |
107 * tunable_mbinit() has to be run before init_maxsockets() thus 108 * the SYSINIT order below is SI_ORDER_MIDDLE while init_maxsockets() 109 * runs at SI_ORDER_ANY. 110 * 111 * NB: This has to be done before VM init. | 108 * tunable_mbinit() has to be run before any mbuf allocations are done. |
112 */ 113static void 114tunable_mbinit(void *dummy) 115{ | 109 */ 110static void 111tunable_mbinit(void *dummy) 112{ |
113 quad_t realmem, maxmbufmem; |
|
116 | 114 |
115 /* 116 * The default limit for all mbuf related memory is 1/2 of all 117 * available kernel memory (physical or kmem). 118 * At most it can be 3/4 of available kernel memory. 119 */ 120 realmem = qmin((quad_t)physmem * PAGE_SIZE, 121 vm_map_max(kernel_map) - vm_map_min(kernel_map)); 122 maxmbufmem = realmem / 2; 123 TUNABLE_QUAD_FETCH("kern.maxmbufmem", &maxmbufmem); 124 if (maxmbufmem > realmem / 4 * 3) 125 maxmbufmem = realmem / 4 * 3; 126 |
|
117 TUNABLE_INT_FETCH("kern.ipc.nmbclusters", &nmbclusters); 118 if (nmbclusters == 0) 119 nmbclusters = maxmbufmem / MCLBYTES / 4; 120 121 TUNABLE_INT_FETCH("kern.ipc.nmbjumbop", &nmbjumbop); 122 if (nmbjumbop == 0) 123 nmbjumbop = maxmbufmem / MJUMPAGESIZE / 4; 124 --- 9 unchanged lines hidden (view full) --- 134 * We need at least as many mbufs as we have clusters of 135 * the various types added together. 136 */ 137 TUNABLE_INT_FETCH("kern.ipc.nmbufs", &nmbufs); 138 if (nmbufs < nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) 139 nmbufs = lmax(maxmbufmem / MSIZE / 5, 140 nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16); 141} | 127 TUNABLE_INT_FETCH("kern.ipc.nmbclusters", &nmbclusters); 128 if (nmbclusters == 0) 129 nmbclusters = maxmbufmem / MCLBYTES / 4; 130 131 TUNABLE_INT_FETCH("kern.ipc.nmbjumbop", &nmbjumbop); 132 if (nmbjumbop == 0) 133 nmbjumbop = maxmbufmem / MJUMPAGESIZE / 4; 134 --- 9 unchanged lines hidden (view full) --- 144 * We need at least as many mbufs as we have clusters of 145 * the various types added together. 146 */ 147 TUNABLE_INT_FETCH("kern.ipc.nmbufs", &nmbufs); 148 if (nmbufs < nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) 149 nmbufs = lmax(maxmbufmem / MSIZE / 5, 150 nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16); 151} |
142SYSINIT(tunable_mbinit, SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_mbinit, NULL); | 152SYSINIT(tunable_mbinit, SI_SUB_KMEM, SI_ORDER_MIDDLE, tunable_mbinit, NULL); |
143 144static int 145sysctl_nmbclusters(SYSCTL_HANDLER_ARGS) 146{ 147 int error, newnmbclusters; 148 149 newnmbclusters = nmbclusters; 150 error = sysctl_handle_int(oidp, &newnmbclusters, 0, req); --- 123 unchanged lines hidden (view full) --- 274static int mb_ctor_pack(void *, int, void *, int); 275static void mb_dtor_mbuf(void *, int, void *); 276static void mb_dtor_clust(void *, int, void *); 277static void mb_dtor_pack(void *, int, void *); 278static int mb_zinit_pack(void *, int, int); 279static void mb_zfini_pack(void *, int); 280 281static void mb_reclaim(void *); | 153 154static int 155sysctl_nmbclusters(SYSCTL_HANDLER_ARGS) 156{ 157 int error, newnmbclusters; 158 159 newnmbclusters = nmbclusters; 160 error = sysctl_handle_int(oidp, &newnmbclusters, 0, req); --- 123 unchanged lines hidden (view full) --- 284static int mb_ctor_pack(void *, int, void *, int); 285static void mb_dtor_mbuf(void *, int, void *); 286static void mb_dtor_clust(void *, int, void *); 287static void mb_dtor_pack(void *, int, void *); 288static int mb_zinit_pack(void *, int, int); 289static void mb_zfini_pack(void *, int); 290 291static void mb_reclaim(void *); |
282static void mbuf_init(void *); | |
283static void *mbuf_jumbo_alloc(uma_zone_t, int, uint8_t *, int); 284 | 292static void *mbuf_jumbo_alloc(uma_zone_t, int, uint8_t *, int); 293 |
285/* Ensure that MSIZE must be a power of 2. */ | 294/* Ensure that MSIZE is a power of 2. */ |
286CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE); 287 288/* 289 * Initialize FreeBSD Network buffer allocation. 290 */ | 295CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE); 296 297/* 298 * Initialize FreeBSD Network buffer allocation. 299 */ |
291SYSINIT(mbuf, SI_SUB_MBUF, SI_ORDER_FIRST, mbuf_init, NULL); | |
292static void 293mbuf_init(void *dummy) 294{ 295 296 /* 297 * Configure UMA zones for Mbufs, Clusters, and Packets. 298 */ 299 zone_mbuf = uma_zcreate(MBUF_MEM_NAME, MSIZE, --- 91 unchanged lines hidden (view full) --- 391 mbstat.m_mlen = MLEN; 392 mbstat.m_mhlen = MHLEN; 393 mbstat.m_numtypes = MT_NTYPES; 394 395 mbstat.m_mcfail = mbstat.m_mpfail = 0; 396 mbstat.sf_iocnt = 0; 397 mbstat.sf_allocwait = mbstat.sf_allocfail = 0; 398} | 300static void 301mbuf_init(void *dummy) 302{ 303 304 /* 305 * Configure UMA zones for Mbufs, Clusters, and Packets. 306 */ 307 zone_mbuf = uma_zcreate(MBUF_MEM_NAME, MSIZE, --- 91 unchanged lines hidden (view full) --- 399 mbstat.m_mlen = MLEN; 400 mbstat.m_mhlen = MHLEN; 401 mbstat.m_numtypes = MT_NTYPES; 402 403 mbstat.m_mcfail = mbstat.m_mpfail = 0; 404 mbstat.sf_iocnt = 0; 405 mbstat.sf_allocwait = mbstat.sf_allocfail = 0; 406} |
407SYSINIT(mbuf, SI_SUB_MBUF, SI_ORDER_FIRST, mbuf_init, NULL); |
|
399 400/* 401 * UMA backend page allocator for the jumbo frame zones. 402 * 403 * Allocates kernel virtual memory that is backed by contiguous physical 404 * pages. 405 */ 406static void * --- 342 unchanged lines hidden --- | 408 409/* 410 * UMA backend page allocator for the jumbo frame zones. 411 * 412 * Allocates kernel virtual memory that is backed by contiguous physical 413 * pages. 414 */ 415static void * --- 342 unchanged lines hidden --- |