• Sudeep Holla's avatar
    arm64: cacheinfo: Fix incorrect assignment of signed error value to unsigned fw_level · e75d18ce
    Sudeep Holla authored
    Though acpi_find_last_cache_level() always returned signed value and the
    document states it will return any errors caused by lack of a PPTT table,
    it never returned negative values before.
    
    Commit 0c80f9e1 ("ACPI: PPTT: Leave the table mapped for the runtime usage")
    however changed it by returning -ENOENT if no PPTT was found. The value
    returned from acpi_find_last_cache_level() is then assigned to unsigned
    fw_level.
    
    It will result in the number of cache leaves calculated incorrectly as
    a huge value which will then cause the following warning from __alloc_pages
    as the order would be great than MAX_ORDER because of incorrect and huge
    cache leaves value.
    
      |  WARNING: CPU: 0 PID: 1 at mm/page_alloc.c:5407 __alloc_pages+0x74/0x314
      |  Modules linked in:
      |  CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.19.0-10393-g7c2a8d3ac4c0 #73
      |  pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
      |  pc : __alloc_pages+0x74/0x314
      |  lr : alloc_pages+0xe8/0x318
      |  Call trace:
      |   __alloc_pages+0x74/0x314
      |   alloc_pages+0xe8/0x318
      |   kmalloc_order_trace+0x68/0x1dc
      |   __kmalloc+0x240/0x338
      |   detect_cache_attributes+0xe0/0x56c
      |   update_siblings_masks+0x38/0x284
      |   store_cpu_topology+0x78/0x84
      |   smp_prepare_cpus+0x48/0x134
      |   kernel_init_freeable+0xc4/0x14c
      |   kernel_init+0x2c/0x1b4
      |   ret_from_fork+0x10/0x20
    
    Fix the same by changing fw_level to be signed integer and return the
    error from init_cache_level() early in case of error.
    Reported-and-Tested-by: default avatarBruno Goncalves <bgoncalv@redhat.com>
    Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Link: https://lore.kernel.org/r/20220808084640.3165368-1-sudeep.holla@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    e75d18ce
cacheinfo.c 2.5 KB