lkml.org 
[lkml]   [2008]   [Sep]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 2/2] x86: Handle error returns in set_memory_*
    Correctly handle the error returns from set_memory_*. We have to free memtype
    on error return path.

    Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>

    ---
    arch/x86/mm/pageattr.c | 35 ++++++++++++++++++++++++++++-------
    1 file changed, 28 insertions(+), 7 deletions(-)

    Index: tip/arch/x86/mm/pageattr.c
    ===================================================================
    --- tip.orig/arch/x86/mm/pageattr.c 2008-09-12 16:03:36.000000000 -0700
    +++ tip/arch/x86/mm/pageattr.c 2008-09-12 16:31:12.000000000 -0700
    @@ -929,6 +929,8 @@ int _set_memory_uc(unsigned long addr, i

    int set_memory_uc(unsigned long addr, int numpages)
    {
    + int ret;
    +
    /*
    * for now UC MINUS. see comments in ioremap_nocache()
    */
    @@ -936,13 +938,19 @@ int set_memory_uc(unsigned long addr, in
    _PAGE_CACHE_UC_MINUS, NULL))
    return -EINVAL;

    - return _set_memory_uc(addr, numpages);
    + ret = _set_memory_uc(addr, numpages);
    + if (ret)
    + free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
    +
    + return ret;
    }
    EXPORT_SYMBOL(set_memory_uc);

    int set_memory_array_uc(unsigned long *addr, int addrinarray)
    {
    - unsigned long start;
    + int ret;
    + int reserve_fail = 0;
    + unsigned long start = 0;
    unsigned long end;
    int i;
    /*
    @@ -955,17 +963,24 @@ int set_memory_array_uc(unsigned long *a
    break;
    i++;
    }
    - if (reserve_memtype(start, end, _PAGE_CACHE_UC_MINUS, NULL))
    + if (reserve_memtype(start, end, _PAGE_CACHE_UC_MINUS, NULL)) {
    + ret = -EINVAL;
    + reserve_fail = 1;
    goto out;
    + }
    }

    - return change_page_attr_set(addr, addrinarray,
    + ret = change_page_attr_set(addr, addrinarray,
    __pgprot(_PAGE_CACHE_UC_MINUS), 1);
    +
    + if (!ret)
    + return ret;
    +
    out:
    for (i = 0; i < addrinarray; i++) {
    unsigned long tmp = __pa(addr[i]);

    - if (tmp == start)
    + if (reserve_fail && tmp == start)
    break;
    for (end = tmp + PAGE_SIZE; i < addrinarray - 1; end += PAGE_SIZE) {
    if (end != __pa(addr[i + 1]))
    @@ -974,7 +989,7 @@ out:
    }
    free_memtype(tmp, end);
    }
    - return -EINVAL;
    + return ret;
    }
    EXPORT_SYMBOL(set_memory_array_uc);

    @@ -986,6 +1001,8 @@ int _set_memory_wc(unsigned long addr, i

    int set_memory_wc(unsigned long addr, int numpages)
    {
    + int ret;
    +
    if (!pat_enabled)
    return set_memory_uc(addr, numpages);

    @@ -993,7 +1010,11 @@ int set_memory_wc(unsigned long addr, in
    _PAGE_CACHE_WC, NULL))
    return -EINVAL;

    - return _set_memory_wc(addr, numpages);
    + ret = _set_memory_wc(addr, numpages);
    + if (ret)
    + free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
    +
    + return ret;
    }
    EXPORT_SYMBOL(set_memory_wc);

    --



    \
     
     \ /
      Last update: 2008-09-13 02:13    [W:0.025 / U:90.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site