mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-20 21:04:40 +08:00
powerpc/numa: Only use active VPHN count fields
VPHN supports up to 8 distance fields but the number of entries in ibm,associativity-reference-points signifies how many are in use. Don't look at all the VPHN counts, only distance_ref_points_depth worth. Since we already cap our distance metrics at MAX_DISTANCE_REF_POINTS, use that to size the VPHN arrays and add a BUILD_BUG_ON to avoid it growing larger than the VPHN maximum of 8. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
cd9d6cc726
commit
5de1669910
@ -1291,8 +1291,7 @@ u64 memory_hotplug_max(void)
|
||||
|
||||
/* Virtual Processor Home Node (VPHN) support */
|
||||
#ifdef CONFIG_PPC_SPLPAR
|
||||
#define VPHN_NR_CHANGE_CTRS (8)
|
||||
static u8 vphn_cpu_change_counts[NR_CPUS][VPHN_NR_CHANGE_CTRS];
|
||||
static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
|
||||
static cpumask_t cpu_associativity_changes_mask;
|
||||
static int vphn_enabled;
|
||||
static void set_topology_timer(void);
|
||||
@ -1305,12 +1304,15 @@ static void setup_cpu_associativity_change_counters(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
/* The VPHN feature supports a maximum of 8 reference points */
|
||||
BUILD_BUG_ON(MAX_DISTANCE_REF_POINTS > 8);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
int i;
|
||||
u8 *counts = vphn_cpu_change_counts[cpu];
|
||||
volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
|
||||
|
||||
for (i = 0; i < VPHN_NR_CHANGE_CTRS; i++)
|
||||
for (i = 0; i < distance_ref_points_depth; i++)
|
||||
counts[i] = hypervisor_counts[i];
|
||||
}
|
||||
}
|
||||
@ -1338,7 +1340,7 @@ static int update_cpu_associativity_changes_mask(void)
|
||||
u8 *counts = vphn_cpu_change_counts[cpu];
|
||||
volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
|
||||
|
||||
for (i = 0; i < VPHN_NR_CHANGE_CTRS; i++) {
|
||||
for (i = 0; i < distance_ref_points_depth; i++) {
|
||||
if (hypervisor_counts[i] > counts[i]) {
|
||||
counts[i] = hypervisor_counts[i];
|
||||
changed = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user