释放SLAB对象kmem_cache_free()
作者:李万鹏 于北京 borqs
释放的过程正好与分配的过程相反,先将object释放到cpu local slab中,如果cpu local slab满了,就将cpu local slab中的free object释放到share local slab中,如果share local slab也满了,就把share local slab的部分free object释放到slab lists中,然后再将cpu local slab中batcount个free object释放到share local slab中。注意这里释放只是指针接管,cpu local slab与share local slab存放的是指向空闲对象的指针而不是空闲对象本身。
void kmem_cache_free (kmem_cache_t *cachep, void *objp)
{
unsigned long flags;
local_irq_save(flags);
__cache_free(cachep, objp);
local_irq_restore(flags);
}
static inline void __cache_free (kmem_cache_t *cachep, void* objp)
{
/*获得cpu local slab*/
struct array_cache *ac = ac_data(cachep);
check_irq_off();
objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
/*如果cpu local slab的空闲对象数量 小于 cpu local slab的空闲对象数量上限*/
if (likely(ac->avail < ac->limit)) {
STATS_INC_FREEHIT(cachep);
/*把object 放到cpu local slab中,上移avail指针*/
ac_entry(ac)[ac->avail++] = objp;
return;
} else {
STATS_INC_FREEMISS(cachep);
cache_flusharray(cachep, ac);
/*将对象释放到cpu local slab中*/
ac_entry(ac)[ac->avail++] = objp;
}
}
static void cache_flusharray (kmem_cache_t* cachep, struct array_cache *ac)
{
int batchcount;
batchcount = ac->batchcount;
#if DEBUG
BUG_ON(!batchcount || batchcount > ac->avail);
#endif
check_irq_off();
spin_lock(&cachep->spinlock);
/*如果存在 share local cpu*/
if (cachep->lists.shared) {
struct array_cache *shared_array = cachep->lists.shared;
int max = shared_array->limit-shared_array->avail;、
/*如果share local slab还能放下空闲对象*/
if (max) {
if (batchcount > max)
batchcount = max;
/*让share local slab来接管 cpu local slab的指针*/
memcpy(&ac_entry(shared_array)[shared_array->avail],
&ac_entry(ac)[0],
sizeof(void*)*batchcount);
/*上移avail*/
shared_array->avail += batchcount;
goto free_done;
}
}
/*如果执行到这里说明share local slab中没有地方了,将cpu local slab中的对象全部赋给slab list3*/
free_block(cachep, &ac_entry(ac)[0], batchcount);
free_done:
spin_unlock(&cachep->spinlock);
/*cpu local slab的avail指针下移batchount*/
ac->avail -= batchcount;
/*前边空出了batchcount个,将后边的移到前边*/
memmove(&ac_entry(ac)[0], &ac_entry(ac)[batchcount],
sizeof(void*)*ac->avail);
}
分享到:
相关推荐
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...
这本书是“Linux kernel hacker修炼之道”的一部分,通过深入剖析各种常见的驱动源码,帮助读者提升在Linux系统中的驱动开发能力。 在Linux操作系统中,驱动程序是连接硬件与内核的桥梁,它们负责管理和控制硬件...
《常见驱动源码分析(kernel hacker修炼之道)》这本书或课程很可能深入探讨了如何理解和编写这些驱动,旨在帮助开发者提升对Linux内核和驱动编程的理解。在这个过程中,我们将会涉及到几个关键的知识点: 1. **Linux...
CMake是一款跨平台的构建工具,它用于管理软件构建过程,尤其适合大型项目或包含多个子项目的工程。CMake不依赖于任何特定的构建系统,而是生成本地构建文件(如Unix Makefiles、Visual Studio项目等),然后使用...
【网鼎杯-第三场-杂项-track_hacker】是一个典型的网络安全竞赛中的挑战,涉及到的是CTF(Capture The Flag)比赛中的杂项类别。在CTF比赛中,参赛者需要运用各种安全技能解决难题,获取“旗标”(代表分数或解题...
【标题解析】:“BotnetWebSocket-master_chancexvw_hacker_websocket_botnet_sangerp”这个标题中的关键词“BotnetWebSocket-master”暗示了一个与僵尸网络(Botnet)相关的项目,特别是利用WebSocket协议的。...
如果刚刚对linux的kernel有兴趣,想了解点什么的话,请先看看此书吧,她风趣幽默的介绍了linux的发展趣事,让你开心快乐之余慢慢领会linux的魅力,让你了解学习掌握kernel的方法。其中的很多建议经过我的实践和摸索...
作者提出了一个有趣的思考点:既然Java的JVM中所有的对象都存储在堆内存中,那么理论上可能存在一种方式直接获取存储在堆内存中的Socket对象,从而实现回显。这需要深入理解JVM的工作原理和内存管理机制。同时,他...
super hacker tools pour tester beta
1. parse: Reads a set of *.java source files and maps the resulting token 2. ent
HackerRank平台上的"The Linux Shell"挑战旨在帮助开发者熟悉和精通Shell脚本编写,提高他们在终端环境中解决问题的能力。在这个项目中,我们将深入探讨Shell编程的各个方面,并提供一系列解决方案来解决这些问题。 ...
骇客V1.0 描述 一个令人兴奋的游戏,将您带到了热门的位置,试图使MI6总部免遭破坏。 使用您的技能来克服这种情况。 记得保持冷静。 请下载并对其评分,以免错过。 即将推出进一步的升级! 更多信息 ...
在Windows操作系统中,进程管理是系统性能监控的重要组成部分。"Process Timer"是一个工具,它用于监视和分析系统中运行的进程的性能。本篇文章将详细探讨"Process ProcessTimer Monitoring"的相关知识点,包括进程...
内存管理负责分配、回收内存资源,管理虚拟内存和物理内存的映射关系,并实现内存保护机制。 Linux内核支持多种文件系统,例如ext2、fat、isofs等。虚拟文件系统(VFS)是Linux内核中的一个重要概念,它为不同文件...
Lab of hacker
这份标题为"HackerRank_2019-2018_Developer-Skills-Report.pdf"的报告,即HackerRank发布的2019-2018开发者技能报告,详细地探讨了开发者社区中的技术趋势和技能发展情况。根据描述,报告提出了React、物联网(IOT)...
资源 Hacker 是一款强大的Windows应用程序资源编辑工具,主要用于查看、修改、添加、删除以及替换应用程序中的资源,如图标、对话框、菜单、字符串表等。在本文中,我们将深入探讨Resource Hacker的功能、使用方法...
reverse-engineering-the-hacker-news-ranking-algorithm, 历史黑客新闻数据的分析与排序算法 反向工程黑客新闻排名算法这个知识库是文章反向工程的一个同伴,它黑客新闻排名算法。 本文探讨了如何利用历史数据来...