首页 > 学院 > 开发设计 > 正文

krealloc 源码分析

2019-11-06 10:04:35
字体:
来源:转载
供稿:网友
kernel 中提供了一个函数krealloc,这个函数可以重新申请一块memory,但是会将原来memory中的内容copy过来,比较适合0 size 数组的问题.其使用举例如下:        fwspec = krealloc(dev->iommu_fwspec, size, GFP_KERNEL);第一个参数是需要扩大size的指针,以数组为例的话,就是数组头指针,第二个是要申请的size,第三个要申请的flag,例如这里就是GFP_KERNELvoid *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_kreallocstatic __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是否踩memorystatic 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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表