尧图精选

tlb mm_active_cpus_exceeds

🕒 发布时间:2026/10/1 10:21:05 📁 来源:尧图网络
mm_active_cpus_exceeds是 Linux 内核 x86 架构中用于判断一个进程是否“值得”分配全局 ASID的辅助函数。它通过检查该进程当前活跃在多少个 CPU 上来决定是否满足阈值。源码实现根据内核补丁其定义如下static bool mm_active_cpus_exceeds(struct mm_struct *mm, int threshold) { int count 0; int cpu; /* This quick check should eliminate most single threaded programs. */ if (cpumask_weight(mm_cpumask(mm)) threshold) return false; /* Slower check to make sure. */ for_each_cpu(cpu, mm_cpumask(mm)) { /* Skip the CPUs that arent really running this process. */ if (per_cpu(cpu_tlbstate.loaded_mm, cpu) ! mm) continue; if (per_cpu(cpu_tlbstate_shared.is_lazy, cpu)) continue; if (count threshold) return true; } return false; }核心逻辑两级检查函数采用“快速失败 慢速确认”的两级策略快速检查cpumask_weight(mm_cpumask(mm))获取mm_cpumask中 CPU 的数量。如果这个总数不超过阈值直接返回false。注释指出这能“快速排除大多数单线程程序”因为单线程进程的mm_cpumask通常只包含少数几个 CPU。慢速确认如果mm_cpumask的 CPU 数量超过阈值则遍历mm_cpumask中的每个 CPU进行更严格的检查per_cpu(cpu_tlbstate.loaded_mm, cpu) ! mm跳过那些虽然出现在mm_cpumask中、但当前并未实际运行该进程的 CPU。per_cpu(cpu_tlbstate_shared.is_lazy, cpu)跳过处于“惰性 TLB”模式的 CPU这些 CPU 虽然还挂着该进程的页表但实际并未积极使用。计数只有当 CPU 确实在运行该mm且非惰性时才递增count。当count threshold时立即返回true。调用上下文这个函数由meets_global_asid_threshold()调用后者根据全局 ASID 空间的剩余量动态调整阈值空间充足时 3/4 可用阈值可低至2HALFFULL_THRESHOLD / 4。空间中等时 1/2 可用阈值为4HALFFULL_THRESHOLD / 2。空间紧张时阈值会翻倍增长确保只有活跃在大量 CPU 上的“重量级”多线程进程才能获得全局 ASID。这种设计确保在 ASID 空间有限KPTI 下仅约 2046 个而系统 CPU 数量可能超过 8000 的情况下全局 ASID 被分配给最能从中受益的进程。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →