tlb reset_global_asid_space
reset_global_asid_space是 x86 架构中用于在全局 ASID 空间耗尽时进行“回卷”rollover重置的核心函数。它只在 AMD 广播 TLB 失效INVLPGB或类似硬件辅助刷新特性的补丁集中出现是全局 ASID 分配器的一部分。核心作用回收并安全复用全局 ASID当内核需要为多线程进程分配“全局 ASID”时会从global_asid_used位图中查找空闲的 ASID。如果搜索到达MAX_ASID_AVAILABLE边界即全局 ASID 空间耗尽就调用reset_global_asid_space进行回卷。回卷的核心逻辑是通过一次全局 TLB 刷新使之前释放的全局 ASID 变得安全可复用。代码逻辑解析static void reset_global_asid_space(void) { lockdep_assert_held(global_asid_lock); /* * A global TLB flush guarantees that any stale entries from * previously freed global ASIDs get flushed from the TLB * everywhere, making these global ASIDs safe to reuse. */ invlpgb_flush_all_nonglobals(); /* * Clear all the previously freed global ASIDs from the * broadcast_asid_used bitmap, now that the global TLB flush * has made them actually available for re-use. */ bitmap_andnot(global_asid_used, global_asid_used, global_asid_freed, MAX_ASID_AVAILABLE); bitmap_clear(global_asid_freed, 0, MAX_ASID_AVAILABLE); /* * ASIDs 0-TLB_NR_DYN_ASIDS are used for CPU-local ASID * assignments, for tasks doing IPI based TLB shootdowns. * Restart the search from the start of the global ASID space. */ last_global_asid TLB_NR_DYN_ASIDS; }关键步骤全局 TLB 刷新invlpgb_flush_all_nonglobals()通过硬件广播机制AMD INVLPGB向所有 CPU 发出刷新请求确保所有过期的 TLB 条目都被清除。这是回卷安全性的基石——只有刷新完成后被释放的 ASID 才能安全地重新分配。更新位图bitmap_andnot从global_asid_used中清除所有在global_asid_freed中标记的 ASID然后清空global_asid_freed位图。这表示这些 ASID 现在真正可用了。重置搜索起点将last_global_asid重置为TLB_NR_DYN_ASIDS即 6因为 ASID 0~5 保留给 CPU 本地的动态 ASID 分配用于 IPI 方式的 TLB 刷新全局 ASID 空间从 6 开始。调用关系与设计意图reset_global_asid_space由get_global_asid()或allocate_global_asid()调用。当find_next_zero_bit返回的 ASID 超出范围时就会触发重置。为什么需要全局 ASIDx86 的 12 位 ASID 空间KPTI 下实际可用约 2k无法满足大型系统可能超过 8k CPU的需求。因此内核只给同时在 4 个以上 CPU 上活跃的多线程进程分配全局 ASID使这些进程在所有 CPU 上使用相同的 PCID从而能够利用 AMD INVLPGB 等硬件辅助的广播 TLB 失效机制将 TLB 刷新开销从 IPI 方式显著降低。已知问题与修复早期实现中reset_global_asid_space的触发条件依赖于last_global_asid MAX_ASID_AVAILABLE - 1的判断。这存在一个缺陷如果最大 ASID 先被分配、较小的 ASID 后被释放last_global_asid可能永远不会到达边界导致即使有空闲 ASID 也无法分配。修复方案是不再依赖last_global_asid的值来判断而是在find_next_zero_bit返回超界时直接触发重置通过goto restart重新搜索。这确保了只要global_asid_available大于 0就一定能找到可用的 ASID。总结reset_global_asid_space是全局 ASID 分配器的“回收站”。它只在 ASID 空间耗尽时执行一次全局刷新和位图清理而不是每次分配都做因此开销被摊薄到“每几千次分配才发生一次”。这个设计在支持硬件广播 TLB 失效的 AMD 平台上为多线程进程提供了更高效的 TLB 管理路径。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →