内核资源管理模块

下午没事,写着玩~

明天加上LRU链,用定时器检查资源是否超时,超时就删除。

#include "priv.h"
#include "kt_resource.h"

#define RESOURCE_HASHSIZE (1 << 5)

static struct kmem_cache *Resource_mempool;
static resource_hashtable_t resource_hashtable[RESOURCE_HASHSIZE];

resource_hash_t resource_get_hash(resource_node_t *node)
{
resource_hash_t hash;
hash.hash_pos = node->hash.hash_pos & (RESOURCE_HASHSIZE - 1);
return hash;
}

resource_node_t * resource_alloc(void)
{
resource_node_t *node = NULL;
node = (resource_node_t *)kmem_cache_alloc(Resource_mempool, GFP_ATOMIC);
if(unlikely(!node)){
printk("kmem_cache_alloc failed\n");
}
nos_atomic_set(&node->refcnt, 1);
return node;
}

void resource_free(resource_node_t *node)
{
kmem_cache_free(Resource_mempool, node);
}

void resource_hold(resource_node_t *node)
{
nos_atomic_inc(&(node->refcnt));
}

void resource_put(resource_node_t *node)
{
if(nos_atomic_dec_and_test(&(node->refcnt))){
resource_free(node);
}
}

void resource_insert(resource_node_t *node)
{
ne_u32 hash_pos;
hash_pos = resource_get_hash(node).hash_pos;
nos_spin_lock_bh(&(resource_hashtable + hash_pos)->lock);
ne_list_add_tail(&node->list, &(resource_hashtable + hash_pos)->list);
resource_hold(node);
nos_spin_unlock_bh(&(resource_hashtable + hash_pos)->lock);

}

void resource_remove(resource_node_t *node)
{
ne_u32 hash_pos;
hash_pos = resource_get_hash(node).hash_pos;
nos_spin_lock_bh(&(resource_hashtable + hash_pos)->lock);
ne_list_del(&node->list);
nos_spin_unlock_bh(&(resource_hashtable + hash_pos)->lock);
}

resource_node_t * resource_create(resource_hash_t hash)
{
resource_node_t *node = NULL;
node = resource_alloc();
if(!node)
return NULL;
node->hash.hash_pos = hash.hash_pos;
resource_insert(node);
return node;
}

void resource_destroy(resource_node_t *node)
{
resource_remove(node);
resource_put(node);
}

resource_node_t * resource_lookup(resource_hash_t hash)
{
int i = 0;
resource_node_t *pos = NULL;
ne_u32 hash_pos = hash.hash_pos;

nos_spin_lock_bh(&(resource_hashtable + hash_pos)->lock);
list_for_each_entry(pos, &(resource_hashtable + hash_pos)->list, list){
if(hash_pos != pos->hash.hash_pos)
continue;
resource_hold(pos);
nos_spin_unlock_bh(&(resource_hashtable + hash_pos)->lock);
return pos;
}
nos_spin_unlock_bh(&(resource_hashtable + hash_pos)->lock);
return NULL;
}

int kt_resource_cache_init(void){
int i = 0;
Resource_mempool = kmem_cache_create("RESOURCE_MEMPOOL", sizeof(resource_node_t), 0, SLAB_HWCACHE_ALIGN, NULL);
if(unlikely(!Resource_mempool)){
printk("kmem_cache_create failed\n");
return -1;
}
for(i = 0; i < RESOURCE_HASHSIZE; i++){
nos_spinlock_init(&(resource_hashtable + i)->lock);
NE_INIT_LIST_HEAD(&(resource_hashtable + i)->list);
}
return 0;
}

void kt_resource_cache_fini(void){
int i = 0;
resource_node_t *pos = NULL;
resource_node_t *next = NULL;

for(i = 0; i < RESOURCE_HASHSIZE; i++){
nos_spin_lock_bh(&(resource_hashtable + i)->lock);
list_for_each_entry_safe(pos, next, &(resource_hashtable + i)->list, list){
ne_list_del(&pos->list);
resource_put(pos);
}
nos_spin_unlock_bh(&(resource_hashtable + i)->lock);
}
kmem_cache_destroy(Resource_mempool);
}

#include "priv.h"

int kt_resource_init(void){
int ret;
resource_hash_t hash;
resource_node_t *node = NULL;
ret = kt_resource_cache_init();
if(ret != 0)
return -1;
test:
hash.hash_pos = 1;
node = resource_create(hash);
if(!node)
return -1;
else{
printk("node->hash.hash_pos %d\n", node->hash.hash_pos);
resource_put(node);
}

hash.hash_pos = 2;
node = resource_create(hash);
if(!node)
return -1;
else{
printk("node->hash.hash_pos %d\n", node->hash.hash_pos);
resource_put(node);
}

node = resource_lookup(hash);
if(!node){
printk("not find\n");
return 0;
}else{
printk("node->hash.hash_pos %d\n", node->hash.hash_pos);
resource_put(node);
}

resource_destroy(node);

node = resource_lookup(hash);
if(!node){
printk("not find\n");
return 0;
}else{
printk("node->hash.hash_pos %d\n", node->hash.hash_pos);
}

return 0;
}

void kt_resource_fini(void){
kt_resource_cache_fini();
}

module_init(kt_resource_init);
module_exit(kt_resource_fini);
MODULE_LICENSE("GPL");

时间: 2024-10-13 09:41:53

内核资源管理模块的相关文章

Linux系统启动流程、内核及模块管理

Linux系统启动流程.内核及模块管理 Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)内核(kernel): 进程管理(创建.调度.销毁等).内存管理.网络管理(网络协议栈).驱动程序.文件系统.安全功能IPC:Inter Process Communication机制本地进程间通信机制:消息队列.semerphor.shm(共享内存)跨主机进程间通信机制:socket等运行中的系统环境可分为两层:内核空间.用户空间内核空间(模式):内核代码(特权级操作-->系统调

内核、模块

内核参数说明 /proc目录介绍详见链接 内核参数目录及配置文件: /proc/* /usr/lib/sysctl.d/* /etc/sysctl.d/*.conf /etc/sysctl.conf #开机读取的内核参数文件: 修改内核参数的注意事项 Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 修改/proc下内核参数文件内容,不能使用编辑器来修改内核参数文件,理由是由于内核随时可能更改这些文

linux-grub,内核及模块关系,chroot,ldd

Linux系统启动流程 PC: OS(Linux) POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab) 启动的服务不同: 运行级别:0-6  0:halt  1: single user mode, 直接以管理员身份切入, s,S,single  2:multi user mode, no NFS  3: multi user

PadLock AES内核测试模块(1)

一.简述 主要编写了一个测试验证PadLock AES内核接口的验证模块.应用PadLock AES内核接口实现加密解密.本文提供了应用该模块的方法.步骤.原理及源码. 二.操作环境 操作系统 mint17 内核 3.8.0 编译器 gcc4.7.3 CPU VIA Nano X2 L4530 @ 1.6+ GHz 内存 4G 多核 2个 三.主要原理 Linux内核有关于加密的函数的接口,主要在cryto文件夹目录中.有AES.SHA等多种算法的实现接口.网上有很多介绍Linux内核关于加密算

PadLock AES内核测试模块

一.简述 主要编写了一个测试验证PadLock AES内核接口的验证模块.应用PadLock AES内核接口实现加密解密.本文提供了应用该模块的方法.步骤.原理及源码. 二.操作环境 操作系统 mint17 内核 3.8.0 编译器 gcc4.7.3 CPU VIA Nano X2 L4530 @ 1.6+ GHz 内存 4G 多核 2个 三.主要原理 Linux内核有关于加密的函数的接口,主要在cryto文件夹目录中.有AES.SHA等多种算法的实现接口.网上有很多介绍Linux内核关于加密算

一个内核定时器模块

/* 内核定时器测试模块 */ #include <linux/kernel.h> //内核 #include <linux/module.h> //内核模块 #include <linux/init.h> //模块初始化和注销 #include <linux/slab.h> //屋里内存分配管理 #include <linux/list.h> //内核链表 #include <linux/timer.h> //内核定时器 //内核模

linux内核list模块的使用

List模块是linux内核提供的循环链表函数集,头文件是:<linux/list.h>. 主要数据结构: struct list_head { struct list_head *next, *prev; }; 这是一个双向链表. #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) stati

国际化资源管理模块重构总结

从17年末到18年初花了差不多三周的时间,将项目中最重要的模块之一--国际化资源管理,进行了彻底的重构.在掉了无数头发加了好多个晚上的班之后,终于改变了先前一个service解决所有逻辑的臃肿情况,代码的可读性,扩展性,模块功能的扩展性以及可用性等性能获得了很大的提升.我在这次重构中有着许许多多的思考和尝试, 对于一个工作经验仅有一年的人来说是一个不小的挑战.最终项目完成并上线之后,自己对于工作结果还挺满意的,从中也收获了很多很多,不写点总结就有点对不起自己过去三周的辛劳了. 先说说背景.在国际

Linux内核(6) - 模块机制与“Hello World!

有一种感动,叫内牛满面,有一种机制,叫模块机制.显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块.对于编写设备驱动程序的开发者来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个模块,当你需要她的时候,你可以把她抱入怀中(insmod),当你不再需要她的时候,你可以把她一脚踢开(rmmod). 于是,忽如一夜春风来,内核处处是模块.让我们从一个伟大的例子去认识模块.这就是传说