Linux内核API mempool_resize

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,会出现如图所示的结果。

Linux内核API mempool_resize

结果分析:

为测试mempool_resize( )函数的功能,首先需要创建一个内存池,这里调用内存池创建函数mempool_create( )基于slab缓存kmem(由 kmem_cache_create( )创建)创建了一个内存池pool。初始创建该内存池中包含的元素个数为5,然后调用mempool_resize( )函数将内存池中所最多允许包含的元素个数为6。由输出结果可以看出,创建的内存池描述符pool的min_nr字段明显由5变为了6。最后在模块退出时,分别调用mempool_destroykmem_cache_destroy(kmem)销毁创建的内存池和slab缓存。

关于函数kmem_cache_create ( )、mempool_destroy( )和kmem_cache_destroy( )的功能,请参考极客笔记网关于它们的分析。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API mempool_resize
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址