krealloc 源码分析

kernel 中提供了一个函数krealloc,这个函数可以重新申请一块memory,但是会将原来memory中的内容copy过来,比较适合
0 size 数组的问题.
其使用举例如下:
        fwspec = krealloc(dev->iommu_fwspec, size, GFP_KERNEL);
第一个参数是需要扩大size的指针,以数组为例的话,就是数组头指针,第二个是要申请的size,第三个要申请的flag,例如这里就是GFP_KERNEL
void *krealloc(const void *p, size_t new_size, gfp_t flags)
{
    void *ret;

    if (unlikely(!new_size)) {
        kfree(p);
        return ZERO_SIZE_PTR;
    }

    ret = __do_krealloc(p, new_size, flags);
    if (ret && p != ret)
        kfree(p);

    return ret;
}
在krealloc 中首先判断size是否为0,
    if (unlikely(!new_size)) {
        kfree(p);
        return ZERO_SIZE_PTR;
    }
这个条件一般不成立,所以这里用unlikely修饰.继续调用__do_krealloc
static __always_inline void *__do_krealloc(const void *p, size_t new_size,
                       gfp_t flags)
{
    void *ret;
    size_t ks = 0;

    if (p)
        ks = ksize(p);

    if (ks >= new_size) {
        kasan_krealloc((void *)p, new_size, flags);
        return (void *)p;
    }

    ret = kmalloc_track_caller(new_size, flags);
    if (ret && p)
        memcpy(ret, p, ks);

    return ret;
}
在__do_krealloc 通过ksize得到原来memory的size,如果原本的size大于要申请的size,那就没有必要申请了,直接返回原指针就可以了
至于kasan_krealloc 如果没有定义CONFIG_KASAN ,则是空的,这个一般用于debug是否踩memory
static inline void kasan_krealloc(const void *object, size_t new_size,
                 gfp_t flags) {}

继续往下就是调用kmalloc_track_caller 来申请memory,其中kmalloc_track_caller 就是加了debug 信息的kmalloc,申请到memroy后,就通过memcpy将原来
memory里面的内容copy到新的memory里面.
最后返回新的指针ret
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值