日期:2014-05-16  浏览次数:20689 次

一个细节问题 求指教
static inline int slab_order(int size, int min_objects,
int max_order, int fract_leftover)
{
int order;
int rem;
int min_order = slub_min_order;

if ((PAGE_SIZE << min_order) / size > MAX_OBJS_PER_PAGE)
return get_order(size * MAX_OBJS_PER_PAGE) - 1;
for (order = max(min_order,
fls(min_objects * size - 1) - PAGE_SHIFT);
order <= max_order; order++) {

unsigned long slab_size = PAGE_SIZE << order;

if (slab_size < min_objects * size)
continue;

rem = slab_size % size;

if (rem <= slab_size / fract_leftover)
break;

}

return order;
}

MAX_OBJS_PER_PAGE指一个slab(1或多个页组成的大页面)内最多对象数,值为65535,
因为struct page中objects成员为u16类型。如果对象数超出这个上限, 根据上限计算order。

return get_order(size * MAX_OBJS_PER_PAGE) - 1;

虽然这个地方 很难被执行 但是
有没有人注意过这个地方为什么要 减1 ????
减掉1 那不是会导致返回order对应的页面不够来存放MAX_OBJS_PER_PAGE个对象了?

备注:
get_order(0xff) = 0
get_order(0xfff) = 0
get_order(0x5fff) = 3
get_order(0x55fff) = 7



------解决方案--------------------
你是什么?你一上来就是代码,有几个人会看啊,你应该说下你要干嘛?