FAILED: patch "[PATCH] thp: reduce indentation level in change_huge_pmd()" failed to apply to 4.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
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: [PATCH] thp: reduce indentation level in change_huge_pmd()
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 +26 -26
@@ -1724,37 +1724,37 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, {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 ; +if (!ptl) +return 0 ; -/* -* 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; - } + preserve_write = prot_numa &&pmd_write (*pmd); + ret =1 ; -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_mk_savedwrite (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); - } +/* +* 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_mk_savedwrite (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; }