lkml.org 
[lkml]   [2015]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 101/183] mm/hugetlb: add migration/hwpoisoned entry check in hugetlb_change_protection
    Date
    3.16.7-ckt8 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

    commit a8bda28d87c38c6aa93de28ba5d30cc18e865a11 upstream.

    There is a race condition between hugepage migration and
    change_protection(), where hugetlb_change_protection() doesn't care about
    migration entries and wrongly overwrites them. That causes unexpected
    results like kernel crash. HWPoison entries also can cause the same
    problem.

    This patch adds is_hugetlb_entry_(migration|hwpoisoned) check in this
    function to do proper actions.

    Fixes: 290408d4a2 ("hugetlb: hugepage migration core")
    Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Luiz Capitulino <lcapitulino@redhat.com>
    Cc: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
    Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
    Cc: Steve Capper <steve.capper@linaro.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    mm/hugetlb.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/mm/hugetlb.c b/mm/hugetlb.c
    index 9508a818f496..5aab37914cbd 100644
    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -3392,7 +3392,26 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
    spin_unlock(ptl);
    continue;
    }
    - if (!huge_pte_none(huge_ptep_get(ptep))) {
    + pte = huge_ptep_get(ptep);
    + if (unlikely(is_hugetlb_entry_hwpoisoned(pte))) {
    + spin_unlock(ptl);
    + continue;
    + }
    + if (unlikely(is_hugetlb_entry_migration(pte))) {
    + swp_entry_t entry = pte_to_swp_entry(pte);
    +
    + if (is_write_migration_entry(entry)) {
    + pte_t newpte;
    +
    + make_migration_entry_read(&entry);
    + newpte = swp_entry_to_pte(entry);
    + set_huge_pte_at(mm, address, ptep, newpte);
    + pages++;
    + }
    + spin_unlock(ptl);
    + continue;
    + }
    + if (!huge_pte_none(pte)) {
    pte = huge_ptep_get_and_clear(mm, address, ptep);
    pte = pte_mkhuge(huge_pte_modify(pte, newprot));
    pte = arch_make_huge_pte(pte, vma, NULL, 0);

    \
     
     \ /
      Last update: 2015-03-06 11:41    [W:2.179 / U:0.700 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site