mempool_resize函数功能描述:mempool_resize( )函数是重新设置内存池最多包含的元素个数,即是改变内存池描述符结构中element数组所包含的元素个数。
mempool_resize文件包含
#include<linux/mempool.h>
mempool_resize函数定义
在内核源码中的位置:linux-3.19.3/mm/mempool.c
函数定义格式:
int mempool_resize(mempool_t *pool, int new_min_nr, gfp_t gf p_mask)
mempool_resize输入参数说明
pool
:内存池对象指针,指向创建的内存池,其定义参考 mempool_create( )函数的分析。new_min_nr
:内存池最多所包含的新元素个数。gfp_mask
:内存分配标志,其常见取值和定义参考alloc_pages( )函数的分析。
mempool_resize返回参数说明
返回值是一个整型值,如果成功,则返回0,否则返回负值。
mempool_resize实例解析
编写测试文件:mempool_resize.c
头文件及全局变量声明如下:
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mempool.h>
#include <linux/blkdev.h>
#include <linux/writeback.h>
MODULE_LICENSE("GPL");
static int __init mempool_resize_init(void);
static void __exit mempool_resize_exit(void);
static struct kmem_cache * kmem = NULL;
static mempool_t * pool = NULL;
模块初始化函数:
int __init mempool_resize_init(void)
{
// 创建一个名为"my_buffer"的slab缓存
kmem = kmem_cache_create("my_buffer", 10000, 0, SLAB_HWCACHE_ALIGN, NULL);
if(kmem == NULL )
{
printk("kmem_cache_create failed! \n"); //输出失败信息
return 0;
}
else
{
printk("kmem_cache_create scessfully! \n");
// 基于创建的slab缓存创建一个包含5个初始元素的内存池
pool = mempool_create(5, mempool_alloc_slab, mempool_free_slab, kmem);
if(pool == NULL )
{
printk("mempool_create failed! \n");
return 0;
}
else
{
// 输出所创建的内存池中元素的最大个数
printk("mempool_create successfully! min_nr = %d\n", pool->min_nr);
int new_min_nr = 6;
// 调用mempool_resize函数重新设置内存池所允许的最多元素个数
int result = mempool_resize(pool, new_min_nr, GFP_KERNEL);
// 重新设置之后,输出新的内存池中最大元素个数
printk("after resize, min_nr = %d\n", pool->min_nr);
}
}
return 0;
}
模块退出函数:
void __exit mempool_resize_exit(void)
{
if(pool ! = NULL)
mempool_destroy(pool); //销毁创建的内存池
if(kmem ! = NULL)
kmem_cache_destroy(kmem); //销毁创建的slab缓存
printk("exit! \n");
}
模块初始化及退出函数调用:
module_init(mempool_resize_init);
module_exit(mempool_resize_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod mempool_resize.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
结果分析:
为测试mempool_resize( )函数的功能,首先需要创建一个内存池,这里调用内存池创建函数mempool_create( )基于slab缓存kmem(由 kmem_cache_create( )创建)创建了一个内存池pool。初始创建该内存池中包含的元素个数为5,然后调用mempool_resize( )函数将内存池中所最多允许包含的元素个数为6。由输出结果可以看出,创建的内存池描述符pool的min_nr字段明显由5变为了6。最后在模块退出时,分别调用mempool_destroy和kmem_cache_destroy(kmem)销毁创建的内存池和slab缓存。
关于函数kmem_cache_create ( )、mempool_destroy( )和kmem_cache_destroy( )的功能,请参考极客笔记网关于它们的分析。