Message ID | 20210809092631.1888748-1-gshan@redhat.com (mailing list archive) |
---|---|
Headers | show |
Series | mm/debug_vm_pgtable: Enhancements | expand |
Le 09/08/2021 à 11:26, Gavin Shan a écrit : > There are couple of issues with current implementations and this series > tries to resolve the issues: > > (a) All needed information are scattered in variables, passed to various > test functions. The code is organized in pretty much relaxed fashion. > > (b) The page isn't allocated from buddy during page table entry modifying > tests. The page can be invalid, conflicting to the implementations > of set_xxx_at() on ARM64. The target page is accessed so that the > iCache can be flushed when execution permission is given on ARM64. > Besides, the target page can be unmapped and accessing to it causes > kernel crash. > > "struct pgtable_debug_args" is introduced to address issue (a). For issue > (b), the used page is allocated from buddy in page table entry modifying > tests. The corresponding tets will be skipped if we fail to allocate the > (huge) page. For other test cases, the original page around to kernel > symbol (@start_kernel) is still used. > > The patches are organized as below. PATCH[2-10] could be combined to one > patch, but it will make the review harder: > > PATCH[1] introduces "struct pgtable_debug_args" as place holder of all > needed information. With it, the old and new implementation > can coexist. > PATCH[2-10] uses "struct pgtable_debug_args" in various test functions. > PATCH[11] removes the unused code for old implementation. > PATCH[12] fixes the issue of corrupted page flag for ARM64 I tested this series on powerpc 8xx, no failure reported. Christophe > > Changelog > ========= > v6: > * Populate saved page table entry pointers after > they're allocated in init_args() (Anshuman) > * Fix imbalanced preemption count issue by replacing > pte_alloc_mmap() with pte_alloc() in init_args() (syzbot) > v5: > * Pick r-bs from Anshuman and rebase to 5.14.rc4 (Gavin) > * Use args->start_p4dp to free p4d entries (Anshuman) > * Introduce helper to allocate huge page in init_arg() (Anshuman) > * Bail early if the allocated page doesn't exist in > swap_migration_tests() and correct the comments (Anshuman) > * Add fixes tag to PATCH[v4 12/12] (Christophe) > * Address misc comments (Anshuman) > v4: > * Determine the page allocation method according to > MAX_ORDER (Anshuman) > * Move existing comments to init_args() (Anshuman) > * Code refactoring as suggested by Anshuman (Anshuman) > * Improved commit log and add comments for flush_dcache_page() > in PATCH[v4 12/12] (Anshuman) > * Address misc comments (Anshuman) > v3: > * Fix the warning caused by allocating more pages than > (1 << (MAX_ORDER - 1)) in init_args() (syzbot) > * Fix build warning by dropping unused variables in separate > patches (0-day) > * Missed "WARN_ON(!pud_none(pud))" in pud_huge_tests() in > PATCH[v2 09/12] (0-day) > * Fix the subjects for PATCH[05/12] and PATCH[09/12] (Gavin) > v2: > * Rename struct vm_pgtable_debug to struct pgtable_debug_args. > The parameter name to various test functions are renamed > to "@args" (Anshuman) > * Code changes as suggested by Anshuman (Anshuman) > > Gavin Shan (12): > mm/debug_vm_pgtable: Introduce struct pgtable_debug_args > mm/debug_vm_pgtable: Use struct pgtable_debug_args in basic tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in leaf and > savewrite tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in protnone and > devmap tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in soft_dirty and > swap tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in migration and > thp tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in PTE modifying > tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in PMD modifying > tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in PUD modifying > tests > mm/debug_vm_pgtable: Use struct pgtable_debug_args in PGD and P4D > modifying tests > mm/debug_vm_pgtable: Remove unused code > mm/debug_vm_pgtable: Fix corrupted page flag > > mm/debug_vm_pgtable.c | 918 +++++++++++++++++++++++++----------------- > 1 file changed, 559 insertions(+), 359 deletions(-) >
On Mon, 9 Aug 2021 17:26:19 +0800 Gavin Shan <gshan@redhat.com> wrote: > There are couple of issues with current implementations and this series > tries to resolve the issues: > > (a) All needed information are scattered in variables, passed to various > test functions. The code is organized in pretty much relaxed fashion. > > (b) The page isn't allocated from buddy during page table entry modifying > tests. The page can be invalid, conflicting to the implementations > of set_xxx_at() on ARM64. The target page is accessed so that the > iCache can be flushed when execution permission is given on ARM64. > Besides, the target page can be unmapped and accessing to it causes > kernel crash. > > "struct pgtable_debug_args" is introduced to address issue (a). For issue > (b), the used page is allocated from buddy in page table entry modifying > tests. The corresponding tets will be skipped if we fail to allocate the > (huge) page. For other test cases, the original page around to kernel > symbol (@start_kernel) is still used. > > The patches are organized as below. PATCH[2-10] could be combined to one > patch, but it will make the review harder: > > PATCH[1] introduces "struct pgtable_debug_args" as place holder of all > needed information. With it, the old and new implementation > can coexist. > PATCH[2-10] uses "struct pgtable_debug_args" in various test functions. > PATCH[11] removes the unused code for old implementation. > PATCH[12] fixes the issue of corrupted page flag for ARM64 Tested on s390, all seems to work fine. Gerald
On 8/9/21 2:56 PM, Gavin Shan wrote: > There are couple of issues with current implementations and this series > tries to resolve the issues: > > (a) All needed information are scattered in variables, passed to various > test functions. The code is organized in pretty much relaxed fashion. > > (b) The page isn't allocated from buddy during page table entry modifying > tests. The page can be invalid, conflicting to the implementations > of set_xxx_at() on ARM64. The target page is accessed so that the > iCache can be flushed when execution permission is given on ARM64. > Besides, the target page can be unmapped and accessing to it causes > kernel crash. > > "struct pgtable_debug_args" is introduced to address issue (a). For issue > (b), the used page is allocated from buddy in page table entry modifying > tests. The corresponding tets will be skipped if we fail to allocate the > (huge) page. For other test cases, the original page around to kernel > symbol (@start_kernel) is still used. > > The patches are organized as below. PATCH[2-10] could be combined to one > patch, but it will make the review harder: > > PATCH[1] introduces "struct pgtable_debug_args" as place holder of all > needed information. With it, the old and new implementation > can coexist. > PATCH[2-10] uses "struct pgtable_debug_args" in various test functions. > PATCH[11] removes the unused code for old implementation. > PATCH[12] fixes the issue of corrupted page flag for ARM64 > > Changelog > ========= > v6: > * Populate saved page table entry pointers after > they're allocated in init_args() (Anshuman) > * Fix imbalanced preemption count issue by replacing > pte_alloc_mmap() with pte_alloc() in init_args() (syzbot) + vgupta@kernel.org Hello Gavin/Vineet, This series still need to be tested on ARC ? - Anshuman
Hi Anshuman and Vineet, On 8/12/21 9:11 PM, Anshuman Khandual wrote: > On 8/9/21 2:56 PM, Gavin Shan wrote: >> There are couple of issues with current implementations and this series >> tries to resolve the issues: >> >> (a) All needed information are scattered in variables, passed to various >> test functions. The code is organized in pretty much relaxed fashion. >> >> (b) The page isn't allocated from buddy during page table entry modifying >> tests. The page can be invalid, conflicting to the implementations >> of set_xxx_at() on ARM64. The target page is accessed so that the >> iCache can be flushed when execution permission is given on ARM64. >> Besides, the target page can be unmapped and accessing to it causes >> kernel crash. >> >> "struct pgtable_debug_args" is introduced to address issue (a). For issue >> (b), the used page is allocated from buddy in page table entry modifying >> tests. The corresponding tets will be skipped if we fail to allocate the >> (huge) page. For other test cases, the original page around to kernel >> symbol (@start_kernel) is still used. >> >> The patches are organized as below. PATCH[2-10] could be combined to one >> patch, but it will make the review harder: >> >> PATCH[1] introduces "struct pgtable_debug_args" as place holder of all >> needed information. With it, the old and new implementation >> can coexist. >> PATCH[2-10] uses "struct pgtable_debug_args" in various test functions. >> PATCH[11] removes the unused code for old implementation. >> PATCH[12] fixes the issue of corrupted page flag for ARM64 >> >> Changelog >> ========= >> v6: >> * Populate saved page table entry pointers after >> they're allocated in init_args() (Anshuman) >> * Fix imbalanced preemption count issue by replacing >> pte_alloc_mmap() with pte_alloc() in init_args() (syzbot) > > + vgupta@kernel.org > > Hello Gavin/Vineet, > > This series still need to be tested on ARC ? > Yes, I'm unable to test ARC as it's not supported by QEMU yet. It would great if Vineet can give it a try on ARC :) Thanks, Gavin
On 8/13/21 2:25 AM, Gavin Shan wrote: > Hi Anshuman and Vineet, > > On 8/12/21 9:11 PM, Anshuman Khandual wrote: >> On 8/9/21 2:56 PM, Gavin Shan wrote: >>> There are couple of issues with current implementations and this series >>> tries to resolve the issues: >>> >>> (a) All needed information are scattered in variables, passed to >>> various >>> test functions. The code is organized in pretty much relaxed >>> fashion. >>> >>> (b) The page isn't allocated from buddy during page table entry >>> modifying >>> tests. The page can be invalid, conflicting to the >>> implementations >>> of set_xxx_at() on ARM64. The target page is accessed so that >>> the >>> iCache can be flushed when execution permission is given on >>> ARM64. >>> Besides, the target page can be unmapped and accessing to it >>> causes >>> kernel crash. >>> >>> "struct pgtable_debug_args" is introduced to address issue (a). For >>> issue >>> (b), the used page is allocated from buddy in page table entry >>> modifying >>> tests. The corresponding tets will be skipped if we fail to allocate >>> the >>> (huge) page. For other test cases, the original page around to kernel >>> symbol (@start_kernel) is still used. >>> >>> The patches are organized as below. PATCH[2-10] could be combined to >>> one >>> patch, but it will make the review harder: >>> >>> PATCH[1] introduces "struct pgtable_debug_args" as place holder >>> of all >>> needed information. With it, the old and new implementation >>> can coexist. >>> PATCH[2-10] uses "struct pgtable_debug_args" in various test >>> functions. >>> PATCH[11] removes the unused code for old implementation. >>> PATCH[12] fixes the issue of corrupted page flag for ARM64 >>> >>> Changelog >>> ========= >>> v6: >>> * Populate saved page table entry pointers after >>> they're allocated in init_args() (Anshuman) >>> * Fix imbalanced preemption count issue by replacing >>> pte_alloc_mmap() with pte_alloc() in init_args() (syzbot) >> >> + vgupta@kernel.org Please also keep linux-snps-arc CC'ed for ARC changes. >> >> Hello Gavin/Vineet, >> >> This series still need to be tested on ARC ? >> > > Yes, I'm unable to test ARC as it's not supported by QEMU yet. > It would great if Vineet can give it a try on ARC :) We do have a working QEMU (in the process of being upstreamed) you could try https://github.com/foss-for-synopsys-dwc-arc-processors/qemu #master Is this code in some shared git repo we can pull - instead of apply 8 files. Thx, -Vineet
Hi Vineet, On 8/14/21 5:43 AM, Vineet Gupta wrote: > On 8/13/21 2:25 AM, Gavin Shan wrote: >> On 8/12/21 9:11 PM, Anshuman Khandual wrote: >>> On 8/9/21 2:56 PM, Gavin Shan wrote: >>>> There are couple of issues with current implementations and this series >>>> tries to resolve the issues: >>>> >>>> (a) All needed information are scattered in variables, passed to various >>>> test functions. The code is organized in pretty much relaxed fashion. >>>> >>>> (b) The page isn't allocated from buddy during page table entry modifying >>>> tests. The page can be invalid, conflicting to the implementations >>>> of set_xxx_at() on ARM64. The target page is accessed so that the >>>> iCache can be flushed when execution permission is given on ARM64. >>>> Besides, the target page can be unmapped and accessing to it causes >>>> kernel crash. >>>> >>>> "struct pgtable_debug_args" is introduced to address issue (a). For issue >>>> (b), the used page is allocated from buddy in page table entry modifying >>>> tests. The corresponding tets will be skipped if we fail to allocate the >>>> (huge) page. For other test cases, the original page around to kernel >>>> symbol (@start_kernel) is still used. >>>> >>>> The patches are organized as below. PATCH[2-10] could be combined to one >>>> patch, but it will make the review harder: >>>> >>>> PATCH[1] introduces "struct pgtable_debug_args" as place holder of all >>>> needed information. With it, the old and new implementation >>>> can coexist. >>>> PATCH[2-10] uses "struct pgtable_debug_args" in various test functions. >>>> PATCH[11] removes the unused code for old implementation. >>>> PATCH[12] fixes the issue of corrupted page flag for ARM64 >>>> >>>> Changelog >>>> ========= >>>> v6: >>>> * Populate saved page table entry pointers after >>>> they're allocated in init_args() (Anshuman) >>>> * Fix imbalanced preemption count issue by replacing >>>> pte_alloc_mmap() with pte_alloc() in init_args() (syzbot) >>> >>> + vgupta@kernel.org > > Please also keep linux-snps-arc CC'ed for ARC changes. > Sure. >>> >>> Hello Gavin/Vineet, >>> >>> This series still need to be tested on ARC ? >>> >> >> Yes, I'm unable to test ARC as it's not supported by QEMU yet. >> It would great if Vineet can give it a try on ARC :) > > We do have a working QEMU (in the process of being upstreamed) you could try > https://github.com/foss-for-synopsys-dwc-arc-processors/qemu #master > > Is this code in some shared git repo we can pull - instead of apply 8 files. > Here is repo with v6 series included. Please help to have a try. https://github.com/gwshan/linux # kvm/arm64_debug I tried to build the cross-compiler with buildroot with following 2 repos. Unfortunately, none of them worked for me. The QEMU binary can be built successfully with the provided repo though. [1] git://github.com/foss-for-synopsys-dwc-arc-processors/buildroot.git (branch: master) There are build errors after choosing little-endian ARM from "make menuconfig" [2] https://github.com/buildroot/buildroot (branch: master) The build is successful, but the kernel can't be built because of the following errors: # make ARCH=arc CROSS_COMPILE=arc-linux- axs103_smp_defconfig # make -j 40 : LD vmlinux.o arc-linux-ld: error: attempting to link /home/gavin/sandbox/buildroot/buildroot.arc/output/host/lib /gcc/arc-buildroot-linux-uclibc/10.2.0/libgcc.a(_muldi3.o) with a binary vmlinux.o of different architecture Thanks, Gavin