lkml.org 
[lkml]   [2019]   [May]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 92/99] powerpc/mm/hash: Handle mmap_min_addr correctly in get_unmapped_area topdown search
    Date
    From: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>

    commit 3b4d07d2674f6b4a9281031f99d1f7efd325b16d upstream.

    When doing top-down search the low_limit is not PAGE_SIZE but rather
    max(PAGE_SIZE, mmap_min_addr). This handle cases in which mmap_min_addr >
    PAGE_SIZE.

    Fixes: fba2369e6ceb ("mm: use vm_unmapped_area() on powerpc architecture")
    Reviewed-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/mm/slice.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    --- a/arch/powerpc/mm/slice.c
    +++ b/arch/powerpc/mm/slice.c
    @@ -31,6 +31,7 @@
    #include <linux/spinlock.h>
    #include <linux/export.h>
    #include <linux/hugetlb.h>
    +#include <linux/security.h>
    #include <asm/mman.h>
    #include <asm/mmu.h>
    #include <asm/copro.h>
    @@ -376,6 +377,7 @@ static unsigned long slice_find_area_top
    int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT);
    unsigned long addr, found, prev;
    struct vm_unmapped_area_info info;
    + unsigned long min_addr = max(PAGE_SIZE, mmap_min_addr);

    info.flags = VM_UNMAPPED_AREA_TOPDOWN;
    info.length = len;
    @@ -392,7 +394,7 @@ static unsigned long slice_find_area_top
    if (high_limit > DEFAULT_MAP_WINDOW)
    addr += mm->context.slb_addr_limit - DEFAULT_MAP_WINDOW;

    - while (addr > PAGE_SIZE) {
    + while (addr > min_addr) {
    info.high_limit = addr;
    if (!slice_scan_available(addr - 1, available, 0, &addr))
    continue;
    @@ -404,8 +406,8 @@ static unsigned long slice_find_area_top
    * Check if we need to reduce the range, or if we can
    * extend it to cover the previous available slice.
    */
    - if (addr < PAGE_SIZE)
    - addr = PAGE_SIZE;
    + if (addr < min_addr)
    + addr = min_addr;
    else if (slice_scan_available(addr - 1, available, 0, &prev)) {
    addr = prev;
    goto prev_slice;
    @@ -527,7 +529,7 @@ unsigned long slice_get_unmapped_area(un
    addr = _ALIGN_UP(addr, page_size);
    slice_dbg(" aligned addr=%lx\n", addr);
    /* Ignore hint if it's too large or overlaps a VMA */
    - if (addr > high_limit - len ||
    + if (addr > high_limit - len || addr < mmap_min_addr ||
    !slice_area_is_free(mm, addr, len))
    addr = 0;
    }

    \
     
     \ /
      Last update: 2019-05-06 16:43    [W:3.484 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site