☰
tlb mm_active_cpus_exceeds
2026/10/1 10:20:59 网站建设 项目流程

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 aren't 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; }

核心逻辑:两级检查

函数采用“快速失败 + 慢速确认”的两级策略:

  1. 快速检查:cpumask_weight(mm_cpumask(mm))获取mm_cpumask中 CPU 的数量。如果这个总数不超过阈值,直接返回false。注释指出这能“快速排除大多数单线程程序”,因为单线程进程的mm_cpumask通常只包含少数几个 CPU。

  2. 慢速确认:如果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 可用),阈值可低至2(HALFFULL_THRESHOLD / 4)。

  • 空间中等时(> 1/2 可用),阈值为4(HALFFULL_THRESHOLD / 2)。

  • 空间紧张时,阈值会翻倍增长,确保只有活跃在大量 CPU 上的“重量级”多线程进程才能获得全局 ASID。

这种设计确保在 ASID 空间有限(KPTI 下仅约 2046 个)而系统 CPU 数量可能超过 8000 的情况下,全局 ASID 被分配给最能从中受益的进程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询