spapr_numa.c: rename numa_assoc_array to FORM1_assoc_array
Introducing a new NUMA affinity, FORM2, requires a new mechanism to switch between affinity modes after CAS. Also, we want FORM2 data structures and functions to be completely separated from the existing FORM1 code, allowing us to avoid adding new code that inherits the existing complexity of FORM1. The idea of switching values used by the write_dt() functions in spapr_numa.c was already introduced in the previous patch, and the same approach will be used when dealing with the FORM1 and FORM2 arrays. We can accomplish that by that by renaming the existing numa_assoc_array to FORM1_assoc_array, which now is used exclusively to handle FORM1 affinity data. A new helper get_associativity() is then introduced to be used by the write_dt() functions to retrieve the current ibm,associativity array of a given node, after considering affinity selection that might have been done during CAS. All code that was using numa_assoc_array now needs to retrieve the array by calling this function. This will allow for an easier plug of FORM2 data later on. Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20210920174947.556324-5-danielhb413@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
3a6e4ce684
commit
a165ac67c3
|
@ -17,6 +17,7 @@
|
||||||
#include "kvm_ppc.h"
|
#include "kvm_ppc.h"
|
||||||
#include "hw/ppc/fdt.h"
|
#include "hw/ppc/fdt.h"
|
||||||
#include "hw/ppc/spapr_ovec.h"
|
#include "hw/ppc/spapr_ovec.h"
|
||||||
|
#include "hw/ppc/spapr_numa.h"
|
||||||
#include "mmu-book3s-v3.h"
|
#include "mmu-book3s-v3.h"
|
||||||
#include "hw/mem/memory-device.h"
|
#include "hw/mem/memory-device.h"
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,15 @@ static int get_vcpu_assoc_size(SpaprMachineState *spapr)
|
||||||
return get_numa_assoc_size(spapr) + 1;
|
return get_numa_assoc_size(spapr) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Retrieves the ibm,associativity array of NUMA node 'node_id'
|
||||||
|
* for the current NUMA affinity.
|
||||||
|
*/
|
||||||
|
static const uint32_t *get_associativity(SpaprMachineState *spapr, int node_id)
|
||||||
|
{
|
||||||
|
return spapr->FORM1_assoc_array[node_id];
|
||||||
|
}
|
||||||
|
|
||||||
static bool spapr_numa_is_symmetrical(MachineState *ms)
|
static bool spapr_numa_is_symmetrical(MachineState *ms)
|
||||||
{
|
{
|
||||||
int src, dst;
|
int src, dst;
|
||||||
|
@ -124,7 +133,7 @@ static void spapr_numa_define_FORM1_domains(SpaprMachineState *spapr)
|
||||||
*/
|
*/
|
||||||
for (i = 1; i < nb_numa_nodes; i++) {
|
for (i = 1; i < nb_numa_nodes; i++) {
|
||||||
for (j = 1; j < FORM1_DIST_REF_POINTS; j++) {
|
for (j = 1; j < FORM1_DIST_REF_POINTS; j++) {
|
||||||
spapr->numa_assoc_array[i][j] = cpu_to_be32(i);
|
spapr->FORM1_assoc_array[i][j] = cpu_to_be32(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,8 +185,8 @@ static void spapr_numa_define_FORM1_domains(SpaprMachineState *spapr)
|
||||||
* and going up to 0x1.
|
* and going up to 0x1.
|
||||||
*/
|
*/
|
||||||
for (i = n_level; i > 0; i--) {
|
for (i = n_level; i > 0; i--) {
|
||||||
assoc_src = spapr->numa_assoc_array[src][i];
|
assoc_src = spapr->FORM1_assoc_array[src][i];
|
||||||
spapr->numa_assoc_array[dst][i] = assoc_src;
|
spapr->FORM1_assoc_array[dst][i] = assoc_src;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,8 +213,8 @@ static void spapr_numa_FORM1_affinity_init(SpaprMachineState *spapr,
|
||||||
* 'i' will be a valid node_id set by the user.
|
* 'i' will be a valid node_id set by the user.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < nb_numa_nodes; i++) {
|
for (i = 0; i < nb_numa_nodes; i++) {
|
||||||
spapr->numa_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS);
|
spapr->FORM1_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS);
|
||||||
spapr->numa_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i);
|
spapr->FORM1_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -219,15 +228,15 @@ static void spapr_numa_FORM1_affinity_init(SpaprMachineState *spapr,
|
||||||
max_nodes_with_gpus = nb_numa_nodes + NVGPU_MAX_NUM;
|
max_nodes_with_gpus = nb_numa_nodes + NVGPU_MAX_NUM;
|
||||||
|
|
||||||
for (i = nb_numa_nodes; i < max_nodes_with_gpus; i++) {
|
for (i = nb_numa_nodes; i < max_nodes_with_gpus; i++) {
|
||||||
spapr->numa_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS);
|
spapr->FORM1_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS);
|
||||||
|
|
||||||
for (j = 1; j < FORM1_DIST_REF_POINTS; j++) {
|
for (j = 1; j < FORM1_DIST_REF_POINTS; j++) {
|
||||||
uint32_t gpu_assoc = smc->pre_5_1_assoc_refpoints ?
|
uint32_t gpu_assoc = smc->pre_5_1_assoc_refpoints ?
|
||||||
SPAPR_GPU_NUMA_ID : cpu_to_be32(i);
|
SPAPR_GPU_NUMA_ID : cpu_to_be32(i);
|
||||||
spapr->numa_assoc_array[i][j] = gpu_assoc;
|
spapr->FORM1_assoc_array[i][j] = gpu_assoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
spapr->numa_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i);
|
spapr->FORM1_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -259,14 +268,17 @@ void spapr_numa_associativity_init(SpaprMachineState *spapr,
|
||||||
void spapr_numa_write_associativity_dt(SpaprMachineState *spapr, void *fdt,
|
void spapr_numa_write_associativity_dt(SpaprMachineState *spapr, void *fdt,
|
||||||
int offset, int nodeid)
|
int offset, int nodeid)
|
||||||
{
|
{
|
||||||
|
const uint32_t *associativity = get_associativity(spapr, nodeid);
|
||||||
|
|
||||||
_FDT((fdt_setprop(fdt, offset, "ibm,associativity",
|
_FDT((fdt_setprop(fdt, offset, "ibm,associativity",
|
||||||
spapr->numa_assoc_array[nodeid],
|
associativity,
|
||||||
get_numa_assoc_size(spapr) * sizeof(uint32_t))));
|
get_numa_assoc_size(spapr) * sizeof(uint32_t))));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t *spapr_numa_get_vcpu_assoc(SpaprMachineState *spapr,
|
static uint32_t *spapr_numa_get_vcpu_assoc(SpaprMachineState *spapr,
|
||||||
PowerPCCPU *cpu)
|
PowerPCCPU *cpu)
|
||||||
{
|
{
|
||||||
|
const uint32_t *associativity = get_associativity(spapr, cpu->node_id);
|
||||||
int max_distance_ref_points = get_max_dist_ref_points(spapr);
|
int max_distance_ref_points = get_max_dist_ref_points(spapr);
|
||||||
int vcpu_assoc_size = get_vcpu_assoc_size(spapr);
|
int vcpu_assoc_size = get_vcpu_assoc_size(spapr);
|
||||||
uint32_t *vcpu_assoc = g_new(uint32_t, vcpu_assoc_size);
|
uint32_t *vcpu_assoc = g_new(uint32_t, vcpu_assoc_size);
|
||||||
|
@ -280,7 +292,7 @@ static uint32_t *spapr_numa_get_vcpu_assoc(SpaprMachineState *spapr,
|
||||||
*/
|
*/
|
||||||
vcpu_assoc[0] = cpu_to_be32(max_distance_ref_points + 1);
|
vcpu_assoc[0] = cpu_to_be32(max_distance_ref_points + 1);
|
||||||
vcpu_assoc[vcpu_assoc_size - 1] = cpu_to_be32(index);
|
vcpu_assoc[vcpu_assoc_size - 1] = cpu_to_be32(index);
|
||||||
memcpy(vcpu_assoc + 1, spapr->numa_assoc_array[cpu->node_id] + 1,
|
memcpy(vcpu_assoc + 1, associativity + 1,
|
||||||
(vcpu_assoc_size - 2) * sizeof(uint32_t));
|
(vcpu_assoc_size - 2) * sizeof(uint32_t));
|
||||||
|
|
||||||
return vcpu_assoc;
|
return vcpu_assoc;
|
||||||
|
@ -319,10 +331,10 @@ int spapr_numa_write_assoc_lookup_arrays(SpaprMachineState *spapr, void *fdt,
|
||||||
cur_index += 2;
|
cur_index += 2;
|
||||||
for (i = 0; i < nr_nodes; i++) {
|
for (i = 0; i < nr_nodes; i++) {
|
||||||
/*
|
/*
|
||||||
* For the lookup-array we use the ibm,associativity array,
|
* For the lookup-array we use the ibm,associativity array of the
|
||||||
* from numa_assoc_array. without the first element (size).
|
* current NUMA affinity, without the first element (size).
|
||||||
*/
|
*/
|
||||||
uint32_t *associativity = spapr->numa_assoc_array[i];
|
const uint32_t *associativity = get_associativity(spapr, i);
|
||||||
memcpy(cur_index, ++associativity,
|
memcpy(cur_index, ++associativity,
|
||||||
sizeof(uint32_t) * max_distance_ref_points);
|
sizeof(uint32_t) * max_distance_ref_points);
|
||||||
cur_index += max_distance_ref_points;
|
cur_index += max_distance_ref_points;
|
||||||
|
|
|
@ -249,7 +249,7 @@ struct SpaprMachineState {
|
||||||
unsigned gpu_numa_id;
|
unsigned gpu_numa_id;
|
||||||
SpaprTpmProxy *tpm_proxy;
|
SpaprTpmProxy *tpm_proxy;
|
||||||
|
|
||||||
uint32_t numa_assoc_array[NUMA_NODES_MAX_NUM][FORM1_NUMA_ASSOC_SIZE];
|
uint32_t FORM1_assoc_array[NUMA_NODES_MAX_NUM][FORM1_NUMA_ASSOC_SIZE];
|
||||||
|
|
||||||
Error *fwnmi_migration_blocker;
|
Error *fwnmi_migration_blocker;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue