我正在阅读linux内核中的TLB击落代码,我看到击落ipi仅发送到相应cpu_vm_mask_var
中mm_struct
中的cpu集中,但是我找不到{{1} }正在更新。
所以问题是:
cpu_vm_mask_var
中的cpu_vm_mask_var
字段代表什么?我认为在击落情况下,mm_struct
应该说多少个CPU包含当前进程中的TLB条目,但是cpu_vm_mask_var
到底要维护什么?
答案 0 :(得分:2)
每个进程的内存描述符都有一个称为cpu_vm_mask_var
的位掩码,通常在进程在至少一个处理器上执行时使用。当某个进程计划在处理器上运行时,将设置位掩码的相应位。类似地,当调度程序决定在处理器上运行其他内容时,相应的被重置。在以下三种情况下修改了字段cpu_vm_mask_var
:
cpu_vm_mask_var
用于支持惰性TLB切换机制。如果调度程序决定运行内核线程,它将通过调用enter_lazy_tlb来打开惰性TLB模式。但是,在这种情况下,由于内核线程不访问用户模式条目,因此无需使引用用户模式页面结构条目的TLB条目无效。因此,可以通过对运行内核线程的处理器禁用TLB击倒请求并延迟失效,直到切换回可能使用失效条目的进程来提高性能。当运行内核线程的处理器第一次收到处理器间中断以使一个或多个TLB条目无效时,将调用switch_mm_irqs_off函数。此功能(在这种特定情况下)将重置位掩码中与当前处理器相对应的位,以使其不再接收任何有关刷新TLB用户模式条目的IPI。当处理器切换到具有不同内存描述符的进程时,对CR3的写入将刷新所有非全局TLB条目。否则,当处理器切换回同一进程时,它知道一个或多个已变为无效,因此还刷新了所有非全局TLB条目。 cpu_vm_mask_var
在switch_mm_irqs_off
中被修改。请注意,刷新内核模式TLB条目不使用此机制。