lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 024/717] x86/mm/ident_map: Check for errors from ident_pud_init()
    Date
    From: Arvind Sankar <nivedita@alum.mit.edu>

    [ Upstream commit 1fcd009102ee02e217f2e7635ab65517d785da8e ]

    Commit

    ea3b5e60ce80 ("x86/mm/ident_map: Add 5-level paging support")

    added ident_p4d_init() to support 5-level paging, but this function
    doesn't check and return errors from ident_pud_init().

    For example, the decompressor stub uses this code to create an identity
    mapping. If it runs out of pages while trying to allocate a PMD
    pagetable, the error will be currently ignored.

    Fix this to propagate errors.

    [ bp: Space out statements for better readability. ]

    Fixes: ea3b5e60ce80 ("x86/mm/ident_map: Add 5-level paging support")
    Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Joerg Roedel <jroedel@suse.de>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Link: https://lkml.kernel.org/r/20201027230648.1885111-1-nivedita@alum.mit.edu
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/mm/ident_map.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/mm/ident_map.c b/arch/x86/mm/ident_map.c
    index fe7a12599d8eb..968d7005f4a72 100644
    --- a/arch/x86/mm/ident_map.c
    +++ b/arch/x86/mm/ident_map.c
    @@ -62,6 +62,7 @@ static int ident_p4d_init(struct x86_mapping_info *info, p4d_t *p4d_page,
    unsigned long addr, unsigned long end)
    {
    unsigned long next;
    + int result;

    for (; addr < end; addr = next) {
    p4d_t *p4d = p4d_page + p4d_index(addr);
    @@ -73,13 +74,20 @@ static int ident_p4d_init(struct x86_mapping_info *info, p4d_t *p4d_page,

    if (p4d_present(*p4d)) {
    pud = pud_offset(p4d, 0);
    - ident_pud_init(info, pud, addr, next);
    + result = ident_pud_init(info, pud, addr, next);
    + if (result)
    + return result;
    +
    continue;
    }
    pud = (pud_t *)info->alloc_pgt_page(info->context);
    if (!pud)
    return -ENOMEM;
    - ident_pud_init(info, pud, addr, next);
    +
    + result = ident_pud_init(info, pud, addr, next);
    + if (result)
    + return result;
    +
    set_p4d(p4d, __p4d(__pa(pud) | info->kernpg_flag));
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:03    [W:2.045 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site