On 4/7/23 1:12 AM, Michał Mirosław wrote:
On Thu, 6 Apr 2023 at 09:40, Muhammad Usama Anjum usama.anjum@collabora.com wrote: [...]
--- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c
[...]
+static int pagemap_scan_pmd_entry(pmd_t *pmd, unsigned long start,
unsigned long end, struct mm_walk *walk)
+{
struct pagemap_scan_private *p = walk->private;
bool is_written, is_file, is_present, is_swap;
struct vm_area_struct *vma = walk->vma;
unsigned long addr = end;
spinlock_t *ptl;
int ret = 0;
pte_t *pte;
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
ptl = pmd_trans_huge_lock(pmd, vma);
if (ptl) {
[...]
return ret;
}
+process_smaller_pages:
if (pmd_trans_unstable(pmd))
return 0;
Why pmd_trans_unstable() is needed here and not only after split_huge_pmd()?
I'm not entirely sure. But the idea is if THP is unstable, we should return. As it doesn't seem like after splitting THP can be unstable, we should not check it. Do you agree with the following?
--- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1957,11 +1957,11 @@ static int pagemap_scan_pmd_entry(pmd_t *pmd, unsigned long start,
return ret; } -process_smaller_pages: + if (pmd_trans_unstable(pmd)) return 0; #endif - +process_smaller_pages: for (addr = start; addr < end && !ret; pte++, addr += PAGE_SIZE)