• Mike Rapoport's avatar
    arm64: numa: simplify dummy_numa_init() · ab8f21aa
    Mike Rapoport authored
    dummy_numa_init() loops over memblock.memory and passes nid=0 to
    numa_add_memblk() which essentially wraps memblock_set_node().  However,
    memblock_set_node() can cope with entire memory span itself, so the loop
    over memblock.memory regions is redundant.
    
    Using a single call to memblock_set_node() rather than a loop also fixes
    an issue with a buggy ACPI firmware in which the SRAT table covers some
    but not all of the memory in the EFI memory map.
    
    Jonathan Cameron says:
    
      This issue can be easily triggered by having an SRAT table which fails
      to cover all elements of the EFI memory map.
    
      This firmware error is detected and a warning printed. e.g.
      "NUMA: Warning: invalid memblk node 64 [mem 0x240000000-0x27fffffff]"
      At that point we fall back to dummy_numa_init().
    
      However, the failed ACPI init has left us with our memblocks all broken
      up as we split them when trying to assign them to NUMA nodes.
    
      We then iterate over the memblocks and add them to node 0.
    
      numa_add_memblk() calls memblock_set_node() which merges regions that
      were previously split up during the earlier attempt to add them to
      different nodes during parsing of SRAT.
    
      This means elements are moved in the memblock array and we can end up
      in a different memblock after the call to numa_add_memblk().
      Result is:
    
      Unable to handle kernel paging request at virtual address 0000000000003a40
      Mem abort info:
        ESR = 0x96000004
        EC = 0x25: DABT (current EL), IL = 32 bits
        SET = 0, FnV = 0
        EA = 0, S1PTW = 0
      Data abort info:
        ISV = 0, ISS = 0x00000004
        CM = 0, WnR = 0
      [0000000000003a40] user address but active_mm is swapper
      Internal error: Oops: 96000004 [#1] PREEMPT SMP
    
      ...
    
      Call trace:
        sparse_init_nid+0x5c/0x2b0
        sparse_init+0x138/0x170
        bootmem_init+0x80/0xe0
        setup_arch+0x2a0/0x5fc
        start_kernel+0x8c/0x648
    
    Replace the loop with a single call to memblock_set_node() to the entire
    memory.
    Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Daniel Axtens <dja@axtens.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Emil Renner Berthing <kernel@esmil.dk>
    Cc: Hari Bathini <hbathini@linux.ibm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Michal Simek <monstr@monstr.eu>
    Cc: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Stafford Horne <shorne@gmail.com>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Link: https://lkml.kernel.org/r/20200818151634.14343-5-rppt@kernel.orgSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ab8f21aa
numa.c 10.6 KB