debug_vm_pgtable.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * This kernel test validates architecture page table helpers and
  4. * accessors and helps in verifying their continued compliance with
  5. * expected generic MM semantics.
  6. *
  7. * Copyright (C) 2019 ARM Ltd.
  8. *
  9. * Author: Anshuman Khandual <anshuman.khandual@arm.com>
  10. */
  11. #define pr_fmt(fmt) "debug_vm_pgtable: [%-25s]: " fmt, __func__
  12. #include <linux/gfp.h>
  13. #include <linux/highmem.h>
  14. #include <linux/hugetlb.h>
  15. #include <linux/kernel.h>
  16. #include <linux/kconfig.h>
  17. #include <linux/memblock.h>
  18. #include <linux/mm.h>
  19. #include <linux/mman.h>
  20. #include <linux/mm_types.h>
  21. #include <linux/module.h>
  22. #include <linux/printk.h>
  23. #include <linux/pgtable.h>
  24. #include <linux/random.h>
  25. #include <linux/spinlock.h>
  26. #include <linux/swap.h>
  27. #include <linux/leafops.h>
  28. #include <linux/start_kernel.h>
  29. #include <linux/sched/mm.h>
  30. #include <linux/io.h>
  31. #include <linux/vmalloc.h>
  32. #include <linux/pgalloc.h>
  33. #include <asm/cacheflush.h>
  34. #include <asm/tlbflush.h>
  35. /*
  36. * Please refer Documentation/mm/arch_pgtable_helpers.rst for the semantics
  37. * expectations that are being validated here. All future changes in here
  38. * or the documentation need to be in sync.
  39. */
  40. #define RANDOM_NZVALUE GENMASK(7, 0)
  41. struct pgtable_debug_args {
  42. struct mm_struct *mm;
  43. struct vm_area_struct *vma;
  44. pgd_t *pgdp;
  45. p4d_t *p4dp;
  46. pud_t *pudp;
  47. pmd_t *pmdp;
  48. pte_t *ptep;
  49. p4d_t *start_p4dp;
  50. pud_t *start_pudp;
  51. pmd_t *start_pmdp;
  52. pgtable_t start_ptep;
  53. unsigned long vaddr;
  54. pgprot_t page_prot;
  55. pgprot_t page_prot_none;
  56. bool is_contiguous_page;
  57. unsigned long pud_pfn;
  58. unsigned long pmd_pfn;
  59. unsigned long pte_pfn;
  60. unsigned long fixed_alignment;
  61. unsigned long fixed_pgd_pfn;
  62. unsigned long fixed_p4d_pfn;
  63. unsigned long fixed_pud_pfn;
  64. unsigned long fixed_pmd_pfn;
  65. unsigned long fixed_pte_pfn;
  66. swp_entry_t swp_entry;
  67. swp_entry_t leaf_entry;
  68. };
  69. static void __init pte_basic_tests(struct pgtable_debug_args *args, int idx)
  70. {
  71. pgprot_t prot = vm_get_page_prot(idx);
  72. pte_t pte = pfn_pte(args->fixed_pte_pfn, prot);
  73. unsigned long val = idx, *ptr = &val;
  74. pr_debug("Validating PTE basic (%pGv)\n", ptr);
  75. /*
  76. * This test needs to be executed after the given page table entry
  77. * is created with pfn_pte() to make sure that vm_get_page_prot(idx)
  78. * does not have the dirty bit enabled from the beginning. This is
  79. * important for platforms like arm64 where (!PTE_RDONLY) indicate
  80. * dirty bit being set.
  81. */
  82. WARN_ON(pte_dirty(pte_wrprotect(pte)));
  83. WARN_ON(!pte_same(pte, pte));
  84. WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte))));
  85. WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte))));
  86. WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte), args->vma)));
  87. WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte))));
  88. WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte))));
  89. WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte, args->vma))));
  90. WARN_ON(pte_dirty(pte_wrprotect(pte_mkclean(pte))));
  91. WARN_ON(!pte_dirty(pte_wrprotect(pte_mkdirty(pte))));
  92. WARN_ON(!pte_dirty(pte_mkwrite_novma(pte_mkdirty(pte))));
  93. WARN_ON(pte_dirty(pte_mkwrite_novma(pte_mkclean(pte))));
  94. WARN_ON(!pte_write(pte_mkdirty(pte_mkwrite_novma(pte))));
  95. WARN_ON(!pte_write(pte_mkwrite_novma(pte_wrprotect(pte))));
  96. WARN_ON(pte_write(pte_wrprotect(pte_mkwrite_novma(pte))));
  97. }
  98. static void __init pte_advanced_tests(struct pgtable_debug_args *args)
  99. {
  100. struct page *page;
  101. pte_t pte;
  102. /*
  103. * Architectures optimize set_pte_at by avoiding TLB flush.
  104. * This requires set_pte_at to be not used to update an
  105. * existing pte entry. Clear pte before we do set_pte_at
  106. *
  107. * flush_dcache_page() is called after set_pte_at() to clear
  108. * PG_arch_1 for the page on ARM64. The page flag isn't cleared
  109. * when it's released and page allocation check will fail when
  110. * the page is allocated again. For architectures other than ARM64,
  111. * the unexpected overhead of cache flushing is acceptable.
  112. */
  113. page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
  114. if (!page)
  115. return;
  116. pr_debug("Validating PTE advanced\n");
  117. if (WARN_ON(!args->ptep))
  118. return;
  119. pte = pfn_pte(args->pte_pfn, args->page_prot);
  120. set_pte_at(args->mm, args->vaddr, args->ptep, pte);
  121. flush_dcache_page(page);
  122. ptep_set_wrprotect(args->mm, args->vaddr, args->ptep);
  123. pte = ptep_get(args->ptep);
  124. WARN_ON(pte_write(pte));
  125. ptep_get_and_clear(args->mm, args->vaddr, args->ptep);
  126. pte = ptep_get(args->ptep);
  127. WARN_ON(!pte_none(pte));
  128. pte = pfn_pte(args->pte_pfn, args->page_prot);
  129. pte = pte_wrprotect(pte);
  130. pte = pte_mkclean(pte);
  131. set_pte_at(args->mm, args->vaddr, args->ptep, pte);
  132. flush_dcache_page(page);
  133. pte = pte_mkwrite(pte, args->vma);
  134. pte = pte_mkdirty(pte);
  135. ptep_set_access_flags(args->vma, args->vaddr, args->ptep, pte, 1);
  136. pte = ptep_get(args->ptep);
  137. WARN_ON(!(pte_write(pte) && pte_dirty(pte)));
  138. ptep_get_and_clear_full(args->mm, args->vaddr, args->ptep, 1);
  139. pte = ptep_get(args->ptep);
  140. WARN_ON(!pte_none(pte));
  141. pte = pfn_pte(args->pte_pfn, args->page_prot);
  142. pte = pte_mkyoung(pte);
  143. set_pte_at(args->mm, args->vaddr, args->ptep, pte);
  144. flush_dcache_page(page);
  145. ptep_test_and_clear_young(args->vma, args->vaddr, args->ptep);
  146. pte = ptep_get(args->ptep);
  147. WARN_ON(pte_young(pte));
  148. ptep_get_and_clear_full(args->mm, args->vaddr, args->ptep, 1);
  149. }
  150. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  151. static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx)
  152. {
  153. pgprot_t prot = vm_get_page_prot(idx);
  154. unsigned long val = idx, *ptr = &val;
  155. pmd_t pmd;
  156. if (!has_transparent_hugepage())
  157. return;
  158. pr_debug("Validating PMD basic (%pGv)\n", ptr);
  159. pmd = pfn_pmd(args->fixed_pmd_pfn, prot);
  160. /*
  161. * This test needs to be executed after the given page table entry
  162. * is created with pfn_pmd() to make sure that vm_get_page_prot(idx)
  163. * does not have the dirty bit enabled from the beginning. This is
  164. * important for platforms like arm64 where (!PTE_RDONLY) indicate
  165. * dirty bit being set.
  166. */
  167. WARN_ON(pmd_dirty(pmd_wrprotect(pmd)));
  168. WARN_ON(!pmd_same(pmd, pmd));
  169. WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd))));
  170. WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd))));
  171. WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd), args->vma)));
  172. WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd))));
  173. WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd))));
  174. WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd, args->vma))));
  175. WARN_ON(pmd_dirty(pmd_wrprotect(pmd_mkclean(pmd))));
  176. WARN_ON(!pmd_dirty(pmd_wrprotect(pmd_mkdirty(pmd))));
  177. WARN_ON(!pmd_dirty(pmd_mkwrite_novma(pmd_mkdirty(pmd))));
  178. WARN_ON(pmd_dirty(pmd_mkwrite_novma(pmd_mkclean(pmd))));
  179. WARN_ON(!pmd_write(pmd_mkdirty(pmd_mkwrite_novma(pmd))));
  180. WARN_ON(!pmd_write(pmd_mkwrite_novma(pmd_wrprotect(pmd))));
  181. WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite_novma(pmd))));
  182. /*
  183. * A huge page does not point to next level page table
  184. * entry. Hence this must qualify as pmd_bad().
  185. */
  186. WARN_ON(!pmd_bad(pmd_mkhuge(pmd)));
  187. }
  188. static void __init pmd_advanced_tests(struct pgtable_debug_args *args)
  189. {
  190. struct page *page;
  191. pmd_t pmd;
  192. unsigned long vaddr = args->vaddr;
  193. if (!has_transparent_hugepage())
  194. return;
  195. page = (args->pmd_pfn != ULONG_MAX) ? pfn_to_page(args->pmd_pfn) : NULL;
  196. if (!page)
  197. return;
  198. /*
  199. * flush_dcache_page() is called after set_pmd_at() to clear
  200. * PG_arch_1 for the page on ARM64. The page flag isn't cleared
  201. * when it's released and page allocation check will fail when
  202. * the page is allocated again. For architectures other than ARM64,
  203. * the unexpected overhead of cache flushing is acceptable.
  204. */
  205. pr_debug("Validating PMD advanced\n");
  206. /* Align the address wrt HPAGE_PMD_SIZE */
  207. vaddr &= HPAGE_PMD_MASK;
  208. pgtable_trans_huge_deposit(args->mm, args->pmdp, args->start_ptep);
  209. pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
  210. set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
  211. flush_dcache_page(page);
  212. pmdp_set_wrprotect(args->mm, vaddr, args->pmdp);
  213. pmd = pmdp_get(args->pmdp);
  214. WARN_ON(pmd_write(pmd));
  215. pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
  216. pmd = pmdp_get(args->pmdp);
  217. WARN_ON(!pmd_none(pmd));
  218. pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
  219. pmd = pmd_wrprotect(pmd);
  220. pmd = pmd_mkclean(pmd);
  221. set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
  222. flush_dcache_page(page);
  223. pmd = pmd_mkwrite(pmd, args->vma);
  224. pmd = pmd_mkdirty(pmd);
  225. pmdp_set_access_flags(args->vma, vaddr, args->pmdp, pmd, 1);
  226. pmd = pmdp_get(args->pmdp);
  227. WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd)));
  228. pmdp_huge_get_and_clear_full(args->vma, vaddr, args->pmdp, 1);
  229. pmd = pmdp_get(args->pmdp);
  230. WARN_ON(!pmd_none(pmd));
  231. pmd = pmd_mkhuge(pfn_pmd(args->pmd_pfn, args->page_prot));
  232. pmd = pmd_mkyoung(pmd);
  233. set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
  234. flush_dcache_page(page);
  235. pmdp_test_and_clear_young(args->vma, vaddr, args->pmdp);
  236. pmd = pmdp_get(args->pmdp);
  237. WARN_ON(pmd_young(pmd));
  238. /* Clear the pte entries */
  239. pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
  240. pgtable_trans_huge_withdraw(args->mm, args->pmdp);
  241. }
  242. static void __init pmd_leaf_tests(struct pgtable_debug_args *args)
  243. {
  244. pmd_t pmd;
  245. if (!has_transparent_hugepage())
  246. return;
  247. pr_debug("Validating PMD leaf\n");
  248. pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
  249. /*
  250. * PMD based THP is a leaf entry.
  251. */
  252. pmd = pmd_mkhuge(pmd);
  253. WARN_ON(!pmd_leaf(pmd));
  254. }
  255. #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
  256. static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx)
  257. {
  258. pgprot_t prot = vm_get_page_prot(idx);
  259. unsigned long val = idx, *ptr = &val;
  260. pud_t pud;
  261. if (!has_transparent_pud_hugepage())
  262. return;
  263. pr_debug("Validating PUD basic (%pGv)\n", ptr);
  264. pud = pfn_pud(args->fixed_pud_pfn, prot);
  265. /*
  266. * This test needs to be executed after the given page table entry
  267. * is created with pfn_pud() to make sure that vm_get_page_prot(idx)
  268. * does not have the dirty bit enabled from the beginning. This is
  269. * important for platforms like arm64 where (!PTE_RDONLY) indicate
  270. * dirty bit being set.
  271. */
  272. WARN_ON(pud_dirty(pud_wrprotect(pud)));
  273. WARN_ON(!pud_same(pud, pud));
  274. WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud))));
  275. WARN_ON(!pud_dirty(pud_mkdirty(pud_mkclean(pud))));
  276. WARN_ON(pud_dirty(pud_mkclean(pud_mkdirty(pud))));
  277. WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud))));
  278. WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud))));
  279. WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud))));
  280. WARN_ON(pud_dirty(pud_wrprotect(pud_mkclean(pud))));
  281. WARN_ON(!pud_dirty(pud_wrprotect(pud_mkdirty(pud))));
  282. if (mm_pmd_folded(args->mm))
  283. return;
  284. /*
  285. * A huge page does not point to next level page table
  286. * entry. Hence this must qualify as pud_bad().
  287. */
  288. WARN_ON(!pud_bad(pud_mkhuge(pud)));
  289. }
  290. static void __init pud_advanced_tests(struct pgtable_debug_args *args)
  291. {
  292. struct page *page;
  293. unsigned long vaddr = args->vaddr;
  294. pud_t pud;
  295. if (!has_transparent_pud_hugepage())
  296. return;
  297. page = (args->pud_pfn != ULONG_MAX) ? pfn_to_page(args->pud_pfn) : NULL;
  298. if (!page)
  299. return;
  300. /*
  301. * flush_dcache_page() is called after set_pud_at() to clear
  302. * PG_arch_1 for the page on ARM64. The page flag isn't cleared
  303. * when it's released and page allocation check will fail when
  304. * the page is allocated again. For architectures other than ARM64,
  305. * the unexpected overhead of cache flushing is acceptable.
  306. */
  307. pr_debug("Validating PUD advanced\n");
  308. /* Align the address wrt HPAGE_PUD_SIZE */
  309. vaddr &= HPAGE_PUD_MASK;
  310. pud = pfn_pud(args->pud_pfn, args->page_prot);
  311. set_pud_at(args->mm, vaddr, args->pudp, pud);
  312. flush_dcache_page(page);
  313. pudp_set_wrprotect(args->mm, vaddr, args->pudp);
  314. pud = pudp_get(args->pudp);
  315. WARN_ON(pud_write(pud));
  316. #ifndef __PAGETABLE_PMD_FOLDED
  317. pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
  318. pud = pudp_get(args->pudp);
  319. WARN_ON(!pud_none(pud));
  320. #endif /* __PAGETABLE_PMD_FOLDED */
  321. pud = pfn_pud(args->pud_pfn, args->page_prot);
  322. pud = pud_wrprotect(pud);
  323. pud = pud_mkclean(pud);
  324. set_pud_at(args->mm, vaddr, args->pudp, pud);
  325. flush_dcache_page(page);
  326. pud = pud_mkwrite(pud);
  327. pud = pud_mkdirty(pud);
  328. pudp_set_access_flags(args->vma, vaddr, args->pudp, pud, 1);
  329. pud = pudp_get(args->pudp);
  330. WARN_ON(!(pud_write(pud) && pud_dirty(pud)));
  331. #ifndef __PAGETABLE_PMD_FOLDED
  332. pudp_huge_get_and_clear_full(args->vma, vaddr, args->pudp, 1);
  333. pud = pudp_get(args->pudp);
  334. WARN_ON(!pud_none(pud));
  335. #endif /* __PAGETABLE_PMD_FOLDED */
  336. pud = pfn_pud(args->pud_pfn, args->page_prot);
  337. pud = pud_mkyoung(pud);
  338. set_pud_at(args->mm, vaddr, args->pudp, pud);
  339. flush_dcache_page(page);
  340. pudp_test_and_clear_young(args->vma, vaddr, args->pudp);
  341. pud = pudp_get(args->pudp);
  342. WARN_ON(pud_young(pud));
  343. pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
  344. }
  345. static void __init pud_leaf_tests(struct pgtable_debug_args *args)
  346. {
  347. pud_t pud;
  348. if (!has_transparent_pud_hugepage())
  349. return;
  350. pr_debug("Validating PUD leaf\n");
  351. pud = pfn_pud(args->fixed_pud_pfn, args->page_prot);
  352. /*
  353. * PUD based THP is a leaf entry.
  354. */
  355. pud = pud_mkhuge(pud);
  356. WARN_ON(!pud_leaf(pud));
  357. }
  358. #else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
  359. static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
  360. static void __init pud_advanced_tests(struct pgtable_debug_args *args) { }
  361. static void __init pud_leaf_tests(struct pgtable_debug_args *args) { }
  362. #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
  363. #else /* !CONFIG_TRANSPARENT_HUGEPAGE */
  364. static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx) { }
  365. static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
  366. static void __init pmd_advanced_tests(struct pgtable_debug_args *args) { }
  367. static void __init pud_advanced_tests(struct pgtable_debug_args *args) { }
  368. static void __init pmd_leaf_tests(struct pgtable_debug_args *args) { }
  369. static void __init pud_leaf_tests(struct pgtable_debug_args *args) { }
  370. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  371. #ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
  372. static void __init pmd_huge_tests(struct pgtable_debug_args *args)
  373. {
  374. pmd_t pmd;
  375. if (!arch_vmap_pmd_supported(args->page_prot) ||
  376. args->fixed_alignment < PMD_SIZE)
  377. return;
  378. pr_debug("Validating PMD huge\n");
  379. /*
  380. * X86 defined pmd_set_huge() verifies that the given
  381. * PMD is not a populated non-leaf entry.
  382. */
  383. WRITE_ONCE(*args->pmdp, __pmd(0));
  384. WARN_ON(!pmd_set_huge(args->pmdp, __pfn_to_phys(args->fixed_pmd_pfn), args->page_prot));
  385. WARN_ON(!pmd_clear_huge(args->pmdp));
  386. pmd = pmdp_get(args->pmdp);
  387. WARN_ON(!pmd_none(pmd));
  388. }
  389. static void __init pud_huge_tests(struct pgtable_debug_args *args)
  390. {
  391. pud_t pud;
  392. if (!arch_vmap_pud_supported(args->page_prot) ||
  393. args->fixed_alignment < PUD_SIZE)
  394. return;
  395. pr_debug("Validating PUD huge\n");
  396. /*
  397. * X86 defined pud_set_huge() verifies that the given
  398. * PUD is not a populated non-leaf entry.
  399. */
  400. WRITE_ONCE(*args->pudp, __pud(0));
  401. WARN_ON(!pud_set_huge(args->pudp, __pfn_to_phys(args->fixed_pud_pfn), args->page_prot));
  402. WARN_ON(!pud_clear_huge(args->pudp));
  403. pud = pudp_get(args->pudp);
  404. WARN_ON(!pud_none(pud));
  405. }
  406. #else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */
  407. static void __init pmd_huge_tests(struct pgtable_debug_args *args) { }
  408. static void __init pud_huge_tests(struct pgtable_debug_args *args) { }
  409. #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
  410. static void __init p4d_basic_tests(struct pgtable_debug_args *args)
  411. {
  412. p4d_t p4d;
  413. pr_debug("Validating P4D basic\n");
  414. memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t));
  415. WARN_ON(!p4d_same(p4d, p4d));
  416. }
  417. static void __init pgd_basic_tests(struct pgtable_debug_args *args)
  418. {
  419. pgd_t pgd;
  420. pr_debug("Validating PGD basic\n");
  421. memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t));
  422. WARN_ON(!pgd_same(pgd, pgd));
  423. }
  424. #ifndef __PAGETABLE_PUD_FOLDED
  425. static void __init pud_clear_tests(struct pgtable_debug_args *args)
  426. {
  427. pud_t pud = pudp_get(args->pudp);
  428. if (mm_pmd_folded(args->mm))
  429. return;
  430. pr_debug("Validating PUD clear\n");
  431. WARN_ON(pud_none(pud));
  432. pud_clear(args->pudp);
  433. pud = pudp_get(args->pudp);
  434. WARN_ON(!pud_none(pud));
  435. }
  436. static void __init pud_populate_tests(struct pgtable_debug_args *args)
  437. {
  438. pud_t pud;
  439. if (mm_pmd_folded(args->mm))
  440. return;
  441. pr_debug("Validating PUD populate\n");
  442. /*
  443. * This entry points to next level page table page.
  444. * Hence this must not qualify as pud_bad().
  445. */
  446. pud_populate(args->mm, args->pudp, args->start_pmdp);
  447. pud = pudp_get(args->pudp);
  448. WARN_ON(pud_bad(pud));
  449. }
  450. #else /* !__PAGETABLE_PUD_FOLDED */
  451. static void __init pud_clear_tests(struct pgtable_debug_args *args) { }
  452. static void __init pud_populate_tests(struct pgtable_debug_args *args) { }
  453. #endif /* PAGETABLE_PUD_FOLDED */
  454. #ifndef __PAGETABLE_P4D_FOLDED
  455. static void __init p4d_clear_tests(struct pgtable_debug_args *args)
  456. {
  457. p4d_t p4d = p4dp_get(args->p4dp);
  458. if (mm_pud_folded(args->mm))
  459. return;
  460. pr_debug("Validating P4D clear\n");
  461. WARN_ON(p4d_none(p4d));
  462. p4d_clear(args->p4dp);
  463. p4d = p4dp_get(args->p4dp);
  464. WARN_ON(!p4d_none(p4d));
  465. }
  466. static void __init p4d_populate_tests(struct pgtable_debug_args *args)
  467. {
  468. p4d_t p4d;
  469. if (mm_pud_folded(args->mm))
  470. return;
  471. pr_debug("Validating P4D populate\n");
  472. /*
  473. * This entry points to next level page table page.
  474. * Hence this must not qualify as p4d_bad().
  475. */
  476. pud_clear(args->pudp);
  477. p4d_clear(args->p4dp);
  478. p4d_populate(args->mm, args->p4dp, args->start_pudp);
  479. p4d = p4dp_get(args->p4dp);
  480. WARN_ON(p4d_bad(p4d));
  481. }
  482. static void __init pgd_clear_tests(struct pgtable_debug_args *args)
  483. {
  484. pgd_t pgd = pgdp_get(args->pgdp);
  485. if (mm_p4d_folded(args->mm))
  486. return;
  487. pr_debug("Validating PGD clear\n");
  488. WARN_ON(pgd_none(pgd));
  489. pgd_clear(args->pgdp);
  490. pgd = pgdp_get(args->pgdp);
  491. WARN_ON(!pgd_none(pgd));
  492. }
  493. static void __init pgd_populate_tests(struct pgtable_debug_args *args)
  494. {
  495. pgd_t pgd;
  496. if (mm_p4d_folded(args->mm))
  497. return;
  498. pr_debug("Validating PGD populate\n");
  499. /*
  500. * This entry points to next level page table page.
  501. * Hence this must not qualify as pgd_bad().
  502. */
  503. p4d_clear(args->p4dp);
  504. pgd_clear(args->pgdp);
  505. pgd_populate(args->mm, args->pgdp, args->start_p4dp);
  506. pgd = pgdp_get(args->pgdp);
  507. WARN_ON(pgd_bad(pgd));
  508. }
  509. #else /* !__PAGETABLE_P4D_FOLDED */
  510. static void __init p4d_clear_tests(struct pgtable_debug_args *args) { }
  511. static void __init pgd_clear_tests(struct pgtable_debug_args *args) { }
  512. static void __init p4d_populate_tests(struct pgtable_debug_args *args) { }
  513. static void __init pgd_populate_tests(struct pgtable_debug_args *args) { }
  514. #endif /* PAGETABLE_P4D_FOLDED */
  515. static void __init pte_clear_tests(struct pgtable_debug_args *args)
  516. {
  517. struct page *page;
  518. pte_t pte = pfn_pte(args->pte_pfn, args->page_prot);
  519. page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
  520. if (!page)
  521. return;
  522. /*
  523. * flush_dcache_page() is called after set_pte_at() to clear
  524. * PG_arch_1 for the page on ARM64. The page flag isn't cleared
  525. * when it's released and page allocation check will fail when
  526. * the page is allocated again. For architectures other than ARM64,
  527. * the unexpected overhead of cache flushing is acceptable.
  528. */
  529. pr_debug("Validating PTE clear\n");
  530. if (WARN_ON(!args->ptep))
  531. return;
  532. set_pte_at(args->mm, args->vaddr, args->ptep, pte);
  533. WARN_ON(pte_none(pte));
  534. flush_dcache_page(page);
  535. barrier();
  536. ptep_clear(args->mm, args->vaddr, args->ptep);
  537. pte = ptep_get(args->ptep);
  538. WARN_ON(!pte_none(pte));
  539. }
  540. static void __init pmd_clear_tests(struct pgtable_debug_args *args)
  541. {
  542. pmd_t pmd = pmdp_get(args->pmdp);
  543. pr_debug("Validating PMD clear\n");
  544. WARN_ON(pmd_none(pmd));
  545. pmd_clear(args->pmdp);
  546. pmd = pmdp_get(args->pmdp);
  547. WARN_ON(!pmd_none(pmd));
  548. }
  549. static void __init pmd_populate_tests(struct pgtable_debug_args *args)
  550. {
  551. pmd_t pmd;
  552. pr_debug("Validating PMD populate\n");
  553. /*
  554. * This entry points to next level page table page.
  555. * Hence this must not qualify as pmd_bad().
  556. */
  557. pmd_populate(args->mm, args->pmdp, args->start_ptep);
  558. pmd = pmdp_get(args->pmdp);
  559. WARN_ON(pmd_bad(pmd));
  560. }
  561. static void __init pte_special_tests(struct pgtable_debug_args *args)
  562. {
  563. pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
  564. if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL))
  565. return;
  566. pr_debug("Validating PTE special\n");
  567. WARN_ON(!pte_special(pte_mkspecial(pte)));
  568. }
  569. static void __init pte_protnone_tests(struct pgtable_debug_args *args)
  570. {
  571. pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot_none);
  572. if (!IS_ENABLED(CONFIG_NUMA_BALANCING))
  573. return;
  574. pr_debug("Validating PTE protnone\n");
  575. WARN_ON(!pte_protnone(pte));
  576. WARN_ON(!pte_present(pte));
  577. }
  578. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  579. static void __init pmd_protnone_tests(struct pgtable_debug_args *args)
  580. {
  581. pmd_t pmd;
  582. if (!IS_ENABLED(CONFIG_NUMA_BALANCING))
  583. return;
  584. if (!has_transparent_hugepage())
  585. return;
  586. pr_debug("Validating PMD protnone\n");
  587. pmd = pmd_mkhuge(pfn_pmd(args->fixed_pmd_pfn, args->page_prot_none));
  588. WARN_ON(!pmd_protnone(pmd));
  589. WARN_ON(!pmd_present(pmd));
  590. }
  591. #else /* !CONFIG_TRANSPARENT_HUGEPAGE */
  592. static void __init pmd_protnone_tests(struct pgtable_debug_args *args) { }
  593. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  594. static void __init pte_soft_dirty_tests(struct pgtable_debug_args *args)
  595. {
  596. pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
  597. if (!pgtable_supports_soft_dirty())
  598. return;
  599. pr_debug("Validating PTE soft dirty\n");
  600. WARN_ON(!pte_soft_dirty(pte_mksoft_dirty(pte)));
  601. WARN_ON(pte_soft_dirty(pte_clear_soft_dirty(pte)));
  602. }
  603. static void __init pte_swap_soft_dirty_tests(struct pgtable_debug_args *args)
  604. {
  605. pte_t pte;
  606. softleaf_t entry;
  607. if (!pgtable_supports_soft_dirty())
  608. return;
  609. pr_debug("Validating PTE swap soft dirty\n");
  610. pte = swp_entry_to_pte(args->swp_entry);
  611. entry = softleaf_from_pte(pte);
  612. WARN_ON(!softleaf_is_swap(entry));
  613. WARN_ON(!pte_swp_soft_dirty(pte_swp_mksoft_dirty(pte)));
  614. WARN_ON(pte_swp_soft_dirty(pte_swp_clear_soft_dirty(pte)));
  615. }
  616. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  617. static void __init pmd_soft_dirty_tests(struct pgtable_debug_args *args)
  618. {
  619. pmd_t pmd;
  620. if (!pgtable_supports_soft_dirty())
  621. return;
  622. if (!has_transparent_hugepage())
  623. return;
  624. pr_debug("Validating PMD soft dirty\n");
  625. pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
  626. WARN_ON(!pmd_soft_dirty(pmd_mksoft_dirty(pmd)));
  627. WARN_ON(pmd_soft_dirty(pmd_clear_soft_dirty(pmd)));
  628. }
  629. static void __init pmd_leaf_soft_dirty_tests(struct pgtable_debug_args *args)
  630. {
  631. pmd_t pmd;
  632. if (!pgtable_supports_soft_dirty() ||
  633. !IS_ENABLED(CONFIG_ARCH_ENABLE_THP_MIGRATION))
  634. return;
  635. if (!has_transparent_hugepage())
  636. return;
  637. pr_debug("Validating PMD swap soft dirty\n");
  638. pmd = swp_entry_to_pmd(args->leaf_entry);
  639. WARN_ON(!pmd_is_huge(pmd));
  640. WARN_ON(!pmd_is_valid_softleaf(pmd));
  641. WARN_ON(!pmd_swp_soft_dirty(pmd_swp_mksoft_dirty(pmd)));
  642. WARN_ON(pmd_swp_soft_dirty(pmd_swp_clear_soft_dirty(pmd)));
  643. }
  644. #else /* !CONFIG_TRANSPARENT_HUGEPAGE */
  645. static void __init pmd_soft_dirty_tests(struct pgtable_debug_args *args) { }
  646. static void __init pmd_leaf_soft_dirty_tests(struct pgtable_debug_args *args) { }
  647. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  648. static void __init pte_swap_exclusive_tests(struct pgtable_debug_args *args)
  649. {
  650. swp_entry_t entry;
  651. softleaf_t softleaf;
  652. pte_t pte;
  653. pr_debug("Validating PTE swap exclusive\n");
  654. entry = args->swp_entry;
  655. pte = swp_entry_to_pte(entry);
  656. softleaf = softleaf_from_pte(pte);
  657. WARN_ON(pte_swp_exclusive(pte));
  658. WARN_ON(!softleaf_is_swap(softleaf));
  659. WARN_ON(memcmp(&entry, &softleaf, sizeof(entry)));
  660. pte = pte_swp_mkexclusive(pte);
  661. softleaf = softleaf_from_pte(pte);
  662. WARN_ON(!pte_swp_exclusive(pte));
  663. WARN_ON(!softleaf_is_swap(softleaf));
  664. WARN_ON(pte_swp_soft_dirty(pte));
  665. WARN_ON(memcmp(&entry, &softleaf, sizeof(entry)));
  666. pte = pte_swp_clear_exclusive(pte);
  667. softleaf = softleaf_from_pte(pte);
  668. WARN_ON(pte_swp_exclusive(pte));
  669. WARN_ON(!softleaf_is_swap(softleaf));
  670. WARN_ON(memcmp(&entry, &softleaf, sizeof(entry)));
  671. }
  672. static void __init pte_swap_tests(struct pgtable_debug_args *args)
  673. {
  674. swp_entry_t arch_entry;
  675. softleaf_t entry;
  676. pte_t pte1, pte2;
  677. pr_debug("Validating PTE swap\n");
  678. pte1 = swp_entry_to_pte(args->swp_entry);
  679. entry = softleaf_from_pte(pte1);
  680. WARN_ON(!softleaf_is_swap(entry));
  681. arch_entry = __pte_to_swp_entry(pte1);
  682. pte2 = __swp_entry_to_pte(arch_entry);
  683. WARN_ON(memcmp(&pte1, &pte2, sizeof(pte1)));
  684. }
  685. #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
  686. static void __init pmd_softleaf_tests(struct pgtable_debug_args *args)
  687. {
  688. swp_entry_t arch_entry;
  689. pmd_t pmd1, pmd2;
  690. if (!has_transparent_hugepage())
  691. return;
  692. pr_debug("Validating PMD swap\n");
  693. pmd1 = swp_entry_to_pmd(args->leaf_entry);
  694. WARN_ON(!pmd_is_huge(pmd1));
  695. WARN_ON(!pmd_is_valid_softleaf(pmd1));
  696. arch_entry = __pmd_to_swp_entry(pmd1);
  697. pmd2 = __swp_entry_to_pmd(arch_entry);
  698. WARN_ON(memcmp(&pmd1, &pmd2, sizeof(pmd1)));
  699. }
  700. #else /* !CONFIG_ARCH_ENABLE_THP_MIGRATION */
  701. static void __init pmd_softleaf_tests(struct pgtable_debug_args *args) { }
  702. #endif /* CONFIG_ARCH_ENABLE_THP_MIGRATION */
  703. static void __init swap_migration_tests(struct pgtable_debug_args *args)
  704. {
  705. struct page *page;
  706. softleaf_t entry;
  707. if (!IS_ENABLED(CONFIG_MIGRATION))
  708. return;
  709. /*
  710. * swap_migration_tests() requires a dedicated page as it needs to
  711. * be locked before creating a migration entry from it. Locking the
  712. * page that actually maps kernel text ('start_kernel') can be real
  713. * problematic. Lets use the allocated page explicitly for this
  714. * purpose.
  715. */
  716. page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
  717. if (!page)
  718. return;
  719. pr_debug("Validating swap migration\n");
  720. /*
  721. * make_[readable|writable]_migration_entry() expects given page to
  722. * be locked, otherwise it stumbles upon a BUG_ON().
  723. */
  724. __SetPageLocked(page);
  725. entry = make_writable_migration_entry(page_to_pfn(page));
  726. WARN_ON(!softleaf_is_migration(entry));
  727. WARN_ON(!softleaf_is_migration_write(entry));
  728. entry = make_readable_migration_entry(swp_offset(entry));
  729. WARN_ON(!softleaf_is_migration(entry));
  730. WARN_ON(softleaf_is_migration_write(entry));
  731. entry = make_readable_migration_entry(page_to_pfn(page));
  732. WARN_ON(!softleaf_is_migration(entry));
  733. WARN_ON(softleaf_is_migration_write(entry));
  734. __ClearPageLocked(page);
  735. }
  736. #ifdef CONFIG_HUGETLB_PAGE
  737. static void __init hugetlb_basic_tests(struct pgtable_debug_args *args)
  738. {
  739. pte_t pte;
  740. pr_debug("Validating HugeTLB basic\n");
  741. pte = pfn_pte(args->fixed_pmd_pfn, args->page_prot);
  742. pte = arch_make_huge_pte(pte, PMD_SHIFT, VM_ACCESS_FLAGS);
  743. #ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB
  744. WARN_ON(!pte_huge(pte));
  745. #endif
  746. WARN_ON(!huge_pte_dirty(huge_pte_mkdirty(pte)));
  747. WARN_ON(!huge_pte_write(huge_pte_mkwrite(huge_pte_wrprotect(pte))));
  748. WARN_ON(huge_pte_write(huge_pte_wrprotect(huge_pte_mkwrite(pte))));
  749. }
  750. #else /* !CONFIG_HUGETLB_PAGE */
  751. static void __init hugetlb_basic_tests(struct pgtable_debug_args *args) { }
  752. #endif /* CONFIG_HUGETLB_PAGE */
  753. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  754. static void __init pmd_thp_tests(struct pgtable_debug_args *args)
  755. {
  756. pmd_t pmd;
  757. if (!has_transparent_hugepage())
  758. return;
  759. pr_debug("Validating PMD based THP\n");
  760. /*
  761. * pmd_trans_huge() and pmd_present() must return positive after
  762. * MMU invalidation with pmd_mkinvalid(). This behavior is an
  763. * optimization for transparent huge page. pmd_trans_huge() must
  764. * be true if pmd_page() returns a valid THP to avoid taking the
  765. * pmd_lock when others walk over non transhuge pmds (i.e. there
  766. * are no THP allocated). Especially when splitting a THP and
  767. * removing the present bit from the pmd, pmd_trans_huge() still
  768. * needs to return true. pmd_present() should be true whenever
  769. * pmd_trans_huge() returns true.
  770. */
  771. pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
  772. WARN_ON(!pmd_trans_huge(pmd_mkhuge(pmd)));
  773. #ifndef __HAVE_ARCH_PMDP_INVALIDATE
  774. WARN_ON(!pmd_trans_huge(pmd_mkinvalid(pmd_mkhuge(pmd))));
  775. WARN_ON(!pmd_present(pmd_mkinvalid(pmd_mkhuge(pmd))));
  776. WARN_ON(!pmd_leaf(pmd_mkinvalid(pmd_mkhuge(pmd))));
  777. #endif /* __HAVE_ARCH_PMDP_INVALIDATE */
  778. }
  779. #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
  780. static void __init pud_thp_tests(struct pgtable_debug_args *args)
  781. {
  782. pud_t pud;
  783. if (!has_transparent_pud_hugepage())
  784. return;
  785. pr_debug("Validating PUD based THP\n");
  786. pud = pfn_pud(args->fixed_pud_pfn, args->page_prot);
  787. WARN_ON(!pud_trans_huge(pud_mkhuge(pud)));
  788. /*
  789. * pud_mkinvalid() has been dropped for now. Enable back
  790. * these tests when it comes back with a modified pud_present().
  791. *
  792. * WARN_ON(!pud_trans_huge(pud_mkinvalid(pud_mkhuge(pud))));
  793. * WARN_ON(!pud_present(pud_mkinvalid(pud_mkhuge(pud))));
  794. */
  795. }
  796. #else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
  797. static void __init pud_thp_tests(struct pgtable_debug_args *args) { }
  798. #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
  799. #else /* !CONFIG_TRANSPARENT_HUGEPAGE */
  800. static void __init pmd_thp_tests(struct pgtable_debug_args *args) { }
  801. static void __init pud_thp_tests(struct pgtable_debug_args *args) { }
  802. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  803. static unsigned long __init get_random_vaddr(void)
  804. {
  805. unsigned long random_vaddr, random_pages, total_user_pages;
  806. total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE;
  807. random_pages = get_random_long() % total_user_pages;
  808. random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE;
  809. return random_vaddr;
  810. }
  811. static void __init
  812. debug_vm_pgtable_free_huge_page(struct pgtable_debug_args *args,
  813. unsigned long pfn, int order)
  814. {
  815. #ifdef CONFIG_CONTIG_ALLOC
  816. if (args->is_contiguous_page) {
  817. free_contig_range(pfn, 1 << order);
  818. return;
  819. }
  820. #endif
  821. __free_pages(pfn_to_page(pfn), order);
  822. }
  823. static void __init destroy_args(struct pgtable_debug_args *args)
  824. {
  825. /* Free (huge) page */
  826. if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
  827. has_transparent_pud_hugepage() &&
  828. args->pud_pfn != ULONG_MAX) {
  829. debug_vm_pgtable_free_huge_page(args, args->pud_pfn, HPAGE_PUD_ORDER);
  830. args->pud_pfn = ULONG_MAX;
  831. args->pmd_pfn = ULONG_MAX;
  832. args->pte_pfn = ULONG_MAX;
  833. }
  834. if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
  835. has_transparent_hugepage() &&
  836. args->pmd_pfn != ULONG_MAX) {
  837. debug_vm_pgtable_free_huge_page(args, args->pmd_pfn, HPAGE_PMD_ORDER);
  838. args->pmd_pfn = ULONG_MAX;
  839. args->pte_pfn = ULONG_MAX;
  840. }
  841. if (args->pte_pfn != ULONG_MAX) {
  842. __free_page(pfn_to_page(args->pte_pfn));
  843. args->pte_pfn = ULONG_MAX;
  844. }
  845. /* Free page table entries */
  846. if (args->start_ptep) {
  847. pmd_clear(args->pmdp);
  848. pte_free(args->mm, args->start_ptep);
  849. mm_dec_nr_ptes(args->mm);
  850. }
  851. if (args->start_pmdp) {
  852. pud_clear(args->pudp);
  853. pmd_free(args->mm, args->start_pmdp);
  854. mm_dec_nr_pmds(args->mm);
  855. }
  856. if (args->start_pudp) {
  857. p4d_clear(args->p4dp);
  858. pud_free(args->mm, args->start_pudp);
  859. mm_dec_nr_puds(args->mm);
  860. }
  861. if (args->start_p4dp) {
  862. pgd_clear(args->pgdp);
  863. p4d_free(args->mm, args->start_p4dp);
  864. }
  865. /* Free vma and mm struct */
  866. if (args->vma)
  867. vm_area_free(args->vma);
  868. if (args->mm)
  869. mmput(args->mm);
  870. }
  871. static struct page * __init
  872. debug_vm_pgtable_alloc_huge_page(struct pgtable_debug_args *args, int order)
  873. {
  874. struct page *page = NULL;
  875. #ifdef CONFIG_CONTIG_ALLOC
  876. if (order > MAX_PAGE_ORDER) {
  877. page = alloc_contig_pages((1 << order), GFP_KERNEL,
  878. first_online_node, NULL);
  879. if (page) {
  880. args->is_contiguous_page = true;
  881. return page;
  882. }
  883. }
  884. #endif
  885. if (order <= MAX_PAGE_ORDER)
  886. page = alloc_pages(GFP_KERNEL, order);
  887. return page;
  888. }
  889. /*
  890. * Check if a physical memory range described by <pstart, pend> contains
  891. * an area that is of size psize, and aligned to psize.
  892. *
  893. * Don't use address 0, an all-zeroes physical address might mask bugs, and
  894. * it's not used on x86.
  895. */
  896. static void __init phys_align_check(phys_addr_t pstart,
  897. phys_addr_t pend, unsigned long psize,
  898. phys_addr_t *physp, unsigned long *alignp)
  899. {
  900. phys_addr_t aligned_start, aligned_end;
  901. if (pstart == 0)
  902. pstart = PAGE_SIZE;
  903. aligned_start = ALIGN(pstart, psize);
  904. aligned_end = aligned_start + psize;
  905. if (aligned_end > aligned_start && aligned_end <= pend) {
  906. *alignp = psize;
  907. *physp = aligned_start;
  908. }
  909. }
  910. static void __init init_fixed_pfns(struct pgtable_debug_args *args)
  911. {
  912. u64 idx;
  913. phys_addr_t phys, pstart, pend;
  914. /*
  915. * Initialize the fixed pfns. To do this, try to find a
  916. * valid physical range, preferably aligned to PUD_SIZE,
  917. * but settling for aligned to PMD_SIZE as a fallback. If
  918. * neither of those is found, use the physical address of
  919. * the start_kernel symbol.
  920. *
  921. * The memory doesn't need to be allocated, it just needs to exist
  922. * as usable memory. It won't be touched.
  923. *
  924. * The alignment is recorded, and can be checked to see if we
  925. * can run the tests that require an actual valid physical
  926. * address range on some architectures ({pmd,pud}_huge_test
  927. * on x86).
  928. */
  929. phys = __pa_symbol(&start_kernel);
  930. args->fixed_alignment = PAGE_SIZE;
  931. for_each_mem_range(idx, &pstart, &pend) {
  932. /* First check for a PUD-aligned area */
  933. phys_align_check(pstart, pend, PUD_SIZE, &phys,
  934. &args->fixed_alignment);
  935. /* If a PUD-aligned area is found, we're done */
  936. if (args->fixed_alignment == PUD_SIZE)
  937. break;
  938. /*
  939. * If no PMD-aligned area found yet, check for one,
  940. * but continue the loop to look for a PUD-aligned area.
  941. */
  942. if (args->fixed_alignment < PMD_SIZE)
  943. phys_align_check(pstart, pend, PMD_SIZE, &phys,
  944. &args->fixed_alignment);
  945. }
  946. args->fixed_pgd_pfn = __phys_to_pfn(phys & PGDIR_MASK);
  947. args->fixed_p4d_pfn = __phys_to_pfn(phys & P4D_MASK);
  948. args->fixed_pud_pfn = __phys_to_pfn(phys & PUD_MASK);
  949. args->fixed_pmd_pfn = __phys_to_pfn(phys & PMD_MASK);
  950. args->fixed_pte_pfn = __phys_to_pfn(phys & PAGE_MASK);
  951. WARN_ON(!pfn_valid(args->fixed_pte_pfn));
  952. }
  953. static int __init init_args(struct pgtable_debug_args *args)
  954. {
  955. unsigned long max_swap_offset;
  956. struct page *page = NULL;
  957. int ret = 0;
  958. /*
  959. * Initialize the debugging data.
  960. *
  961. * vm_get_page_prot(VM_NONE) or vm_get_page_prot(VM_SHARED|VM_NONE)
  962. * will help create page table entries with PROT_NONE permission as
  963. * required for pxx_protnone_tests().
  964. */
  965. memset(args, 0, sizeof(*args));
  966. args->vaddr = get_random_vaddr();
  967. args->page_prot = vm_get_page_prot(VM_ACCESS_FLAGS);
  968. args->page_prot_none = vm_get_page_prot(VM_NONE);
  969. args->is_contiguous_page = false;
  970. args->pud_pfn = ULONG_MAX;
  971. args->pmd_pfn = ULONG_MAX;
  972. args->pte_pfn = ULONG_MAX;
  973. args->fixed_pgd_pfn = ULONG_MAX;
  974. args->fixed_p4d_pfn = ULONG_MAX;
  975. args->fixed_pud_pfn = ULONG_MAX;
  976. args->fixed_pmd_pfn = ULONG_MAX;
  977. args->fixed_pte_pfn = ULONG_MAX;
  978. /* Allocate mm and vma */
  979. args->mm = mm_alloc();
  980. if (!args->mm) {
  981. pr_err("Failed to allocate mm struct\n");
  982. ret = -ENOMEM;
  983. goto error;
  984. }
  985. args->vma = vm_area_alloc(args->mm);
  986. if (!args->vma) {
  987. pr_err("Failed to allocate vma\n");
  988. ret = -ENOMEM;
  989. goto error;
  990. }
  991. /*
  992. * Allocate page table entries. They will be modified in the tests.
  993. * Lets save the page table entries so that they can be released
  994. * when the tests are completed.
  995. */
  996. args->pgdp = pgd_offset(args->mm, args->vaddr);
  997. args->p4dp = p4d_alloc(args->mm, args->pgdp, args->vaddr);
  998. if (!args->p4dp) {
  999. pr_err("Failed to allocate p4d entries\n");
  1000. ret = -ENOMEM;
  1001. goto error;
  1002. }
  1003. args->start_p4dp = p4d_offset(args->pgdp, 0UL);
  1004. WARN_ON(!args->start_p4dp);
  1005. args->pudp = pud_alloc(args->mm, args->p4dp, args->vaddr);
  1006. if (!args->pudp) {
  1007. pr_err("Failed to allocate pud entries\n");
  1008. ret = -ENOMEM;
  1009. goto error;
  1010. }
  1011. args->start_pudp = pud_offset(args->p4dp, 0UL);
  1012. WARN_ON(!args->start_pudp);
  1013. args->pmdp = pmd_alloc(args->mm, args->pudp, args->vaddr);
  1014. if (!args->pmdp) {
  1015. pr_err("Failed to allocate pmd entries\n");
  1016. ret = -ENOMEM;
  1017. goto error;
  1018. }
  1019. args->start_pmdp = pmd_offset(args->pudp, 0UL);
  1020. WARN_ON(!args->start_pmdp);
  1021. if (pte_alloc(args->mm, args->pmdp)) {
  1022. pr_err("Failed to allocate pte entries\n");
  1023. ret = -ENOMEM;
  1024. goto error;
  1025. }
  1026. args->start_ptep = pmd_pgtable(pmdp_get(args->pmdp));
  1027. WARN_ON(!args->start_ptep);
  1028. init_fixed_pfns(args);
  1029. /* See generic_max_swapfile_size(): probe the maximum offset */
  1030. max_swap_offset = swp_offset(softleaf_from_pte(softleaf_to_pte(swp_entry(0, ~0UL))));
  1031. /* Create a swp entry with all possible bits set while still being swap. */
  1032. args->swp_entry = swp_entry(MAX_SWAPFILES - 1, max_swap_offset);
  1033. /* Create a non-present migration entry. */
  1034. args->leaf_entry = make_writable_migration_entry(~0UL);
  1035. /*
  1036. * Allocate (huge) pages because some of the tests need to access
  1037. * the data in the pages. The corresponding tests will be skipped
  1038. * if we fail to allocate (huge) pages.
  1039. */
  1040. if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
  1041. has_transparent_pud_hugepage()) {
  1042. page = debug_vm_pgtable_alloc_huge_page(args, HPAGE_PUD_ORDER);
  1043. if (page) {
  1044. args->pud_pfn = page_to_pfn(page);
  1045. args->pmd_pfn = args->pud_pfn;
  1046. args->pte_pfn = args->pud_pfn;
  1047. return 0;
  1048. }
  1049. }
  1050. if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
  1051. has_transparent_hugepage()) {
  1052. page = debug_vm_pgtable_alloc_huge_page(args, HPAGE_PMD_ORDER);
  1053. if (page) {
  1054. args->pmd_pfn = page_to_pfn(page);
  1055. args->pte_pfn = args->pmd_pfn;
  1056. return 0;
  1057. }
  1058. }
  1059. page = alloc_page(GFP_KERNEL);
  1060. if (page)
  1061. args->pte_pfn = page_to_pfn(page);
  1062. return 0;
  1063. error:
  1064. destroy_args(args);
  1065. return ret;
  1066. }
  1067. static int __init debug_vm_pgtable(void)
  1068. {
  1069. struct pgtable_debug_args args;
  1070. spinlock_t *ptl = NULL;
  1071. int idx, ret;
  1072. pr_info("Validating architecture page table helpers\n");
  1073. ret = init_args(&args);
  1074. if (ret)
  1075. return ret;
  1076. /*
  1077. * Iterate over each possible vm_flags to make sure that all
  1078. * the basic page table transformation validations just hold
  1079. * true irrespective of the starting protection value for a
  1080. * given page table entry.
  1081. *
  1082. * Protection based vm_flags combinations are always linear
  1083. * and increasing i.e starting from VM_NONE and going up to
  1084. * (VM_SHARED | READ | WRITE | EXEC).
  1085. */
  1086. #define VM_FLAGS_START (VM_NONE)
  1087. #define VM_FLAGS_END (VM_SHARED | VM_EXEC | VM_WRITE | VM_READ)
  1088. for (idx = VM_FLAGS_START; idx <= VM_FLAGS_END; idx++) {
  1089. pte_basic_tests(&args, idx);
  1090. pmd_basic_tests(&args, idx);
  1091. pud_basic_tests(&args, idx);
  1092. }
  1093. /*
  1094. * Both P4D and PGD level tests are very basic which do not
  1095. * involve creating page table entries from the protection
  1096. * value and the given pfn. Hence just keep them out from
  1097. * the above iteration for now to save some test execution
  1098. * time.
  1099. */
  1100. p4d_basic_tests(&args);
  1101. pgd_basic_tests(&args);
  1102. pmd_leaf_tests(&args);
  1103. pud_leaf_tests(&args);
  1104. pte_special_tests(&args);
  1105. pte_protnone_tests(&args);
  1106. pmd_protnone_tests(&args);
  1107. pte_soft_dirty_tests(&args);
  1108. pmd_soft_dirty_tests(&args);
  1109. pte_swap_soft_dirty_tests(&args);
  1110. pmd_leaf_soft_dirty_tests(&args);
  1111. pte_swap_exclusive_tests(&args);
  1112. pte_swap_tests(&args);
  1113. pmd_softleaf_tests(&args);
  1114. swap_migration_tests(&args);
  1115. pmd_thp_tests(&args);
  1116. pud_thp_tests(&args);
  1117. hugetlb_basic_tests(&args);
  1118. /*
  1119. * Page table modifying tests. They need to hold
  1120. * proper page table lock.
  1121. */
  1122. args.ptep = pte_offset_map_lock(args.mm, args.pmdp, args.vaddr, &ptl);
  1123. pte_clear_tests(&args);
  1124. pte_advanced_tests(&args);
  1125. if (args.ptep)
  1126. pte_unmap_unlock(args.ptep, ptl);
  1127. ptl = pmd_lock(args.mm, args.pmdp);
  1128. pmd_clear_tests(&args);
  1129. pmd_advanced_tests(&args);
  1130. pmd_huge_tests(&args);
  1131. pmd_populate_tests(&args);
  1132. spin_unlock(ptl);
  1133. ptl = pud_lock(args.mm, args.pudp);
  1134. pud_clear_tests(&args);
  1135. pud_advanced_tests(&args);
  1136. pud_huge_tests(&args);
  1137. pud_populate_tests(&args);
  1138. spin_unlock(ptl);
  1139. spin_lock(&(args.mm->page_table_lock));
  1140. p4d_clear_tests(&args);
  1141. pgd_clear_tests(&args);
  1142. p4d_populate_tests(&args);
  1143. pgd_populate_tests(&args);
  1144. spin_unlock(&(args.mm->page_table_lock));
  1145. destroy_args(&args);
  1146. return 0;
  1147. }
  1148. late_initcall(debug_vm_pgtable);