~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/split_page_table_lock.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 :Original: Documentation/mm/split_page_table_lock.rst
  2 
  3 :翻译:
  4 
  5  司延腾 Yanteng Si <siyanteng@loongson.cn>
  6 
  7 :校译:
  8 
  9 
 10 =================================
 11 分页表锁(split page table lock)
 12 =================================
 13 
 14 最初,mm->page_table_lock spinlock保护了mm_struct的所有页表。但是这种方
 15 法导致了多线程应用程序的缺页异常可扩展性差,因为对锁的争夺很激烈。为了提高可扩
 16 展性,我们引入了分页表锁。
 17 
 18 有了分页表锁,我们就有了单独的每张表锁来顺序化对表的访问。目前,我们对PTE和
 19 PMD表使用分页锁。对高层表的访问由mm->page_table_lock保护。
 20 
 21 有一些辅助工具来锁定/解锁一个表和其他访问器函数:
 22 
 23  - pte_offset_map_lock()
 24         映射pte并获取PTE表锁,返回所取锁的指针;
 25  - pte_unmap_unlock()
 26         解锁和解映射PTE表;
 27  - pte_alloc_map_lock()
 28         如果需要的话,分配PTE表并获取锁,如果分配失败,返回已获取的锁的指针
 29         或NULL;
 30  - pte_lockptr()
 31         返回指向PTE表锁的指针;
 32  - pmd_lock()
 33         取得PMD表锁,返回所取锁的指针。
 34  - pmd_lockptr()
 35         返回指向PMD表锁的指针;
 36 
 37 如果CONFIG_SPLIT_PTLOCK_CPUS(通常为4)小于或等于NR_CPUS,则在编译
 38 时启用PTE表的分页表锁。如果分页锁被禁用,所有的表都由mm->page_table_lock
 39 来保护。
 40 
 41 如果PMD表启用了分页锁,并且架构支持它,那么PMD表的分页锁就会被启用(见
 42 下文)。
 43 
 44 Hugetlb 和分页表锁
 45 ==================
 46 
 47 Hugetlb可以支持多种页面大小。我们只对PMD级别使用分页锁,但不对PUD使用。
 48 
 49 Hugetlb特定的辅助函数:
 50 
 51  - huge_pte_lock()
 52         对PMD_SIZE页面采取pmd分割锁,否则mm->page_table_lock;
 53  - huge_pte_lockptr()
 54         返回指向表锁的指针。
 55 
 56 架构对分页表锁的支持
 57 ====================
 58 
 59 没有必要特别启用PTE分页表锁:所有需要的东西都由pagetable_pte_ctor()
 60 和pagetable_pte_dtor()完成,它们必须在PTE表分配/释放时被调用。
 61 
 62 确保架构不使用slab分配器来分配页表:slab使用page->slab_cache来分配其页
 63 面。这个区域与page->ptl共享存储。
 64 
 65 PMD分页锁只有在你有两个以上的页表级别时才有意义。
 66 
 67 启用PMD分页锁需要在PMD表分配时调用pagetable_pmd_ctor(),在释放时调
 68 用pagetable_pmd_dtor()。
 69 
 70 分配通常发生在pmd_alloc_one()中,释放发生在pmd_free()和pmd_free_tlb()
 71 中,但要确保覆盖所有的PMD表分配/释放路径:即X86_PAE在pgd_alloc()中预先
 72 分配一些PMD。
 73 
 74 一切就绪后,你可以设置CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK。
 75 
 76 注意:pagetable_pte_ctor()和pagetable_pmd_ctor()可能失败--必
 77 须正确处理。
 78 
 79 page->ptl
 80 =========
 81 
 82 page->ptl用于访问分割页表锁,其中'page'是包含该表的页面struct page。它
 83 与page->private(以及union中的其他几个字段)共享存储。
 84 
 85 为了避免增加struct page的大小并获得最佳性能,我们使用了一个技巧:
 86 
 87  - 如果spinlock_t适合于long,我们使用page->ptr作为spinlock,这样我们
 88    就可以避免间接访问并节省一个缓存行。
 89  - 如果spinlock_t的大小大于long的大小,我们使用page->ptl作为spinlock_t
 90    的指针并动态分配它。这允许在启用DEBUG_SPINLOCK或DEBUG_LOCK_ALLOC的
 91    情况下使用分页锁,但由于间接访问而多花了一个缓存行。
 92 
 93 PTE表的spinlock_t分配在pagetable_pte_ctor()中,PMD表的spinlock_t
 94 分配在pagetable_pmd_ctor()中。
 95 
 96 请不要直接访问page->ptl - -使用适当的辅助函数。

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php