Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_mbuf.c
Show First 20 Lines • Show All 297 Lines • ▼ Show 20 Lines | |||||
static int mb_ctor_mbuf(void *, int, void *, int); | static int mb_ctor_mbuf(void *, int, void *, int); | ||||
static int mb_ctor_clust(void *, int, void *, int); | static int mb_ctor_clust(void *, int, void *, int); | ||||
static int mb_ctor_pack(void *, int, void *, int); | static int mb_ctor_pack(void *, int, void *, int); | ||||
static void mb_dtor_mbuf(void *, int, void *); | static void mb_dtor_mbuf(void *, int, void *); | ||||
static void mb_dtor_pack(void *, int, void *); | static void mb_dtor_pack(void *, int, void *); | ||||
static int mb_zinit_pack(void *, int, int); | static int mb_zinit_pack(void *, int, int); | ||||
static void mb_zfini_pack(void *, int); | static void mb_zfini_pack(void *, int); | ||||
static void mb_reclaim(uma_zone_t, int); | static void mb_reclaim(uma_zone_t, int); | ||||
static void *mbuf_jumbo_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int); | |||||
/* Ensure that MSIZE is a power of 2. */ | /* Ensure that MSIZE is a power of 2. */ | ||||
CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE); | CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE); | ||||
_Static_assert(sizeof(struct mbuf_ext_pgs) == 256, | _Static_assert(sizeof(struct mbuf_ext_pgs) == 256, | ||||
"mbuf_ext_pgs size mismatch"); | "mbuf_ext_pgs size mismatch"); | ||||
/* | /* | ||||
* Initialize FreeBSD Network buffer allocation. | * Initialize FreeBSD Network buffer allocation. | ||||
*/ | */ | ||||
static void | static void | ||||
mbuf_init(void *dummy) | mbuf_init(void *dummy) | ||||
{ | { | ||||
/* | /* | ||||
* Configure UMA zones for Mbufs, Clusters, and Packets. | * Configure UMA zones for Mbufs, Clusters, and Packets. | ||||
*/ | */ | ||||
zone_mbuf = uma_zcreate(MBUF_MEM_NAME, MSIZE, | zone_mbuf = uma_zcreate(MBUF_MEM_NAME, MSIZE, | ||||
mb_ctor_mbuf, mb_dtor_mbuf, NULL, NULL, | mb_ctor_mbuf, mb_dtor_mbuf, NULL, NULL, | ||||
MSIZE - 1, UMA_ZONE_MAXBUCKET); | MSIZE - 1, UMA_ZONE_CONTIG | UMA_ZONE_MAXBUCKET); | ||||
if (nmbufs > 0) | if (nmbufs > 0) | ||||
nmbufs = uma_zone_set_max(zone_mbuf, nmbufs); | nmbufs = uma_zone_set_max(zone_mbuf, nmbufs); | ||||
uma_zone_set_warning(zone_mbuf, "kern.ipc.nmbufs limit reached"); | uma_zone_set_warning(zone_mbuf, "kern.ipc.nmbufs limit reached"); | ||||
uma_zone_set_maxaction(zone_mbuf, mb_reclaim); | uma_zone_set_maxaction(zone_mbuf, mb_reclaim); | ||||
zone_clust = uma_zcreate(MBUF_CLUSTER_MEM_NAME, MCLBYTES, | zone_clust = uma_zcreate(MBUF_CLUSTER_MEM_NAME, MCLBYTES, | ||||
mb_ctor_clust, NULL, NULL, NULL, | mb_ctor_clust, NULL, NULL, NULL, | ||||
UMA_ALIGN_PTR, 0); | UMA_ALIGN_PTR, UMA_ZONE_CONTIG); | ||||
if (nmbclusters > 0) | if (nmbclusters > 0) | ||||
nmbclusters = uma_zone_set_max(zone_clust, nmbclusters); | nmbclusters = uma_zone_set_max(zone_clust, nmbclusters); | ||||
uma_zone_set_warning(zone_clust, "kern.ipc.nmbclusters limit reached"); | uma_zone_set_warning(zone_clust, "kern.ipc.nmbclusters limit reached"); | ||||
uma_zone_set_maxaction(zone_clust, mb_reclaim); | uma_zone_set_maxaction(zone_clust, mb_reclaim); | ||||
zone_pack = uma_zsecond_create(MBUF_PACKET_MEM_NAME, mb_ctor_pack, | zone_pack = uma_zsecond_create(MBUF_PACKET_MEM_NAME, mb_ctor_pack, | ||||
mb_dtor_pack, mb_zinit_pack, mb_zfini_pack, zone_mbuf); | mb_dtor_pack, mb_zinit_pack, mb_zfini_pack, zone_mbuf); | ||||
/* Make jumbo frame zone too. Page size, 9k and 16k. */ | /* Make jumbo frame zone too. Page size, 9k and 16k. */ | ||||
zone_jumbop = uma_zcreate(MBUF_JUMBOP_MEM_NAME, MJUMPAGESIZE, | zone_jumbop = uma_zcreate(MBUF_JUMBOP_MEM_NAME, MJUMPAGESIZE, | ||||
mb_ctor_clust, NULL, NULL, NULL, | mb_ctor_clust, NULL, NULL, NULL, | ||||
UMA_ALIGN_PTR, 0); | UMA_ALIGN_PTR, UMA_ZONE_CONTIG); | ||||
if (nmbjumbop > 0) | if (nmbjumbop > 0) | ||||
nmbjumbop = uma_zone_set_max(zone_jumbop, nmbjumbop); | nmbjumbop = uma_zone_set_max(zone_jumbop, nmbjumbop); | ||||
uma_zone_set_warning(zone_jumbop, "kern.ipc.nmbjumbop limit reached"); | uma_zone_set_warning(zone_jumbop, "kern.ipc.nmbjumbop limit reached"); | ||||
uma_zone_set_maxaction(zone_jumbop, mb_reclaim); | uma_zone_set_maxaction(zone_jumbop, mb_reclaim); | ||||
zone_jumbo9 = uma_zcreate(MBUF_JUMBO9_MEM_NAME, MJUM9BYTES, | zone_jumbo9 = uma_zcreate(MBUF_JUMBO9_MEM_NAME, MJUM9BYTES, | ||||
mb_ctor_clust, NULL, NULL, NULL, | mb_ctor_clust, NULL, NULL, NULL, | ||||
UMA_ALIGN_PTR, 0); | UMA_ALIGN_PTR, UMA_ZONE_CONTIG); | ||||
uma_zone_set_allocf(zone_jumbo9, mbuf_jumbo_alloc); | |||||
if (nmbjumbo9 > 0) | if (nmbjumbo9 > 0) | ||||
nmbjumbo9 = uma_zone_set_max(zone_jumbo9, nmbjumbo9); | nmbjumbo9 = uma_zone_set_max(zone_jumbo9, nmbjumbo9); | ||||
uma_zone_set_warning(zone_jumbo9, "kern.ipc.nmbjumbo9 limit reached"); | uma_zone_set_warning(zone_jumbo9, "kern.ipc.nmbjumbo9 limit reached"); | ||||
uma_zone_set_maxaction(zone_jumbo9, mb_reclaim); | uma_zone_set_maxaction(zone_jumbo9, mb_reclaim); | ||||
zone_jumbo16 = uma_zcreate(MBUF_JUMBO16_MEM_NAME, MJUM16BYTES, | zone_jumbo16 = uma_zcreate(MBUF_JUMBO16_MEM_NAME, MJUM16BYTES, | ||||
mb_ctor_clust, NULL, NULL, NULL, | mb_ctor_clust, NULL, NULL, NULL, | ||||
UMA_ALIGN_PTR, 0); | UMA_ALIGN_PTR, UMA_ZONE_CONTIG); | ||||
uma_zone_set_allocf(zone_jumbo16, mbuf_jumbo_alloc); | |||||
if (nmbjumbo16 > 0) | if (nmbjumbo16 > 0) | ||||
nmbjumbo16 = uma_zone_set_max(zone_jumbo16, nmbjumbo16); | nmbjumbo16 = uma_zone_set_max(zone_jumbo16, nmbjumbo16); | ||||
uma_zone_set_warning(zone_jumbo16, "kern.ipc.nmbjumbo16 limit reached"); | uma_zone_set_warning(zone_jumbo16, "kern.ipc.nmbjumbo16 limit reached"); | ||||
uma_zone_set_maxaction(zone_jumbo16, mb_reclaim); | uma_zone_set_maxaction(zone_jumbo16, mb_reclaim); | ||||
zone_extpgs = uma_zcreate(MBUF_EXTPGS_MEM_NAME, | zone_extpgs = uma_zcreate(MBUF_EXTPGS_MEM_NAME, | ||||
sizeof(struct mbuf_ext_pgs), | sizeof(struct mbuf_ext_pgs), | ||||
NULL, NULL, NULL, NULL, | NULL, NULL, NULL, NULL, | ||||
▲ Show 20 Lines • Show All 235 Lines • ▼ Show 20 Lines | while (nmbuf-- > 0) { | ||||
uma_zfree(dn_zone_mbuf, m); | uma_zfree(dn_zone_mbuf, m); | ||||
} | } | ||||
while (nclust-- > 0) { | while (nclust-- > 0) { | ||||
item = uma_zalloc(m_getzone(dn_clsize), M_WAITOK); | item = uma_zalloc(m_getzone(dn_clsize), M_WAITOK); | ||||
uma_zfree(dn_zone_clust, item); | uma_zfree(dn_zone_clust, item); | ||||
} | } | ||||
} | } | ||||
#endif /* DEBUGNET */ | #endif /* DEBUGNET */ | ||||
/* | |||||
* UMA backend page allocator for the jumbo frame zones. | |||||
* | |||||
* Allocates kernel virtual memory that is backed by contiguous physical | |||||
* pages. | |||||
*/ | |||||
static void * | |||||
mbuf_jumbo_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *flags, | |||||
int wait) | |||||
{ | |||||
/* Inform UMA that this allocator uses kernel_map/object. */ | |||||
*flags = UMA_SLAB_KERNEL; | |||||
return ((void *)kmem_alloc_contig_domainset(DOMAINSET_FIXED(domain), | |||||
bytes, wait, (vm_paddr_t)0, ~(vm_paddr_t)0, 1, 0, | |||||
VM_MEMATTR_DEFAULT)); | |||||
} | |||||
/* | /* | ||||
* Constructor for Mbuf master zone. | * Constructor for Mbuf master zone. | ||||
* | * | ||||
* The 'arg' pointer points to a mb_args structure which | * The 'arg' pointer points to a mb_args structure which | ||||
* contains call-specific information required to support the | * contains call-specific information required to support the | ||||
* mbuf allocation API. See mbuf.h. | * mbuf allocation API. See mbuf.h. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 957 Lines • Show Last 20 Lines |