环境 : 2.6.18内核
1
调用blk_queue_max_sectors函数,可以设置我们自己的块设备queue的最大sectors,(将来bio_add_page)时,需要用到这个值,最近突然发现调用这个函数时,max_sector的上限是BLK_DEF_MAX_SECTORS(1024)。
这同时印证了 ldd 将bio一节时,说bio 容纳的最大页数是128页
2
操作页中某几位小函数实现:
#define UNSIGN_LONG_SHIFT 6
#define UNSIGN_LONG_MASK (1 << UNSIGN_LONG_SHIFT -1)
#define UNIT_PER_GRANU_BIT 2 /* is pow of 3, 2^l = 8bit */
#define OFFSET_IN_UNIT (UNSIGN_LONG_SHIFT - UNIT_PER_GRANU_BIT)
#define UNIT_PER_GRANU (1 << UNIT_PER_GRANU_BIT)
#define UNIT_PER_MASK (((INDEX_TYPE)1 << UNIT_PER_GRANU) - 1)
#define INDEX_TYPE __u64
int get_unit_per_granu(void *p, __u32 offset)
{
__u32 shift = ((offset << UNIT_PER_GRANU_BIT)& UNSIGN_LONG_MASK);
INDEX_TYPE *pone = (INDEX_TYPE *)p + (offset >> OFFSET_IN_UNIT);
return (*pone >> shift) & UNIT_PER_MASK;
}
void set_unit_per_granu(void *p, __u32 offset, __u32 value)
{
__u32 shift = ((offset << UNIT_PER_GRANU_BIT)& UNSIGN_LONG_MASK);
INDEX_TYPE *pone = (INDEX_TYPE *)p + (offset >> OFFSET_IN_UNIT);
INDEX_TYPE inval = (INDEX_TYPE)value;
INDEX_TYPE mask = UNIT_PER_MASK << shift;
*pone &= ~mask;
*pone |= mask & (inval << shift);
}
void set_unit_per_granu_bit(void *p, __u32 offset, __u32 bit)
{
__u32 shift = ((offset << UNIT_PER_GRANU_BIT)& UNSIGN_LONG_MASK);
INDEX_TYPE *pone = (INDEX_TYPE *)p + (offset >> OFFSET_IN_UNIT);
set_bit((shift + bit), pone);
}
void clear_unit_per_granu_bit(void *p, __u32 offset, __u32 bit)
{
__u32 shift = ((offset << UNIT_PER_GRANU_BIT)& UNSIGN_LONG_MASK);
INDEX_TYPE *pone = (INDEX_TYPE *)p + (offset >> OFFSET_IN_UNIT);
clear_bit((shift + bit), pone);
}