scst cache 代码调试笔记

这篇博客记录了在将SCST从1.0升级到2.2.0,并使用内核2.6.32.26时遇到的版本差异问题。主要变动包括scatterlist结构的page_link替换page域,scst_vdisk_thr结构体变化,内存分配方式从kmalloc改为kmem_cache_alloc,缓存初始化和回收的函数调用更改,以及根据内存调整缓存容量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于之前师兄写的代码是基于SCST-1.0,,内核版本是2.6.18的,版本都太旧了,我先我用的是SCST-2.2.0,内核版本是2.6.32.26,由于版本的差别,一些数据结构的定义和接口都有所改变了,主要有以下几个地方的变动。

1.内核代码中scatterlist结构的变化:

struct scatterlist {
#ifdef CONFIG_DEBUG_SG
unsigned long sg_magic;
#endif
unsigned long page_link;
unsigned int offset;


unsigned int length;


dma_addr_t dma_address;
__u32 dma_length;
};

之前的版本中scatterlist有page域,现在改为page_link,所以在SCST中的sg变量的操作应该作如下修改

page = sgl[j].page;  ------>  page=sg_page(&sgl[j]);  //sg_page函数原型定义在  include/linux/scatterlist.h文件中

sgl[j].page=temp;------->  sg_assign_page(&sgl[j],temp)  //同上


2.scst-2.2.0中struct scst_vdisk_thr结构体的变化

struct scst_vdisk_dev *virt_dev = thr->virt_dev;  ----->  struct scst_vdisk_dev *virt_dev = cmd->dev->dh_priv;

原本scst_vdisk_dev设备描述符保存在scst_vdisk_dev的vrit_dev域中,现在改放到scst cmd中;


3.内存块的分配方式

之前用的是kmalloc分配,现在采用kmem_cache_alloc(blockio_work_cachep,gfp_mask)分配;


4.缓存基树的初始化和内存回收

在scst模块初始化时,要对缓存块进行初始化

调用blockio_init_cache和cache_radix_tree_init初始化

在卸载模块时,也要释放缓存节点

free_cache_and_node和cache_radix_tree_destory


5.缓存容量大小的调整

一开始只要加载了有缓存的scst,发起端一旦连接,目标端就会死机,栈一直报错,有时虚拟机和主机都会一同死机,推测有可能是内存满了,所以调整虚拟机的内存大小为4G,同时调整缓存的容量

对应于scst_vdisk_cache.h文件中的

改变Cache容量,修改下面两个宏就可以了:

#define CACHE_CAPACITY_SHIFT  21    //写Cache容量2m

#define CACHE_CAPACITY_SHIFT_R  28  //读Cache容量256m




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值