lkml.org 
[lkml]   [2015]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.2 035/221] mm/hugetlb: add migration/hwpoisoned entry check in hugetlb_change_protection
    3.2.69-rc1 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>
    [bwh: Backported to 3.2:
    - Adjust context
    - We don't have split page table locks, so don't unlock inside the loop
    - We don't count pages here]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    mm/hugetlb.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -3037,7 +3037,22 @@ void hugetlb_change_protection(struct vm
    continue;
    if (huge_pmd_unshare(mm, &address, ptep))
    continue;
    - if (!huge_pte_none(huge_ptep_get(ptep))) {
    + pte = huge_ptep_get(ptep);
    + if (unlikely(is_hugetlb_entry_hwpoisoned(pte)))
    + 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);
    + }
    + continue;
    + }
    + if (!huge_pte_none(pte)) {
    pte = huge_ptep_get_and_clear(mm, address, ptep);
    pte = pte_mkhuge(pte_modify(pte, newprot));
    set_huge_pte_at(mm, address, ptep, pte);


    \
     
     \ /
      Last update: 2015-05-05 04:21    [W:2.269 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site