qemu-e2k/hw/ppc
Daniel Henrique Barboza 690fbe4295 spapr_numa: consider user input when defining associativity
A new function called spapr_numa_define_associativity_domains()
is created to calculate the associativity domains and change
the associativity arrays considering user input. This is how
the associativity domain between two NUMA nodes A and B is
calculated:

- get the distance D between them

- get the correspondent NUMA level 'n_level' for D. This is done
via a helper called spapr_numa_get_numa_level()

- all associativity arrays were initialized with their own
numa_ids, and we're calculating the distance in node_id ascending
order, starting from node id 0 (the first node retrieved by
numa_state). This will have a cascade effect in the algorithm because
the associativity domains that node 0 defines will be carried over to
other nodes, and node 1 associativities will be carried over after
taking node 0 associativities into account, and so on. This
happens because we'll assign assoc_src as the associativity domain
of dst as well, for all NUMA levels beyond and including n_level.

The PPC kernel expects the associativity domains of the first node
(node id 0) to be always 0 [1], and this algorithm will grant that
by default.

Ultimately, all of this results in a best effort approximation for
the actual NUMA distances the user input in the command line. Given
the nature of how PAPR itself interprets NUMA distances versus the
expectations risen by how ACPI SLIT works, there might be better
algorithms but, in the end, it'll also result in another way to
approximate what the user really wanted.

To keep this commit message no longer than it already is, the next
patch will update the existing documentation in ppc-spapr-numa.rst
with more in depth details and design considerations/drawbacks.

[1] https://lore.kernel.org/linuxppc-dev/5e8fbea3-8faf-0951-172a-b41a2138fbcf@gmail.com/

Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Message-Id: <20201007172849.302240-5-danielhb413@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2020-10-09 15:06:11 +11:00
..
e500-ccsr.h Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
e500.c ppc/e500: Use start-powered-off CPUState property 2020-09-08 10:08:43 +10:00
e500.h Use OBJECT_DECLARE_TYPE when possible 2020-09-18 14:12:32 -04:00
e500plat.c
fdt.c
fw_cfg.c
Kconfig
mac_newworld.c load_elf: Remove unused address variables from callers 2020-09-25 16:52:08 -07:00
mac_oldworld.c load_elf: Remove unused address variables from callers 2020-09-25 16:52:08 -07:00
mac.h Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
meson.build ppc: introducing spapr_numa.c NUMA code helper 2020-09-08 10:08:43 +10:00
mpc8544_guts.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
mpc8544ds.c
pnv_bmc.c ppc/pnv: Add a HIOMAP erase command 2020-09-08 10:08:42 +10:00
pnv_core.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
pnv_homer.c
pnv_lpc.c ppc/pnv: Fix TypeInfo of PnvLpcController abstract class 2020-09-08 10:08:42 +10:00
pnv_occ.c
pnv_pnor.c
pnv_psi.c ppc/pnv: Make PSI device types not user creatable 2020-07-20 09:21:39 +10:00
pnv_xscom.c
pnv.c ppc/pnv: Increase max firmware size 2020-10-09 10:15:06 +11:00
ppc4xx_devs.c
ppc4xx_pci.c Pull request trivial patches 20200919 2020-09-22 15:42:23 +01:00
ppc405_boards.c
ppc405_uc.c
ppc405.h
ppc440_bamboo.c load_elf: Remove unused address variables from callers 2020-09-25 16:52:08 -07:00
ppc440_pcix.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
ppc440_uc.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
ppc440.h
ppc_booke.c
ppc.c
ppce500_spin.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
prep_systemio.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
prep.c
rs6000_mc.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
sam460ex.c load_elf: Remove unused address variables from callers 2020-09-25 16:52:08 -07:00
spapr_caps.c spapr: Add a return value to spapr_check_pagesize() 2020-10-09 10:15:06 +11:00
spapr_cpu_core.c spapr: Simplify error handling in spapr_cpu_core_realize() 2020-10-09 10:15:06 +11:00
spapr_drc.c spapr: Simplify error handling in prop_get_fdt() 2020-10-09 10:15:06 +11:00
spapr_events.c
spapr_hcall.c spapr: Simplify error handling in do_client_architecture_support() 2020-10-09 10:15:06 +11:00
spapr_iommu.c
spapr_irq.c spapr/xive: Use the xics flag to check for XIVE-only IRQ backends 2020-09-08 10:08:42 +10:00
spapr_numa.c spapr_numa: consider user input when defining associativity 2020-10-09 15:06:11 +11:00
spapr_nvdimm.c spapr: Add a return value to spapr_nvdimm_validate() 2020-10-09 10:15:06 +11:00
spapr_ovec.c
spapr_pci_nvlink2.c spapr_numa: move NVLink2 associativity handling to spapr_numa.c 2020-09-08 10:08:43 +10:00
spapr_pci_vfio.c
spapr_pci.c spapr: Add a return value to spapr_drc_attach() 2020-10-09 10:15:06 +11:00
spapr_rng.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
spapr_rtas_ddw.c
spapr_rtas.c pseries: fix kvmppc_set_fwnmi() 2020-07-27 11:09:25 +10:00
spapr_rtc.c
spapr_tpm_proxy.c
spapr_vio.c spapr: Simplify error handling in spapr_vio_busdev_realize() 2020-10-09 10:15:06 +11:00
spapr.c spapr: add spapr_machine_using_legacy_numa() helper 2020-10-09 10:52:09 +11:00
trace-events trace-events: Fix attribution of trace points to source 2020-09-09 17:17:58 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
virtex_ml507.c load_elf: Remove unused address variables from callers 2020-09-25 16:52:08 -07:00