//mbuf 的使用有很多trick为了省空间
预先分好的一些 slab
zone_mbuf, zone_clust, zone_jumbop
zone_pack使用的是zone_clust的空间
m_getcl->uma_zalloc_arg->zone_alloc_item->(zone->uz_init:arg->uminit:mb_zinit_pack)
zone_pack使用最频繁,所以做了很多优化。
一次分配mbuf+zone_clust, cache特性较好。
m_getcl使用zone_pack
这个比较乱:
m_getcl 获取普通大小2K mbuf
m_getjcl 获取指定大小K mbuf
m_gethdr 获取Mbuf 能存下小于 MSIZE(256)- sizeof(struct m_hdr) -sizeof(struct pkthdr)
m_clget 为mbuf分配2k ext data
//////////////////////////////////////////////
mbuf在数据包小的时候不使用m_ext部分,都自己保存。
存不下了就需要扩。
根据(m->m_flags & M_EXT)判断!
struct mbuf {
struct m_hdr m_hdr;
union {
struct {
struct pkthdr MH_pkthdr; /* M_PKTHDR set */
union {
struct m_ext MH_ext; /* M_EXT set */
char MH_databuf[MHLEN];
} MH_dat;
} MH;
char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */
} M_dat;
};
struct m_hdr {
struct mbuf *mh_next; /* next buffer in chain */
struct mbuf *mh_nextpkt; /* next chain in queue/record */
caddr_t mh_data; /* location of data */ 根据需要随时调整!!
int mh_len; /* amount of data in this mbuf */
int mh_flags; /* flags; see below */
short mh_type; /* type of data in this mbuf */
uint8_t pad[M_HDR_PAD];/* word align */
};
struct m_ext {
caddr_t ext_buf; /* start of buffer */
void (*ext_free) /* free routine if not the usual */
(void *, void *);
void *ext_arg1; /* optional argument pointer */
void *ext_arg2; /* optional argument pointer */
u_int ext_size; /* size of buffer, for ext_free */
volatile u_int *ref_cnt; /* pointer to ref count info */
int ext_type; /* type of external storage */ EXT_JUMBO9...
};
#define m_next m_hdr.mh_next
#define m_len m_hdr.mh_len
#define m_data m_hdr.mh_data
#define m_type m_hdr.mh_type
#define m_flags m_hdr.mh_flags
#define m_nextpkt m_hdr.mh_nextpkt
#define m_act m_nextpkt
#define m_pkthdr M_dat.MH.MH_pkthdr
#define m_ext M_dat.MH.MH_dat.MH_ext
#define m_pktdat M_dat.MH.MH_dat.MH_databuf
#define m_dat M_dat.M_databuf
阅读(1196) | 评论(0) | 转发(0) |