lkml.org 
[lkml]   [2012]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -V4 02/10] hugetlbfs: don't use ERR_PTR with VM_FAULT* values
    Date
    From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

    Using VM_FAULT_* codes with ERR_PTR will require us to make sure
    VM_FAULT_* values will not exceed MAX_ERRNO value.

    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    ---
    mm/hugetlb.c | 18 +++++++++++++-----
    1 files changed, 13 insertions(+), 5 deletions(-)

    diff --git a/mm/hugetlb.c b/mm/hugetlb.c
    index d623e71..3782da8 100644
    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -1034,10 +1034,10 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
    */
    chg = vma_needs_reservation(h, vma, addr);
    if (chg < 0)
    - return ERR_PTR(-VM_FAULT_OOM);
    + return ERR_PTR(-ENOMEM);
    if (chg)
    if (hugetlb_get_quota(inode->i_mapping, chg))
    - return ERR_PTR(-VM_FAULT_SIGBUS);
    + return ERR_PTR(-ENOSPC);

    spin_lock(&hugetlb_lock);
    page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve);
    @@ -1047,7 +1047,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
    page = alloc_buddy_huge_page(h, NUMA_NO_NODE);
    if (!page) {
    hugetlb_put_quota(inode->i_mapping, chg);
    - return ERR_PTR(-VM_FAULT_SIGBUS);
    + return ERR_PTR(-ENOSPC);
    }
    }

    @@ -2395,6 +2395,7 @@ retry_avoidcopy:
    new_page = alloc_huge_page(vma, address, outside_reserve);

    if (IS_ERR(new_page)) {
    + int err = PTR_ERR(new_page);
    page_cache_release(old_page);

    /*
    @@ -2424,7 +2425,10 @@ retry_avoidcopy:

    /* Caller expects lock to be held */
    spin_lock(&mm->page_table_lock);
    - return -PTR_ERR(new_page);
    + if (err == -ENOMEM)
    + return VM_FAULT_OOM;
    + else
    + return VM_FAULT_SIGBUS;
    }

    /*
    @@ -2542,7 +2546,11 @@ retry:
    goto out;
    page = alloc_huge_page(vma, address, 0);
    if (IS_ERR(page)) {
    - ret = -PTR_ERR(page);
    + ret = PTR_ERR(page);
    + if (ret == -ENOMEM)
    + ret = VM_FAULT_OOM;
    + else
    + ret = VM_FAULT_SIGBUS;
    goto out;
    }
    clear_huge_page(page, address, pages_per_huge_page(h));
    --
    1.7.9


    \
     
     \ /
      Last update: 2012-03-16 18:45    [W:0.226 / U:0.160 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site