Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1410704 > unrolled thread
| Started by | Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> |
|---|---|
| First post | 2016-06-01 02:40 +0200 |
| Last post | 2016-06-02 02:40 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> - 2016-06-01 02:40 +0200
Re: [PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() "Kirill A. Shutemov" <kirill@shutemov.name> - 2016-06-01 11:50 +0200
Re: [PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> - 2016-06-02 02:40 +0200
| From | Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> |
|---|---|
| Date | 2016-06-01 02:40 +0200 |
| Subject | [PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() |
| Message-ID | <rF2mu-1c3-9@gated-at.bofh.it> |
split_huge_pmd() doesn't guarantee that the pmd is normal pmd pointing to
pte entries, which can be checked with pmd_trans_unstable(). Some callers
of split_huge_pmd() don't have the check, so let's add it.
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
mm/gup.c | 2 ++
mm/mempolicy.c | 2 ++
mm/mprotect.c | 2 +-
mm/mremap.c | 3 +--
4 files changed, 6 insertions(+), 3 deletions(-)
diff --git v4.6-mmotm-2016-05-27-15-19/mm/gup.c v4.6-mmotm-2016-05-27-15-19_patched/mm/gup.c
index c057784..dee142e 100644
--- v4.6-mmotm-2016-05-27-15-19/mm/gup.c
+++ v4.6-mmotm-2016-05-27-15-19_patched/mm/gup.c
@@ -279,6 +279,8 @@ struct page *follow_page_mask(struct vm_area_struct *vma,
spin_unlock(ptl);
ret = 0;
split_huge_pmd(vma, pmd, address);
+ if (pmd_trans_unstable(pmd))
+ ret = -EBUSY;
} else {
get_page(page);
spin_unlock(ptl);
diff --git v4.6-mmotm-2016-05-27-15-19/mm/mempolicy.c v4.6-mmotm-2016-05-27-15-19_patched/mm/mempolicy.c
index 297d685..fe90e50 100644
--- v4.6-mmotm-2016-05-27-15-19/mm/mempolicy.c
+++ v4.6-mmotm-2016-05-27-15-19_patched/mm/mempolicy.c
@@ -512,6 +512,8 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
}
}
+ if (pmd_trans_unstable(pmd))
+ return 0;
retry:
pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
for (; addr != end; pte++, addr += PAGE_SIZE) {
diff --git v4.6-mmotm-2016-05-27-15-19/mm/mprotect.c v4.6-mmotm-2016-05-27-15-19_patched/mm/mprotect.c
index 5019a1e..a4830f0 100644
--- v4.6-mmotm-2016-05-27-15-19/mm/mprotect.c
+++ v4.6-mmotm-2016-05-27-15-19_patched/mm/mprotect.c
@@ -163,7 +163,7 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd)) {
if (next - addr != HPAGE_PMD_SIZE) {
split_huge_pmd(vma, pmd, addr);
- if (pmd_none(*pmd))
+ if (pmd_trans_unstable(pmd))
continue;
} else {
int nr_ptes = change_huge_pmd(vma, pmd, addr,
diff --git v4.6-mmotm-2016-05-27-15-19/mm/mremap.c v4.6-mmotm-2016-05-27-15-19_patched/mm/mremap.c
index 1f157ad..da22ad2 100644
--- v4.6-mmotm-2016-05-27-15-19/mm/mremap.c
+++ v4.6-mmotm-2016-05-27-15-19_patched/mm/mremap.c
@@ -210,9 +210,8 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
}
}
split_huge_pmd(vma, old_pmd, old_addr);
- if (pmd_none(*old_pmd))
+ if (pmd_trans_unstable(old_pmd))
continue;
- VM_BUG_ON(pmd_trans_huge(*old_pmd));
}
if (pte_alloc(new_vma->vm_mm, new_pmd, new_addr))
break;
--
2.7.0
[toc] | [next] | [standalone]
| From | "Kirill A. Shutemov" <kirill@shutemov.name> |
|---|---|
| Date | 2016-06-01 11:50 +0200 |
| Subject | Re: [PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() |
| Message-ID | <rFaWK-6IP-21@gated-at.bofh.it> |
| In reply to | #1410704 |
On Wed, Jun 01, 2016 at 09:36:40AM +0900, Naoya Horiguchi wrote: > split_huge_pmd() doesn't guarantee that the pmd is normal pmd pointing to > pte entries, which can be checked with pmd_trans_unstable(). Could you be more specific on when we don't have normal ptes after split_huge_pmd? Race with other thread? DAX? I guess we can modify split_huge_pmd() to return if the pmd was split or not. -- Kirill A. Shutemov
[toc] | [prev] | [next] | [standalone]
| From | Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> |
|---|---|
| Date | 2016-06-02 02:40 +0200 |
| Subject | Re: [PATCH v1] mm: thp: check pmd_trans_unstable() after split_huge_pmd() |
| Message-ID | <rFoQ2-7j4-13@gated-at.bofh.it> |
| In reply to | #1411041 |
On Wed, Jun 01, 2016 at 12:39:57PM +0300, Kirill A. Shutemov wrote: > On Wed, Jun 01, 2016 at 09:36:40AM +0900, Naoya Horiguchi wrote: > > split_huge_pmd() doesn't guarantee that the pmd is normal pmd pointing to > > pte entries, which can be checked with pmd_trans_unstable(). > > Could you be more specific on when we don't have normal ptes after > split_huge_pmd? Race with other thread? DAX? Actually I don't have any such specific case in mind. __split_huge_pmd could skip real split code. In most case the skip happens when the pmd is already split and pointing to normal ptes, and I'm not sure when the pmd could be none or bad ... So my above description seems misstatement, I should say "some caller does assertion and some does differently and some not, so let's do it in unified manner". - Naoya > > I guess we can modify split_huge_pmd() to return if the pmd was split or > not.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web