lkml.org 
[lkml]   [2021]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 034/168] x86/pat: Pass valid address to sanitize_phys()
    Date
    From: Jeff Moyer <jmoyer@redhat.com>

    commit aeef8b5089b76852bd84889f2809e69a7cfb414e upstream.

    The end address passed to memtype_reserve() is handed directly to
    sanitize_phys(). However, end is exclusive and sanitize_phys() expects
    an inclusive address. If end falls at the end of the physical address
    space, sanitize_phys() will return 0. This can result in drivers
    failing to load, and the following warning:

    WARNING: CPU: 26 PID: 749 at arch/x86/mm/pat.c:354 reserve_memtype+0x262/0x450
    reserve_memtype failed: [mem 0x3ffffff00000-0xffffffffffffffff], req uncached-minus
    Call Trace:
    [<ffffffffa427b1f2>] reserve_memtype+0x262/0x450
    [<ffffffffa42764aa>] ioremap_nocache+0x1a/0x20
    [<ffffffffc04620a1>] mpt3sas_base_map_resources+0x151/0xa60 [mpt3sas]
    [<ffffffffc0465555>] mpt3sas_base_attach+0xf5/0xa50 [mpt3sas]
    ---[ end trace 6d6eea4438db89ef ]---
    ioremap reserve_memtype failed -22
    mpt3sas_cm0: unable to map adapter memory! or resource not found
    mpt3sas_cm0: failure at drivers/scsi/mpt3sas/mpt3sas_scsih.c:10597/_scsih_probe()!

    Fix this by passing the inclusive end address to sanitize_phys().

    Fixes: 510ee090abc3 ("x86/mm/pat: Prepare {reserve, free}_memtype() for "decoy" addresses")
    Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Dan Williams <dan.j.williams@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/x49o8a3pu5i.fsf@segfault.boston.devel.redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/mm/pat/memtype.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    --- a/arch/x86/mm/pat/memtype.c
    +++ b/arch/x86/mm/pat/memtype.c
    @@ -583,7 +583,12 @@ int memtype_reserve(u64 start, u64 end,
    int err = 0;

    start = sanitize_phys(start);
    - end = sanitize_phys(end);
    +
    + /*
    + * The end address passed into this function is exclusive, but
    + * sanitize_phys() expects an inclusive address.
    + */
    + end = sanitize_phys(end - 1) + 1;
    if (start >= end) {
    WARN(1, "%s failed: [mem %#010Lx-%#010Lx], req %s\n", __func__,
    start, end - 1, cattr_name(req_type));

    \
     
     \ /
      Last update: 2021-09-20 21:07    [W:4.049 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site