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 159481 2006-06-10 14:34:07Z rwatson $");
30
31#include "opt_mac.h"
32#include "opt_param.h"
33
34#include <sys/param.h>
35#include <sys/mac.h>
36#include <sys/malloc.h>
37#include <sys/systm.h>
--- 107 unchanged lines hidden (view full) ---
145 */
146uma_zone_t zone_mbuf;
147uma_zone_t zone_clust;
148uma_zone_t zone_pack;
149uma_zone_t zone_jumbop;
150uma_zone_t zone_jumbo9;
151uma_zone_t zone_jumbo16;
152uma_zone_t zone_ext_refcnt;
153uma_zone_t zone_mtag_vlan;
154
155/*
156 * Local prototypes.
157 */
158static int mb_ctor_mbuf(void *, int, void *, int);
159static int mb_ctor_clust(void *, int, void *, int);
160static int mb_ctor_pack(void *, int, void *, int);
161static void mb_dtor_mbuf(void *, int, void *);
162static void mb_dtor_clust(void *, int, void *);
163static void mb_dtor_pack(void *, int, void *);
164static int mb_zinit_pack(void *, int, int);
165static void mb_zfini_pack(void *, int);
166static int mt_zinit_vlan(void *, int, int);
167
168static void mb_reclaim(void *);
169static void mbuf_init(void *);
170
171/* Ensure that MSIZE doesn't break dtom() - it must be a power of 2 */
172CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE);
173
174/*
--- 64 unchanged lines hidden (view full) ---
239 if (nmbjumbo16 > 0)
240 uma_zone_set_max(zone_jumbo16, nmbjumbo16);
241
242 zone_ext_refcnt = uma_zcreate(MBUF_EXTREFCNT_MEM_NAME, sizeof(u_int),
243 NULL, NULL,
244 NULL, NULL,
245 UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
246
247 zone_mtag_vlan = uma_zcreate("mtag_vlan",
248 sizeof(struct m_tag) + sizeof(u_int),
249 NULL, NULL,
250 mt_zinit_vlan, NULL,
251 UMA_ALIGN_INT, 0);
252
253 /* uma_prealloc() goes here... */
254
255 /*
256 * Hook event handler for low-memory situation, used to
257 * drain protocols and push data back to the caches (UMA
258 * later pushes it back to VM).
259 */
260 EVENTHANDLER_REGISTER(vm_lowmem, mb_reclaim, NULL,
--- 59 unchanged lines hidden (view full) ---
320 m->m_type = type;
321 if (flags & M_PKTHDR) {
322 m->m_data = m->m_pktdat;
323 m->m_pkthdr.rcvif = NULL;
324 m->m_pkthdr.len = 0;
325 m->m_pkthdr.header = NULL;
326 m->m_pkthdr.csum_flags = 0;
327 m->m_pkthdr.csum_data = 0;
328 SLIST_INIT(&m->m_pkthdr.tags);
329#ifdef MAC
330 /* If the label init fails, fail the alloc */
331 error = mac_init_mbuf(m, how);
332 if (error)
333 return (error);
334#endif
335 } else
--- 182 unchanged lines hidden (view full) ---
518 m->m_type = type;
519
520 if (flags & M_PKTHDR) {
521 m->m_pkthdr.rcvif = NULL;
522 m->m_pkthdr.len = 0;
523 m->m_pkthdr.header = NULL;
524 m->m_pkthdr.csum_flags = 0;
525 m->m_pkthdr.csum_data = 0;
526 SLIST_INIT(&m->m_pkthdr.tags);
527#ifdef MAC
528 /* If the label init fails, fail the alloc */
529 error = mac_init_mbuf(m, how);
530 if (error)
531 return (error);
532#endif
533 }
534 /* m_ext is already initialized. */
535
536 return (0);
537}
538
539static void
540mt_vlan_free(struct m_tag *mtag)
541{
542 uma_zfree(zone_mtag_vlan, mtag);
543}
544
545static int
546mt_zinit_vlan(void *mem, int size, int how)
547{
548 struct m_tag *mtag = (struct m_tag *)mem;
549
550 m_tag_setup(mtag, MTAG_VLAN, MTAG_VLAN_TAG, sizeof(u_int));
551 mtag->m_tag_free = mt_vlan_free;
552
553 return (0);
554}
555
556/*
557 * This is the protocol drain routine.
558 *
559 * No locks should be held when this is called. The drain routines have to
560 * presently acquire some locks which raises the possibility of lock order
561 * reversal.
562 */
563static void
--- 13 unchanged lines hidden ---
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 159481 2006-06-10 14:34:07Z rwatson $");
30
31#include "opt_mac.h"
32#include "opt_param.h"
33
34#include <sys/param.h>
35#include <sys/mac.h>
36#include <sys/malloc.h>
37#include <sys/systm.h>
--- 107 unchanged lines hidden (view full) ---
145 */
146uma_zone_t zone_mbuf;
147uma_zone_t zone_clust;
148uma_zone_t zone_pack;
149uma_zone_t zone_jumbop;
150uma_zone_t zone_jumbo9;
151uma_zone_t zone_jumbo16;
152uma_zone_t zone_ext_refcnt;
153uma_zone_t zone_mtag_vlan;
154
155/*
156 * Local prototypes.
157 */
158static int mb_ctor_mbuf(void *, int, void *, int);
159static int mb_ctor_clust(void *, int, void *, int);
160static int mb_ctor_pack(void *, int, void *, int);
161static void mb_dtor_mbuf(void *, int, void *);
162static void mb_dtor_clust(void *, int, void *);
163static void mb_dtor_pack(void *, int, void *);
164static int mb_zinit_pack(void *, int, int);
165static void mb_zfini_pack(void *, int);
166static int mt_zinit_vlan(void *, int, int);
167
168static void mb_reclaim(void *);
169static void mbuf_init(void *);
170
171/* Ensure that MSIZE doesn't break dtom() - it must be a power of 2 */
172CTASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE);
173
174/*
--- 64 unchanged lines hidden (view full) ---
239 if (nmbjumbo16 > 0)
240 uma_zone_set_max(zone_jumbo16, nmbjumbo16);
241
242 zone_ext_refcnt = uma_zcreate(MBUF_EXTREFCNT_MEM_NAME, sizeof(u_int),
243 NULL, NULL,
244 NULL, NULL,
245 UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
246
247 zone_mtag_vlan = uma_zcreate("mtag_vlan",
248 sizeof(struct m_tag) + sizeof(u_int),
249 NULL, NULL,
250 mt_zinit_vlan, NULL,
251 UMA_ALIGN_INT, 0);
252
253 /* uma_prealloc() goes here... */
254
255 /*
256 * Hook event handler for low-memory situation, used to
257 * drain protocols and push data back to the caches (UMA
258 * later pushes it back to VM).
259 */
260 EVENTHANDLER_REGISTER(vm_lowmem, mb_reclaim, NULL,
--- 59 unchanged lines hidden (view full) ---
320 m->m_type = type;
321 if (flags & M_PKTHDR) {
322 m->m_data = m->m_pktdat;
323 m->m_pkthdr.rcvif = NULL;
324 m->m_pkthdr.len = 0;
325 m->m_pkthdr.header = NULL;
326 m->m_pkthdr.csum_flags = 0;
327 m->m_pkthdr.csum_data = 0;
328 SLIST_INIT(&m->m_pkthdr.tags);
329#ifdef MAC
330 /* If the label init fails, fail the alloc */
331 error = mac_init_mbuf(m, how);
332 if (error)
333 return (error);
334#endif
335 } else
--- 182 unchanged lines hidden (view full) ---
518 m->m_type = type;
519
520 if (flags & M_PKTHDR) {
521 m->m_pkthdr.rcvif = NULL;
522 m->m_pkthdr.len = 0;
523 m->m_pkthdr.header = NULL;
524 m->m_pkthdr.csum_flags = 0;
525 m->m_pkthdr.csum_data = 0;
526 SLIST_INIT(&m->m_pkthdr.tags);
527#ifdef MAC
528 /* If the label init fails, fail the alloc */
529 error = mac_init_mbuf(m, how);
530 if (error)
531 return (error);
532#endif
533 }
534 /* m_ext is already initialized. */
535
536 return (0);
537}
538
539static void
540mt_vlan_free(struct m_tag *mtag)
541{
542 uma_zfree(zone_mtag_vlan, mtag);
543}
544
545static int
546mt_zinit_vlan(void *mem, int size, int how)
547{
548 struct m_tag *mtag = (struct m_tag *)mem;
549
550 m_tag_setup(mtag, MTAG_VLAN, MTAG_VLAN_TAG, sizeof(u_int));
551 mtag->m_tag_free = mt_vlan_free;
552
553 return (0);
554}
555
556/*
557 * This is the protocol drain routine.
558 *
559 * No locks should be held when this is called. The drain routines have to
560 * presently acquire some locks which raises the possibility of lock order
561 * reversal.
562 */
563static void
--- 13 unchanged lines hidden ---