当前位置: 技术问答>linux和unix
求解linux源码中的这段SCTP程序
来源: 互联网 发布时间:2016-08-10
本文导语: status = -ENOBUFS; sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket", sizeof(struct sctp_bind_bucket), 0, SLAB_HWCACHE_ALIGN, NULL); if (!sctp_bucket_cachep) goto out; net/sctp/protocol.c的1071行 此后除了kmem_cac...
status = -ENOBUFS;
sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket",
sizeof(struct sctp_bind_bucket),
0, SLAB_HWCACHE_ALIGN,
NULL);
if (!sctp_bucket_cachep)
goto out;
net/sctp/protocol.c的1071行
此后除了kmem_cache_destroy函数外,sctp_bucket_cachep貌似再也没出现过,那这几句代码是干什么用的呢?
|
这段代码创建了一个cache
一个在内核中经常被申请和释放的结构体,容易造成碎片和效率低下
通过使用slab分配器,一次先申请一大片内存当cache,专门供一种结构体来申请使用,
于是申请特定结构体的时候可以直接非配成功,释放这个特定结构体不是真的释放,而是提供给下一个申请者
这样可以很好地解决碎片和效率
sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket",
sizeof(struct sctp_bind_bucket),
0, SLAB_HWCACHE_ALIGN,
NULL);
"sctp_bind_bucket"是此cache在/proc/slabinfo中显示的名字
sizeof(struct sctp_bind_bucket),说明此cache是专供struct sctp_bind_bucket使用的
虽然在/net/sctp/protocol.c里没有怎么使用它,
但是在/net/sctp/socket.c 里
extern struct kmem_cache *sctp_bucket_cachep;
static struct sctp_bind_bucket *sctp_bucket_create(
struct sctp_bind_hashbucket *head, unsigned short snum)
{
struct sctp_bind_bucket *pp;
pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
}
就使用了这片cache
一个在内核中经常被申请和释放的结构体,容易造成碎片和效率低下
通过使用slab分配器,一次先申请一大片内存当cache,专门供一种结构体来申请使用,
于是申请特定结构体的时候可以直接非配成功,释放这个特定结构体不是真的释放,而是提供给下一个申请者
这样可以很好地解决碎片和效率
sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket",
sizeof(struct sctp_bind_bucket),
0, SLAB_HWCACHE_ALIGN,
NULL);
"sctp_bind_bucket"是此cache在/proc/slabinfo中显示的名字
sizeof(struct sctp_bind_bucket),说明此cache是专供struct sctp_bind_bucket使用的
虽然在/net/sctp/protocol.c里没有怎么使用它,
但是在/net/sctp/socket.c 里
extern struct kmem_cache *sctp_bucket_cachep;
static struct sctp_bind_bucket *sctp_bucket_create(
struct sctp_bind_hashbucket *head, unsigned short snum)
{
struct sctp_bind_bucket *pp;
pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
}
就使用了这片cache