According to Section 6.2.14 from ACPI spec 6.3 [1], the setting of proximity domain is optional, as below:
This optional object is used to describe proximity domain associations within a machine. _PXM evaluates to an integer that identifies a device as belonging to a Proximity Domain defined in the System Resource Affinity Table (SRAT). When enabling KASAN and bios has not implemented the proximity domain of the hns3 device, there is a global-out-of-bounds error below: [ 42.970381] ================================================================== [ 42.977595] BUG: KASAN: global-out-of-bounds in __bitmap_weight+0x48/0xb0 [ 42.984370] Read of size 8 at addr ffff20008cdf8790 by task kworker/0:1/13 [ 42.991230] [ 42.992712] CPU: 0 PID: 13 Comm: kworker/0:1 Tainted: G O 5.2.0-rc4-g8bde06a-dirty #3 [ 43.001830] Hardware name: Huawei TaiShan 2280 V2/BC82AMDA, BIOS TA BIOS 2280-A CS V2.B050.01 08/08/2019 [ 43.011298] Workqueue: events work_for_cpu_fn [ 43.015643] Call trace: [ 43.018078] dump_backtrace+0x0/0x1e8 [ 43.021727] show_stack+0x14/0x20 [ 43.025031] dump_stack+0xc4/0xfc [ 43.028335] print_address_description+0x178/0x270 [ 43.033113] __kasan_report+0x164/0x1b8 [ 43.036936] kasan_report+0xc/0x18 [ 43.040325] __asan_load8+0x84/0xa8 [ 43.043801] __bitmap_weight+0x48/0xb0 [ 43.047552] hclge_init_ae_dev+0x988/0x1e78 [hclge] [ 43.052418] hnae3_register_ae_dev+0xcc/0x278 [hnae3] [ 43.057467] hns3_probe+0xe0/0x120 [hns3] [ 43.061464] local_pci_probe+0x74/0xf0 [ 43.065200] work_for_cpu_fn+0x2c/0x48 [ 43.068937] process_one_work+0x3c0/0x878 [ 43.072934] worker_thread+0x400/0x670 [ 43.076670] kthread+0x1b0/0x1b8 [ 43.079885] ret_from_fork+0x10/0x18 [ 43.083446] [ 43.084925] The buggy address belongs to the variable: [ 43.090052] numa_distance+0x30/0x40 [ 43.093613] [ 43.095091] Memory state around the buggy address: [ 43.099870] ffff20008cdf8680: fa fa fa fa 04 fa fa fa fa fa fa fa 00 00 fa fa [ 43.107078] ffff20008cdf8700: fa fa fa fa 04 fa fa fa fa fa fa fa 00 fa fa fa [ 43.114286] >ffff20008cdf8780: fa fa fa fa 00 00 00 00 00 00 00 00 fa fa fa fa [ 43.121494] ^ [ 43.125230] ffff20008cdf8800: 01 fa fa fa fa fa fa fa 04 fa fa fa fa fa fa fa [ 43.132439] ffff20008cdf8880: fa fa fa fa fa fa fa fa 00 00 fa fa fa fa fa fa [ 43.139646] ================================================================== As suggested [2] by Michal Hocko: "if the specification really allows to provide NUMA_NO_NODE (-1) then the code really has to be prepared for that. And ideally all arches should deal with that." This patchset checks the node id with the below case consistently across different arches in order to be compliant with spec and backward compatible as much as possible: 1. if node_id < 0, return cpu_online_mask 2. if node_id >= nr_node_ids, return cpu_none_mask 3. if node_to_cpumask_map[node_id] is NULL, return cpu_online_mask Note: 1. Only arm64 has been compile tested and tested on real board. 2. x86 has been compile tested with defconfig. 3. Other arch has not been compile tested or tested on real board. Changelog: V2: Change commit log as suggested by Michal Hocko, and make the change to other arches as well. [1] https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf [2] https://patchwork.kernel.org/patch/11122823/ Yunsheng Lin (9): arm64: numa: check the node id consistently for arm64 x86: numa: check the node id consistently for x86 alpha: numa: check the node id consistently for alpha powerpc: numa: check the node id consistently for powerpc s390: numa: check the node id consistently for s390 sh: numa: check the node id consistently for sh sparc64: numa: check the node id consistently for sparc64 mips: numa: check the node id consistently for mips ip27 mips: numa: check the node id consistently for mips loongson64 arch/alpha/include/asm/topology.h | 7 +++++-- arch/arm64/include/asm/numa.h | 6 ++++++ arch/arm64/mm/numa.c | 2 +- arch/mips/include/asm/mach-ip27/topology.h | 15 ++++++++++++--- arch/mips/include/asm/mach-loongson64/topology.h | 12 +++++++++++- arch/powerpc/include/asm/topology.h | 13 ++++++++++--- arch/s390/include/asm/topology.h | 6 ++++++ arch/sh/include/asm/topology.h | 14 +++++++++++++- arch/sparc/include/asm/topology_64.h | 16 +++++++++++++--- arch/x86/include/asm/topology.h | 6 ++++++ arch/x86/mm/numa.c | 2 +- 11 files changed, 84 insertions(+), 15 deletions(-) -- 2.8.1