diff mbox

[RFC] arm64: topology: Map PPTT node offset to logic physical package id

Message ID 1530177508-15298-1-git-send-email-shunyong.yang@hxt-semitech.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shunyong Yang June 28, 2018, 9:18 a.m. UTC
As PPTT spec doesn't define the physical package id,
find_acpi_cpu_topology_package() will return offset of the node with
Physical package field set when querying physical package id. So, it
returns 162(0xA2) in following example.

[0A2h 0162   1]                Subtable Type : 00 [Processor Hierarchy
Node]
[0A3h 0163   1]                       Length : 1C
[0A4h 0164   2]                     Reserved : 0000
[0A6h 0166   4]        Flags (decoded below) : 00000003
                            Physical package : 1
                     ACPI Processor ID valid : 1
[0AAh 0170   4]                       Parent : 00000000
[0AEh 0174   4]            ACPI Processor ID : 00001000
[0B2h 0178   4]      Private Resource Number : 00000002
[0B6h 0182   4]             Private Resource : 0000006C
[0BAh 0186   4]             Private Resource : 00000084

So, when "cat physical_package" in /sys/devices/system/cpu/cpu0/topology/,
it will output 162(0xA2). And if some items are added before the node
above, the output will change to other value.

This patch maps the node offset to a logic package id. It maps the first
node offset to 0, the second to 1, and so on.

Then, it will not output a big value, such as 162 above. And it will
not change when some nodes(Physical package not set) are added.

And as long as the nodes with Physical package field set in PPTT keeps
the real hardware order, the logic id can map to hardware package id to
some extent.

Hope to get feedback from you.

Cc: Joey Zheng <yu.zheng@hxt-semitech.com>
Signed-off-by: Shunyong Yang <shunyong.yang@hxt-semitech.com>
---
 arch/arm64/kernel/topology.c | 53 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

Comments

Will Deacon July 12, 2018, 11:06 a.m. UTC | #1
On Thu, Jun 28, 2018 at 05:18:28PM +0800, Shunyong Yang wrote:
> As PPTT spec doesn't define the physical package id,
> find_acpi_cpu_topology_package() will return offset of the node with
> Physical package field set when querying physical package id. So, it
> returns 162(0xA2) in following example.
> 
> [0A2h 0162   1]                Subtable Type : 00 [Processor Hierarchy
> Node]
> [0A3h 0163   1]                       Length : 1C
> [0A4h 0164   2]                     Reserved : 0000
> [0A6h 0166   4]        Flags (decoded below) : 00000003
>                             Physical package : 1
>                      ACPI Processor ID valid : 1
> [0AAh 0170   4]                       Parent : 00000000
> [0AEh 0174   4]            ACPI Processor ID : 00001000
> [0B2h 0178   4]      Private Resource Number : 00000002
> [0B6h 0182   4]             Private Resource : 0000006C
> [0BAh 0186   4]             Private Resource : 00000084
> 
> So, when "cat physical_package" in /sys/devices/system/cpu/cpu0/topology/,
> it will output 162(0xA2). And if some items are added before the node
> above, the output will change to other value.
> 
> This patch maps the node offset to a logic package id. It maps the first
> node offset to 0, the second to 1, and so on.
> 
> Then, it will not output a big value, such as 162 above. And it will
> not change when some nodes(Physical package not set) are added.
> 
> And as long as the nodes with Physical package field set in PPTT keeps
> the real hardware order, the logic id can map to hardware package id to
> some extent.
> 
> Hope to get feedback from you.

I'm assuming this is no longer needed now that we have queued the series
from Sudeep?

Will
Sudeep Holla July 12, 2018, 11:20 a.m. UTC | #2
Hi Will,

On 12/07/18 12:06, Will Deacon wrote:
> On Thu, Jun 28, 2018 at 05:18:28PM +0800, Shunyong Yang wrote:

[..]

>>
>> And as long as the nodes with Physical package field set in PPTT keeps
>> the real hardware order, the logic id can map to hardware package id to
>> some extent.
>>
>> Hope to get feedback from you.
> 
> I'm assuming this is no longer needed now that we have queued the series
> from Sudeep?
> 

The series relating to topology/numa that you have queued helps us to
re-introduces numa mask check that was reverted partial in v4.18 and is
not related to the issue reported or addressed by this patch.

However, there's no proper solution to the issue reported in this thread
and the one from Andrew Jones[1]. The only solution is to rely on ACPI
firmware for that instead of trying to fix in OS and we have already
merged the patch to fix that in acpi/pptt.c (Commit 30998033f62a ("ACPI
/ PPTT: use ACPI ID whenever ACPI_PPTT_ACPI_PROCESSOR_ID_VALID is set"))

In short, all the know issues are addressed so far and nothing else
needs to be queued for now.
diff mbox

Patch

diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
index f845a8617812..c219224b36e8 100644
--- a/arch/arm64/kernel/topology.c
+++ b/arch/arm64/kernel/topology.c
@@ -320,11 +320,59 @@  static void __init reset_cpu_topology(void)
  * Propagate the topology information of the processor_topology_node tree to the
  * cpu_topology array.
  */
+
+struct package_id_map {
+	int topology_id;
+	int package_id;
+	struct list_head list;
+};
+
+static int map_package_id(int topology_id, int *max_package_id,
+			  struct list_head *head)
+{
+	struct list_head *pos;
+	struct package_id_map *entry;
+
+	list_for_each(pos, head) {
+		entry = container_of(pos, struct package_id_map, list);
+		if (entry->topology_id == topology_id)
+			goto done;
+	}
+
+	/* topology_id not found in the list */
+	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+	if (!entry)
+		return topology_id;
+
+	entry->topology_id = topology_id;
+	entry->package_id = *max_package_id;
+	list_add(&entry->list, head);
+	*max_package_id = *max_package_id + 1;
+
+done:
+	return entry->package_id;
+}
+
+static void destroy_map(struct list_head *head)
+{
+	struct package_id_map *entry;
+	struct list_head *pos, *q;
+
+	list_for_each_safe(pos, q, head) {
+		entry = container_of(pos, struct package_id_map, list);
+		list_del(pos);
+		kfree(entry);
+	}
+}
+
 static int __init parse_acpi_topology(void)
 {
 	bool is_threaded;
 	int cpu, topology_id;
+	struct list_head package_id_list;
+	int max_package_id = 0;
 
+	INIT_LIST_HEAD(&package_id_list);
 	is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK;
 
 	for_each_possible_cpu(cpu) {
@@ -343,7 +391,9 @@  static int __init parse_acpi_topology(void)
 			cpu_topology[cpu].core_id    = topology_id;
 		}
 		topology_id = find_acpi_cpu_topology_package(cpu);
-		cpu_topology[cpu].package_id = topology_id;
+		cpu_topology[cpu].package_id = map_package_id(topology_id,
+							&max_package_id,
+							&package_id_list);
 
 		i = acpi_find_last_cache_level(cpu);
 
@@ -358,6 +408,7 @@  static int __init parse_acpi_topology(void)
 		}
 	}
 
+	destroy_map(&package_id_list);
 	return 0;
 }