ppc: introducing spapr_numa.c NUMA code helper
We're going to make changes in how spapr handles all ibm,associativity* related properties to enhance our current NUMA support. At this moment we have associativity code scattered all around spapr_* files, with hardcoded values and array sizes. This makes it harder to change any NUMA specific parameters in the future. Having everything in the same place allows not only for easier tuning, but also easier understanding since all NUMA related code is on the same file. This patch introduces a new file to gather all NUMA/associativity handling code in spapr, spapr_numa.c. To get things started, let's remove associativity-reference-points and max-associativity-domains code from spapr_dt_rtas() to a new helper called spapr_numa_write_rtas_dt(). This will decouple spapr_dt_rtas() from the NUMA changes that are going to happen in those two properties. Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20200901125645.118026-2-danielhb413@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
f5f239315c
commit
1eee995026
|
@ -25,7 +25,8 @@ ppc_ss.add(when: 'CONFIG_PSERIES', if_true: files(
|
||||||
'spapr_irq.c',
|
'spapr_irq.c',
|
||||||
'spapr_tpm_proxy.c',
|
'spapr_tpm_proxy.c',
|
||||||
'spapr_nvdimm.c',
|
'spapr_nvdimm.c',
|
||||||
'spapr_rtas_ddw.c'
|
'spapr_rtas_ddw.c',
|
||||||
|
'spapr_numa.c',
|
||||||
))
|
))
|
||||||
ppc_ss.add(when: 'CONFIG_SPAPR_RNG', if_true: files('spapr_rng.c'))
|
ppc_ss.add(when: 'CONFIG_SPAPR_RNG', if_true: files('spapr_rng.c'))
|
||||||
ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_LINUX'], if_true: files(
|
ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_LINUX'], if_true: files(
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
#include "hw/mem/memory-device.h"
|
#include "hw/mem/memory-device.h"
|
||||||
#include "hw/ppc/spapr_tpm_proxy.h"
|
#include "hw/ppc/spapr_tpm_proxy.h"
|
||||||
#include "hw/ppc/spapr_nvdimm.h"
|
#include "hw/ppc/spapr_nvdimm.h"
|
||||||
|
#include "hw/ppc/spapr_numa.h"
|
||||||
|
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
|
|
||||||
|
@ -891,16 +892,9 @@ static int spapr_dt_rng(void *fdt)
|
||||||
static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||||
{
|
{
|
||||||
MachineState *ms = MACHINE(spapr);
|
MachineState *ms = MACHINE(spapr);
|
||||||
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
|
|
||||||
int rtas;
|
int rtas;
|
||||||
GString *hypertas = g_string_sized_new(256);
|
GString *hypertas = g_string_sized_new(256);
|
||||||
GString *qemu_hypertas = g_string_sized_new(256);
|
GString *qemu_hypertas = g_string_sized_new(256);
|
||||||
uint32_t refpoints[] = {
|
|
||||||
cpu_to_be32(0x4),
|
|
||||||
cpu_to_be32(0x4),
|
|
||||||
cpu_to_be32(0x2),
|
|
||||||
};
|
|
||||||
uint32_t nr_refpoints = ARRAY_SIZE(refpoints);
|
|
||||||
uint64_t max_device_addr = MACHINE(spapr)->device_memory->base +
|
uint64_t max_device_addr = MACHINE(spapr)->device_memory->base +
|
||||||
memory_region_size(&MACHINE(spapr)->device_memory->mr);
|
memory_region_size(&MACHINE(spapr)->device_memory->mr);
|
||||||
uint32_t lrdr_capacity[] = {
|
uint32_t lrdr_capacity[] = {
|
||||||
|
@ -910,14 +904,6 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||||
cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE & 0xffffffff),
|
cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE & 0xffffffff),
|
||||||
cpu_to_be32(ms->smp.max_cpus / ms->smp.threads),
|
cpu_to_be32(ms->smp.max_cpus / ms->smp.threads),
|
||||||
};
|
};
|
||||||
uint32_t maxdomain = cpu_to_be32(spapr->gpu_numa_id > 1 ? 1 : 0);
|
|
||||||
uint32_t maxdomains[] = {
|
|
||||||
cpu_to_be32(4),
|
|
||||||
maxdomain,
|
|
||||||
maxdomain,
|
|
||||||
maxdomain,
|
|
||||||
cpu_to_be32(spapr->gpu_numa_id),
|
|
||||||
};
|
|
||||||
|
|
||||||
_FDT(rtas = fdt_add_subnode(fdt, 0, "rtas"));
|
_FDT(rtas = fdt_add_subnode(fdt, 0, "rtas"));
|
||||||
|
|
||||||
|
@ -953,15 +939,7 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||||
qemu_hypertas->str, qemu_hypertas->len));
|
qemu_hypertas->str, qemu_hypertas->len));
|
||||||
g_string_free(qemu_hypertas, TRUE);
|
g_string_free(qemu_hypertas, TRUE);
|
||||||
|
|
||||||
if (smc->pre_5_1_assoc_refpoints) {
|
spapr_numa_write_rtas_dt(spapr, fdt, rtas);
|
||||||
nr_refpoints = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
_FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",
|
|
||||||
refpoints, nr_refpoints * sizeof(refpoints[0])));
|
|
||||||
|
|
||||||
_FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains",
|
|
||||||
maxdomains, sizeof(maxdomains)));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FWNMI reserves RTAS_ERROR_LOG_MAX for the machine check error log,
|
* FWNMI reserves RTAS_ERROR_LOG_MAX for the machine check error log,
|
||||||
|
|
50
hw/ppc/spapr_numa.c
Normal file
50
hw/ppc/spapr_numa.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* QEMU PowerPC pSeries Logical Partition NUMA associativity handling
|
||||||
|
*
|
||||||
|
* Copyright IBM Corp. 2020
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu-common.h"
|
||||||
|
#include "hw/ppc/spapr_numa.h"
|
||||||
|
#include "hw/ppc/fdt.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper that writes ibm,associativity-reference-points and
|
||||||
|
* max-associativity-domains in the RTAS pointed by @rtas
|
||||||
|
* in the DT @fdt.
|
||||||
|
*/
|
||||||
|
void spapr_numa_write_rtas_dt(SpaprMachineState *spapr, void *fdt, int rtas)
|
||||||
|
{
|
||||||
|
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
|
||||||
|
uint32_t refpoints[] = {
|
||||||
|
cpu_to_be32(0x4),
|
||||||
|
cpu_to_be32(0x4),
|
||||||
|
cpu_to_be32(0x2),
|
||||||
|
};
|
||||||
|
uint32_t nr_refpoints = ARRAY_SIZE(refpoints);
|
||||||
|
uint32_t maxdomain = cpu_to_be32(spapr->gpu_numa_id > 1 ? 1 : 0);
|
||||||
|
uint32_t maxdomains[] = {
|
||||||
|
cpu_to_be32(4),
|
||||||
|
maxdomain,
|
||||||
|
maxdomain,
|
||||||
|
maxdomain,
|
||||||
|
cpu_to_be32(spapr->gpu_numa_id),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (smc->pre_5_1_assoc_refpoints) {
|
||||||
|
nr_refpoints = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
_FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",
|
||||||
|
refpoints, nr_refpoints * sizeof(refpoints[0])));
|
||||||
|
|
||||||
|
_FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains",
|
||||||
|
maxdomains, sizeof(maxdomains)));
|
||||||
|
}
|
20
include/hw/ppc/spapr_numa.h
Normal file
20
include/hw/ppc/spapr_numa.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* QEMU PowerPC pSeries Logical Partition NUMA associativity handling
|
||||||
|
*
|
||||||
|
* Copyright IBM Corp. 2020
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HW_SPAPR_NUMA_H
|
||||||
|
#define HW_SPAPR_NUMA_H
|
||||||
|
|
||||||
|
#include "hw/ppc/spapr.h"
|
||||||
|
|
||||||
|
void spapr_numa_write_rtas_dt(SpaprMachineState *spapr, void *fdt, int rtas);
|
||||||
|
|
||||||
|
#endif /* HW_SPAPR_NUMA_H */
|
Loading…
Reference in a new issue