do_slab_free

一、快速路径

if (likely(page == c->page)) {void **freelist = READ_ONCE(c->freelist);set_freepointer(s, tail_obj, freelist);if (unlikely(!this_cpu_cmpxchg_double(s->cpu_slab->freelist, s->cpu_slab->tid,freelist, tid,head, next_tid(tid)))) {note_cmpxchg_failure("slab_free", s, tid);goto redo;}stat(s, FREE_FASTPATH);
} else__slab_free(s, page, head, tail_obj, cnt, addr);
1、要释放的对象正好在cpu本地缓存中;
2、set_freepointer函数:将要释放的object加入到空闲的object链表中,并且为链表中代替freelist为第一个空闲的object,即相当于object->next = c->freelist;
3、重新分配freelist,这里是将c->freelist = head(head即目标object);

二、慢速路径

进入__slab_free函数,大致框架如下:

do {if (unlikely(n)) {spin_unlock_irqrestore(&n->list_lock, flags);n = NULL;}prior = page->freelist;counters = page->counters;set_freepointer(s, tail, prior);new.counters = counters;/** 1、frozen=0,说明该slab在node中;frozen=1,则说明该slab在slab_cpu缓存中;* 2、inuse=0,说明该slab中没有正在使用的object;inuse=objects,则说明该slab为full* 3、prior=0,说明目标object在c->page中或者在s->slab_cpu->partital、s->node->partital中且无可分配的object*/was_frozen = new.frozen;new.inuse -= cnt;/** 下面需要对目标object释放的情况进行划分:* (1)inuse=0 && was_frozen=0:目标object在node节点中,且释放后该slab中的object               全部未分配,此时该slab可以释放到伙伴系统或者不处理;* (2)prior=0 && was_frozen=0:释放前在full的slab链表中,释放后为半满状态;* (3)was_frozen=1:该slab在s->slab_cpu->partital缓存中;*/if ((!new.inuse || !prior) && !was_frozen) {             //(1)(2)if (kmem_cache_has_cpu_partial(s) && !prior) {   //(2)new.frozen = 1;} else {                                         //(1)n = get_node(s, page_to_nid(page));spin_lock_irqsave(&n->list_lock, flags);}
} while (!cmpxchg_double_slab(s, page,prior, counters,head, new.counters,"__slab_free"));
/* * 前面的while循环中对目标object释放进行了分类和简单的预处理,下面针对这几种情况进行后续的处理。* 包括是否将空的slab释放回伙伴系统以及维护slab_cpu->patital和node->partital链表;*/if (likely(!n)) {if (new.frozen && !was_frozen) {    //(2)node节点,半满put_cpu_partial(s, page, 1);//将slab释放到slab_cpu->partital链表中stat(s, CPU_PARTIAL_FREE);}if (was_frozen)                     //slab_cpu->partital中,则不处理直接返回stat(s, FREE_FROZEN);return;
}
//释放object后该slab变为free,此时需要对比node->partital中slab的数量和内核定义的最小min大小
//如果n->nr_partial >= s->min_partial,则将slab释放到伙伴系统;
//如果n->nr_partial <  s->min_partial, 则不处理;
if (unlikely(!new.inuse && n->nr_partial >= s->min_partial))goto slab_empty;//未定义CONFIG_SLUB_CPU_PARTITAL时走这个流程;
if (!kmem_cache_has_cpu_partial(s) && unlikely(!prior)) {remove_full(s, n, page);//从full链表中移除add_partial(n, page, DEACTIVATE_TO_TAIL);//加入到node->partital链表中stat(s, FREE_ADD_PARTIAL);
}
spin_unlock_irqrestore(&n->list_lock, flags);
return;
slab_empty:if (prior) {/** Slab on the partial list.*/remove_partial(n, page);//将该slab从链表中删除,并将nr_partital减一stat(s, FREE_REMOVE_PARTIAL);} else {/* Slab must be on the full list */remove_full(s, n, page);}spin_unlock_irqrestore(&n->list_lock, flags);stat(s, FREE_SLAB);discard_slab(s, page);
}

所以从代码来看,主要分成以下几种情况:

1、目标object在s->slab_cpu->partital中,直接释放即可,无需后续的处理;

2、目标object在s->node中,释放完object后slab中的object全为free;此时需要考虑空的slab如何处理

(1)s->node->partital中slab的个数大于等于min_partital时,将该slab释放到伙伴系统;

(2)s->node->partital中slab的个数小于min_partital时,该slab依然保留在s->node->partital链表中;

3、目标object在s->node中,释放object前slab为full,没有可分配object,释放完后为半满状态;此时需要将半满的slab从full链表中删除并加入到s->slab_cpu的链表中,需要注意s->slab_cpu->partital中也需要判断下所有的free的object的数量是否超过了规定的水位,判断后在决定是否加入;

lab从full链表中删除并加入到s->slab_cpu的链表中,需要注意s->slab_cpu->partital中也需要判断下所有的free的object的数量是否超过了规定的水位,判断后在决定是否加入;

slub释放过程-do_slab_free相关推荐

  1. C++类对象的创建与释放过程

    C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...

  2. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程

    一个动画看懂网络原理之TCP建立和释放过程 一.TCP的概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.T ...

  3. TCP的连接和释放过程

    三次握手的过程 1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x.(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文:序号seq=x ...

  4. TCP连接的建立和释放过程详解(三次握手、四次挥手)

    1. TCP是基于连接的协议 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.所谓面向连接,是指通信双方在进行通 ...

  5. .NET中的内存管理,GC机制,内存释放过程

    引言:作为一个.NET程序员,我们知道托管代码的内存管理是自动的..NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保 ...

  6. [系统安全] 十四.熊猫烧香病毒IDA和OD逆向分析--病毒释放过程(下)

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. java jvm之直接内存释放过程

    总结: 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer ...

  8. linux内核内存管理slub

    一.概述 linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页,也是可以的.小于一页的 ...

  9. 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多...

    全局思维(核心网和无线基站侧都会有信令风暴): LTE网络系统可能出现信令风暴的原因,大致可以总结出以下几点: 1.网络架构的变化,导致4G核心网信令流量较2G/3G大幅增加 a)架构扁平化:LTE网 ...

  10. 【synchronized底层原理之4】锁的升级过程及比较

    2019独角兽企业重金招聘Python工程师标准>>> 参考 https://blog.csdn.net/zqz_zqz/article/details/70233767 https ...

最新文章

  1. Java实现HTTP文件下载(转)
  2. tkinter的可视化拖拽工具_可视化越做越丑?这五个高级图表效果实现流程分享给你...
  3. 使用webpack、babel、react、antdesign配置单页面应用开发环境
  4. 会聊天到底有多重要?汽车语音识别大盘点
  5. 设计代码说明什么是多态性?如何实现多态?(代码中要写注释解释)_狗屎一样的代码!快,重构我!...
  6. leetcode Largest Rectangle in Histogram 单调栈
  7. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例32
  8. 计算几何的模板(大神整理)
  9. 黑苹果 电脑关机是因为发生了问题_能量报 | 苹果部分产品免费保修4年 | 最诚实的手机厂商...
  10. RHEL7平台下电信拨号上网配置
  11. Chia命令行P图工具
  12. 笔记1-P2P后台管理系统
  13. 微信发送图片php,PHP怎么实现微信图片上传到服务器?
  14. BFA“瑞云科技”大视频讲堂第五期“从好莱坞电影融资模式到中国电影的国际化”...
  15. 豆瓣电影评论爬取+情感分析+词云
  16. NetSuite SuiteQL Query Tool
  17. 纯C++实现24位bmp格式图片的读取和修饰
  18. 用html写一个简单课表
  19. Eclipse 从SVN检出项目之《文件夹 “” 已不存在 》
  20. 冶金工业概论多媒体辅助教学系统

热门文章

  1. 洛谷 P1040 加分二叉树
  2. 7.28-说说对javaweb的感想吧
  3. 关于输入法的弹出和隐藏
  4. 【第40题】2019年OCP认证12C题库062考试最新考试原题
  5. 实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
  6. 印度SaaS创企Whatfix获370万美元A轮融资
  7. 游戏数据分析指标定义 | 通用
  8. 作为移动开发者,你应该了解Baas(后端即服务)
  9. hibernate笔记--组合主键映射方法
  10. Zabbix2.4.X_监控SNMP