slab_alloc 函数分析

static __always_inline void *slab_alloc(struct kmem_cache *s,  gfp_t gfpflags, int node, unsigned long addr){ void **object; struct kmem_cache_cpu *c; unsigned long flags; unsigned int objsize;
 gfpflags &= gfp_allowed_mask;
 lockdep_trace_alloc(gfpflags);
 might_sleep_if(gfpflags & __GFP_WAIT);
 if (should_failslab(s->objsize, gfpflags))
  return NULL;
 local_irq_save(flags);//把当前中断状态保存到flags中,并禁用当前cpu的中断 ;如果调用链中有多个中断应使用 local_irq_save ,不应使用     
                       //   local_irq_disable 与local_irq_enable
 c = get_cpu_slab(s, smp_processor_id());//http://hi.baidu.com/_kouu/item/7c0cf80d4d29c7e1ff240dd1
 objsize = c->objsize;
 if (unlikely(!c->freelist || !node_match(c, node)))
  object = __slab_alloc(s, gfpflags, node, addr, c);
 else {
  object = c->freelist;
  c->freelist = object[c->offset];
  stat(c, ALLOC_FASTPATH);
 }
 local_irq_restore(flags);//与local_irq_save配对使用
 if (unlikely((gfpflags & __GFP_ZERO) && object))
  memset(object, 0, objsize);
 kmemcheck_slab_alloc(s, gfpflags, object, c->objsize);
 kmemleak_alloc_recursive(object, objsize, 1, s->flags, gfpflags);
 return object;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值