Patch "thp: reduce indentation level in change_huge_pmd()" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
thp: reduce indentation level in change_huge_pmd()
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
thp-reduce-indentation-level-in-change_huge_pmd.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0a85e51d37645e9ce57e5e1a30859e07810ed07cMon Sep 17 00:00:00 2001
From: "Kirill A. Shutemov" <[email protected]>
Date: Thu, 13 Apr 2017 14:56:17 -0700
Subject: thp: reduce indentation level in change_huge_pmd()
From: Kirill A. Shutemov <[email protected]>
commit 0a85e51d37645e9ce57e5e1a30859e07810ed07c upstream.
Patch series "thp: fix few MADV_DONTNEED races"
For MADV_DONTNEED to work properly with huge pages, it's critical to not clear pmd intermittently unless you hold down_write(mmap_sem).
Otherwise MADV_DONTNEED can miss the THP which can lead to userspace breakage.
See example of such race in commit message of patch 2/4.
All these races are found by code inspection. I haven't seen them triggered. I don't think it's worth to apply them to stable@.
This patch (of 4):
Restructure code in preparation for a fix.
--- mm/huge_memory.c | 56 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 28 deletions(-)
mm/huge_memory.c +28 -28
@@ -1509,37 +1509,37 @@ int change_huge_pmd(struct vm_area_struc {struct mm_struct *mm = vma->vm_mm;spinlock_t *ptl; -int ret =0 ; +pmd_t entry; +bool preserve_write; +int ret; ptl =__pmd_trans_huge_lock (pmd, vma); -if (ptl) { -pmd_t entry; -bool preserve_write = prot_numa &&pmd_write (*pmd); - ret =1 ; - -/* -* Avoid trapping faults against the zero page. The read-only -* data is likely to be read-cached on the local CPU and -* local/remote hits to the zero page are not interesting. -*/ -if (prot_numa &&is_huge_zero_pmd (*pmd)) { -spin_unlock (ptl); -return ret; - } - -if (!prot_numa || !pmd_protnone (*pmd)) { - entry =pmdp_huge_get_and_clear_notify (mm, addr, pmd); - entry =pmd_modify (entry, newprot); -if (preserve_write) - entry =pmd_mkwrite (entry); - ret =HPAGE_PMD_NR ; -set_pmd_at (mm, addr, pmd, entry); -BUG_ON (vma_is_anonymous (vma) && !preserve_write && -pmd_write (entry)); - } -spin_unlock (ptl); - } +if (!ptl) +return 0 ; + preserve_write = prot_numa &&pmd_write (*pmd); + ret =1 ; + +/* +* Avoid trapping faults against the zero page. The read-only +* data is likely to be read-cached on the local CPU and +* local/remote hits to the zero page are not interesting. +*/ +if (prot_numa &&is_huge_zero_pmd (*pmd)) + goto unlock; + +if (prot_numa &&pmd_protnone (*pmd)) + goto unlock; + + entry =pmdp_huge_get_and_clear_notify (mm, addr, pmd); + entry =pmd_modify (entry, newprot); +if (preserve_write) + entry =pmd_mkwrite (entry); + ret =HPAGE_PMD_NR ; +set_pmd_at (mm, addr, pmd, entry); +BUG_ON (vma_is_anonymous (vma) && !preserve_write &&pmd_write (entry)); +unlock: +spin_unlock (ptl);return ret; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/mm-drop-unused-pmdp_huge_get_and_clear_notify.patch queue-4.9/thp-fix-madv_dontneed-vs.-numa-balancing-race.patch queue-4.9/thp-reduce-indentation-level-in-change_huge_pmd.patch