mm_struct中的cpumask是什么

时间:2018-10-16 04:21:58

标签: c linux linux-kernel cpu-architecture

我正在阅读linux内核中的TLB击落代码,我看到击落ipi仅发送到相应cpu_vm_mask_varmm_struct中的cpu集中,但是我找不到{{1} }正在更新。

所以问题是:

  1. cpu_vm_mask_var中的cpu_vm_mask_var字段代表什么?
  2. 它在哪里更新?

我认为在击落情况下,mm_struct应该说多少个CPU包含当前进程中的TLB条目,但是cpu_vm_mask_var到底要维护什么?

1 个答案:

答案 0 :(得分:2)

每个进程的内存描述符都有一个称为cpu_vm_mask_var的位掩码,通常在进程在至少一个处理器上执行时使用。当某个进程计划在处理器上运行时,将设置位掩码的相应位。类似地,当调度程序决定在处理器上运行其他内容时,相应的被重置。在以下三种情况下修改了字段cpu_vm_mask_var

  • 通过调用switch_mm来更改内存描述符时。在这种情况下,与当前处理器相对应的位将为上一个进程清除,并为下一个进程设置。
  • 将新处理器添加到系统后,将调用clear_tasks_mm_cpumask函数,该函数将重置与新处理器相对应的位。
  • cpu_vm_mask_var用于支持惰性TLB切换机制。如果调度程序决定运行内核线程,它将通过调用enter_lazy_tlb来打开惰性TLB模式。但是,在这种情况下,由于内核线程不访问用户模式条目,因此无需使引用用户模式页面结构条目的TLB条目无效。因此,可以通过对运行内核线程的处理器禁用TLB击倒请求并延迟失效,直到切换回可能使用失效条目的进程来提高性能。当运行内核线程的处理器第一次收到处理器间中断以使一个或多个TLB条目无效时,将调用switch_mm_irqs_off函数。此功能(在这种特定情况下)将重置位掩码中与当前处理器相对应的位,以使其不再接收任何有关刷新TLB用户模式条目的IPI。当处理器切换到具有不同内存描述符的进程时,对CR3的写入将刷新所有非全局TLB条目。否则,当处理器切换回同一进程时,它知道一个或多个已变为无效,因此还刷新了所有非全局TLB条目。 cpu_vm_mask_varswitch_mm_irqs_off中被修改。请注意,刷新内核模式TLB条目不使用此机制。