资讯动态

tlb mm_free_global_asid

发布时间:2026/10/2 15:40:21 来源:尧图企业网站定制
mm_free_global_asid是 x86 架构中在进程退出时释放其持有的全局 ASID的辅助函数。它的核心逻辑是“延迟回收”——将 ASID 标记为“待释放”而不是立即归还到空闲池。代码逻辑解析根据补丁中的实现该函数的典型逻辑如下void mm_free_global_asid(struct mm_struct *mm) { if (!cpu_feature_enabled(X86_FEATURE_INVLPGB)) return; guard(raw_spinlock_irqsave)(global_asid_lock); /* The global ASID can be re-used only after flush at wrap-around. */ __set_bit(mm-context.global_asid, global_asid_freed); mm-context.global_asid 0; global_asid_available; }关键步骤特性检查如果 CPU 不支持X86_FEATURE_INVLPGBAMD 广播 TLB 失效指令直接返回因为全局 ASID 机制根本不会被启用。获取全局锁guard(raw_spinlock_irqsave)(global_asid_lock)确保与allocate_global_asid等操作的互斥。标记“待释放”将mm-context.global_asid对应的位设置到global_asid_freed位图中。这是延迟回收的核心——ASID 并没有立即被标记为“空闲”而是进入了“已释放但需刷新后才可复用”的状态。清除mm中的记录将mm-context.global_asid清零表示该进程已不再持有全局 ASID。增加可用计数global_asid_available增加可用 ASID 的计数。为什么需要“延迟回收”global_asid_freed位图的存在是因为被释放的 ASID 的 TLB 条目可能仍残留在某些 CPU 的 TLB 中。如果立即将其重新分配给新进程旧进程的 TLB 条目可能导致新进程错误地命中旧映射。因此内核采用“两阶段回收”策略第一阶段本函数进程退出时将 ASID 标记到global_asid_freed位图表示“已释放但需等待全局刷新”。第二阶段reset_global_asid_space当 ASID 空间回卷时执行一次全局 TLB 刷新invlpgb_flush_all_nonglobals()然后通过bitmap_andnot将global_asid_freed中的 ASID 从global_asid_used中清除使它们真正可复用。调用关系mm_free_global_asid由destroy_context()调用后者在进程退出、mm_struct被销毁时执行。完整的调用链是exit_mmap() / mmput() └── destroy_context() └── mm_free_global_asid()配置条件与编译优化这个函数仅在CONFIG_BROADCAST_TLB_FLUSH启用时才真正存在。当该配置未启用时内核提供一个static inline的空版本避免在destroy_context()中产生无用的函数调用。这一优化源于 2026 年 1 月的补丁目的是消除配置未启用时的符号暴露和调用开销。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑