[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20181206084604.17167-1-peterx@redhat.com>
Date: Thu, 6 Dec 2018 16:46:04 +0800
From: Peter Xu <peterx@...hat.com>
To: linux-kernel@...r.kernel.org
Cc: peterx@...hat.com, Andrea Arcangeli <aarcange@...hat.com>,
Andrew Morton <akpm@...ux-foundation.org>,
"Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>,
Matthew Wilcox <willy@...radead.org>,
Michal Hocko <mhocko@...e.com>,
Dave Jiang <dave.jiang@...el.com>,
"Aneesh Kumar K.V" <aneesh.kumar@...ux.vnet.ibm.com>,
Souptick Joarder <jrdr.linux@...il.com>,
Konstantin Khlebnikov <khlebnikov@...dex-team.ru>,
linux-mm@...ck.org
Subject: [PATCH] mm: thp: fix soft dirty for migration when split
When splitting a huge migrating PMD, we'll transfer the soft dirty bit
from the huge page to the small pages. However we're possibly using a
wrong data since when fetching the bit we're using pmd_soft_dirty()
upon a migration entry. Fix it up.
CC: Andrea Arcangeli <aarcange@...hat.com>
CC: Andrew Morton <akpm@...ux-foundation.org>
CC: "Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>
CC: Matthew Wilcox <willy@...radead.org>
CC: Michal Hocko <mhocko@...e.com>
CC: Dave Jiang <dave.jiang@...el.com>
CC: "Aneesh Kumar K.V" <aneesh.kumar@...ux.vnet.ibm.com>
CC: Souptick Joarder <jrdr.linux@...il.com>
CC: Konstantin Khlebnikov <khlebnikov@...dex-team.ru>
CC: linux-mm@...ck.org
CC: linux-kernel@...r.kernel.org
Signed-off-by: Peter Xu <peterx@...hat.com>
---
I noticed this during code reading. Only compile tested. I'm sending
a patch directly for review comments since it's relatively
straightforward and not easy to test. Please have a look, thanks.
---
mm/huge_memory.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index f2d19e4fe854..fb0787c3dd3b 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2161,7 +2161,10 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
SetPageDirty(page);
write = pmd_write(old_pmd);
young = pmd_young(old_pmd);
- soft_dirty = pmd_soft_dirty(old_pmd);
+ if (unlikely(pmd_migration))
+ soft_dirty = pmd_swp_soft_dirty(old_pmd);
+ else
+ soft_dirty = pmd_soft_dirty(old_pmd);
/*
* Withdraw the table only after we mark the pmd entry invalid.
--
2.17.1
Powered by blists - more mailing lists