关于页表项的 accessed bit,OS 页表管理可以定期将其复位,但 TLB 一般不参与该 bit 位的管理,因为 TLB 中的页表项均为最近要访问的。例如,在 cpu load/store 内存时,如果对应的页表项不在 TLB 中,cpu 会 walk page table 并将页表项的 accessed bit 置位(如果之前已经被清除了),然后将该页表项更新到 TLB 中(这样 TLB 记录的页表项的 accessed bit 也是置位的)。如果 OS 的 reclaimer 将页表的 accessed bit 清除了,但 TLB 并不同步更新(上面已经说了:TLB 一般不参与该 bit 位的一致性管理),所以需要 flush 掉 TLB,保证下次 cpu load/store 同一块内存时会再次经历 page table walk,并置位 accessed bit(给页表 reclaimer 用,如果不 flush tlb 的话,页表中的 accessed bit 仍是0,但 TLB 中仍是 1,后续的 cpu 访问不会再设置页表中的 accessed bit 为1了,因为不再经历 page table walk),并更新 TLB,可见这个过程会使性能下降(导致 TLB shootdown)。
本 patch 清除 accessed bit 后不 flush tlb,在 4K page size时可能影响很小(tlb size * 4k 也没多少内存,对 page reclaim 影响不大)。如果是 hugepage 的话影响可能就大了,好在根据统计在页面回收清除页表项的 accessed bit 之后,在 cpu 再次访问该页面之前,