hugetlb_basic_tests(pte_aligned, prot);
 
-       pte_clear_tests(mm, ptep, vaddr);
-       pmd_clear_tests(mm, pmdp);
-       pud_clear_tests(mm, pudp);
-       p4d_clear_tests(mm, p4dp);
-       pgd_clear_tests(mm, pgdp);
+       /*
+        * Page table modifying tests. They need to hold
+        * proper page table lock.
+        */
 
        ptl = pte_lockptr(mm, pmdp);
        spin_lock(ptl);
-
+       pte_clear_tests(mm, ptep, vaddr);
        pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot);
-       pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot);
-       pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot);
-       hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot);
-
+       pte_unmap_unlock(ptep, ptl);
 
+       ptl = pmd_lock(mm, pmdp);
+       pmd_clear_tests(mm, pmdp);
+       pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot);
        pmd_huge_tests(pmdp, pmd_aligned, prot);
+       pmd_populate_tests(mm, pmdp, saved_ptep);
+       spin_unlock(ptl);
+
+       ptl = pud_lock(mm, pudp);
+       pud_clear_tests(mm, pudp);
+       pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot);
        pud_huge_tests(pudp, pud_aligned, prot);
+       pud_populate_tests(mm, pudp, saved_pmdp);
+       spin_unlock(ptl);
 
-       pte_unmap_unlock(ptep, ptl);
+       hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot);
 
-       pmd_populate_tests(mm, pmdp, saved_ptep);
-       pud_populate_tests(mm, pudp, saved_pmdp);
+       spin_lock(&mm->page_table_lock);
+       p4d_clear_tests(mm, p4dp);
+       pgd_clear_tests(mm, pgdp);
        p4d_populate_tests(mm, p4dp, saved_pudp);
        pgd_populate_tests(mm, pgdp, saved_p4dp);
+       spin_unlock(&mm->page_table_lock);
 
        p4d_free(mm, saved_p4dp);
        pud_free(mm, saved_pudp);