* [PATCH v2 1/4] khugepaged: remove unneeded return value of khugepaged_collapse_pte_mapped_thps()
2021-03-06 3:29 [PATCH v2 0/4] Cleanup and fixup for khugepaged Miaohe Lin
@ 2021-03-06 3:29 ` Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 2/4] khugepaged: reuse the smp_wmb() inside __SetPageUptodate() Miaohe Lin
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-03-06 3:29 UTC (permalink / raw)
To: akpm, kirill.shutemov
Cc: riel, ebru.akagunduz, dan.carpenter, linux-kernel, linux-mm, linmiaohe
The return value of khugepaged_collapse_pte_mapped_thps() is never checked
since it's introduced. We should remove such unneeded return value.
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
mm/khugepaged.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index a7d6cb912b05..d43812c5ce16 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1533,16 +1533,16 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
goto drop_hpage;
}
-static int khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
+static void khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
{
struct mm_struct *mm = mm_slot->mm;
int i;
if (likely(mm_slot->nr_pte_mapped_thp == 0))
- return 0;
+ return;
if (!mmap_write_trylock(mm))
- return -EBUSY;
+ return;
if (unlikely(khugepaged_test_exit(mm)))
goto out;
@@ -1553,7 +1553,6 @@ static int khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
out:
mm_slot->nr_pte_mapped_thp = 0;
mmap_write_unlock(mm);
- return 0;
}
static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
@@ -2057,9 +2056,8 @@ static void khugepaged_scan_file(struct mm_struct *mm,
BUILD_BUG();
}
-static int khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
+static void khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
{
- return 0;
}
#endif
--
2.19.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/4] khugepaged: reuse the smp_wmb() inside __SetPageUptodate()
2021-03-06 3:29 [PATCH v2 0/4] Cleanup and fixup for khugepaged Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 1/4] khugepaged: remove unneeded return value of khugepaged_collapse_pte_mapped_thps() Miaohe Lin
@ 2021-03-06 3:29 ` Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 3/4] khugepaged: use helper khugepaged_test_exit() in __khugepaged_enter() Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 4/4] khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate() Miaohe Lin
3 siblings, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-03-06 3:29 UTC (permalink / raw)
To: akpm, kirill.shutemov
Cc: riel, ebru.akagunduz, dan.carpenter, linux-kernel, linux-mm, linmiaohe
smp_wmb() is needed to avoid the copy_huge_page writes to become visible
after the set_pmd_at() write here. But we can reuse the smp_wmb() inside
__SetPageUptodate() to remove this redundant one.
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
mm/khugepaged.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index d43812c5ce16..287e7ecf978c 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1183,19 +1183,18 @@ static void collapse_huge_page(struct mm_struct *mm,
__collapse_huge_page_copy(pte, new_page, vma, address, pte_ptl,
&compound_pagelist);
pte_unmap(pte);
+ /*
+ * spin_lock() below is not the equivalent of smp_wmb(), but
+ * the smp_wmb() inside __SetPageUptodate() can be reused to
+ * avoid the copy_huge_page writes to become visible after
+ * the set_pmd_at() write.
+ */
__SetPageUptodate(new_page);
pgtable = pmd_pgtable(_pmd);
_pmd = mk_huge_pmd(new_page, vma->vm_page_prot);
_pmd = maybe_pmd_mkwrite(pmd_mkdirty(_pmd), vma);
- /*
- * spin_lock() below is not the equivalent of smp_wmb(), so
- * this is needed to avoid the copy_huge_page writes to become
- * visible after the set_pmd_at() write.
- */
- smp_wmb();
-
spin_lock(pmd_ptl);
BUG_ON(!pmd_none(*pmd));
page_add_new_anon_rmap(new_page, vma, address, true);
--
2.19.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 3/4] khugepaged: use helper khugepaged_test_exit() in __khugepaged_enter()
2021-03-06 3:29 [PATCH v2 0/4] Cleanup and fixup for khugepaged Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 1/4] khugepaged: remove unneeded return value of khugepaged_collapse_pte_mapped_thps() Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 2/4] khugepaged: reuse the smp_wmb() inside __SetPageUptodate() Miaohe Lin
@ 2021-03-06 3:29 ` Miaohe Lin
2021-03-06 3:29 ` [PATCH v2 4/4] khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate() Miaohe Lin
3 siblings, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-03-06 3:29 UTC (permalink / raw)
To: akpm, kirill.shutemov
Cc: riel, ebru.akagunduz, dan.carpenter, linux-kernel, linux-mm, linmiaohe
Commit 4d45e75a9955 ("mm: remove the now-unnecessary mmget_still_valid()
hack") have made khugepaged_test_exit() suitable for check mm->mm_users
against 0. Use this helper here.
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
mm/khugepaged.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 287e7ecf978c..e886a8618c33 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -481,7 +481,7 @@ int __khugepaged_enter(struct mm_struct *mm)
return -ENOMEM;
/* __khugepaged_exit() must not run from under us */
- VM_BUG_ON_MM(atomic_read(&mm->mm_users) == 0, mm);
+ VM_BUG_ON_MM(khugepaged_test_exit(mm), mm);
if (unlikely(test_and_set_bit(MMF_VM_HUGEPAGE, &mm->flags))) {
free_mm_slot(mm_slot);
return 0;
--
2.19.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 4/4] khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate()
2021-03-06 3:29 [PATCH v2 0/4] Cleanup and fixup for khugepaged Miaohe Lin
` (2 preceding siblings ...)
2021-03-06 3:29 ` [PATCH v2 3/4] khugepaged: use helper khugepaged_test_exit() in __khugepaged_enter() Miaohe Lin
@ 2021-03-06 3:29 ` Miaohe Lin
3 siblings, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-03-06 3:29 UTC (permalink / raw)
To: akpm, kirill.shutemov
Cc: riel, ebru.akagunduz, dan.carpenter, linux-kernel, linux-mm, linmiaohe
In writable and !referenced case, the result value should be
SCAN_LACK_REFERENCED_PAGE for trace_mm_collapse_huge_page_isolate()
instead of default 0 (SCAN_FAIL) here.
Fixes: 7d2eba0557c1 ("mm: add tracepoint for scanning pages")
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
mm/khugepaged.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index e886a8618c33..adf677246d86 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -716,17 +716,17 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
if (pte_write(pteval))
writable = true;
}
- if (likely(writable)) {
- if (likely(referenced)) {
- result = SCAN_SUCCEED;
- trace_mm_collapse_huge_page_isolate(page, none_or_zero,
- referenced, writable, result);
- return 1;
- }
- } else {
+
+ if (unlikely(!writable)) {
result = SCAN_PAGE_RO;
+ } else if (unlikely(!referenced)) {
+ result = SCAN_LACK_REFERENCED_PAGE;
+ } else {
+ result = SCAN_SUCCEED;
+ trace_mm_collapse_huge_page_isolate(page, none_or_zero,
+ referenced, writable, result);
+ return 1;
}
-
out:
release_pte_pages(pte, _pte, compound_pagelist);
trace_mm_collapse_huge_page_isolate(page, none_or_zero,
--
2.19.1
^ permalink raw reply related [flat|nested] 5+ messages in thread