Fix the issue by reworking how x86 initializes the memory less nodes.
The current implementation is hacked into the workflow and it doesn't
allow any flexibility. There is init_memory_less_node called for each
offline node that has a CPU as already mentioned above. This will make
sure that we will have a new online node without any memory. Much later
on we build a zone list for this node and things seem to work, except
they do not (e.g. due to nr_cpus). Not to mention that it doesn't really
make much sense to consider an empty node as online because we just
consider this node whenever we want to iterate nodes to use and empty
node is obviously not the best candidate. This is all just too fragile.
[ 0.000000] user: [mem 0x0000000000000100-0x000000000009c7ff] usable
[ 0.000000] user: [mem 0x000000000009c800-0x000000000009ffff] reserved
[ 0.000000] user: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] user: [mem 0x0000000000100000-0x0000000073216fff] usable
[ 0.000000] user: [mem 0x0000000073217000-0x0000000075316fff] reserved
[ 0.000000] user: [mem 0x0000000075317000-0x00000000754f8fff] ACPI data
[ 0.000000] user: [mem 0x00000000754f9000-0x0000000076057fff] ACPI NVS
[ 0.000000] user: [mem 0x0000000076058000-0x0000000077ae9fff] reserved
[ 0.000000] user: [mem 0x0000000077aea000-0x0000000077ffffff] usable
[ 0.000000] user: [mem 0x0000000078000000-0x000000008fffffff] reserved
[ 0.000000] user: [mem 0x00000000fd000000-0x00000000fe7fffff] reserved
[ 0.000000] user: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[ 0.000000] user: [mem 0x0000000100000000-0x00000004ffffffff] usable
[ 0.000000] user: [mem 0x0000000500000000-0x000000603fffffff] persistent (type 12)
[ 0.016060] Initmem setup node 0 [mem 0x0000000000001000-0x00000004ffffffff]
[ 0.073310] Initmem setup node 1 [mem 0x0000000000000000-0x0000000000000000]
[ 2.175327] Call Trace:
[ 2.175327] device_add+0x43e/0x690
[ 2.175327] device_register+0x107/0x110
[ 2.175327] __register_one_node+0x72/0x150
[ 2.175327] __try_online_node+0x8f/0xd0
[ 2.175327] try_online_node+0x2b/0x50
[ 2.175327] do_cpu_up+0x46/0xf0
[ 2.175327] cpu_up+0x13/0x20
[ 2.175327] smp_init+0x6e/0xd0
[ 2.175327] kernel_init_freeable+0xe5/0x21f
[ 2.175327] ? rest_init+0xb0/0xb0
[ 2.175327] kernel_init+0xf/0x180
[ 2.175327] ? rest_init+0xb0/0xb0
[ 2.175327] ret_from_fork+0x1f/0x30