操作页中某几位 && 块设备 max_sectors

环境 : 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);

}

你可能感兴趣的:(操作页中某几位 && 块设备 max_sectors)