Skip to contentSkip to conversation

PPTT handle Handle architecturally unknown cache types

PATCH Superseded Jeffrey Hugo 4 participants 9 messages Sep 28, 2018 – Oct 3, 2018

Subsystems (2)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover PPTT handle Handle architecturally unknown cache types

The ARM Architecture Reference Manual allows for caches to be "invisible" and thus not specified in the system registers under some scenarios such as if the cache cannot be managed by set/way operations.

However, such caches may be specified in the ACPI PPTT table for workload performance/scheduling optimizations.

Currently such caches can cause an error in lscpu -

lscpu: cannot open /sys/devices/system/cpu/cpu0/cache/index3/type: No such file or directory

and result in no output, providing a poor user experience. lstopo is also affected as such caches are not included in the output.

Address these issues by attempting to be a little more discerning about when cache information is provided to userspace, and also utilize all sources for cache information when possible.

[v3]
-removed valid flag in PPTT
-Added Jeremy Linton's reviewed-by

[v2]
-Updated cacheinfo per Sudeep's suggestion
-Integrated the PPTT fix into existing PPTT code per Sudeep's suggestion

Jeffrey Hugo (2):
drivers: base: cacheinfo: Do not populate sysfs for unknown cache
types
ACPI/PPTT: Handle architecturally unknown cache types

 drivers/acpi/pptt.c      | 15 +++++++++++----
 drivers/base/cacheinfo.c |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)
Signature · 3 lines
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
#1 lore raw

PATCH v3 1/2 drivers: base: cacheinfo: Do not populate sysfs for unknown cache types

If a cache has an unknown type because neither the hardware nor the firmware told us, an entry in the sysfs tree will be made, but the type file will not be present. lscpu depends on the type file being present for every entry, and will error out without printing system information if lscpu cannot open the type file.

Presenting information about a cache without indicating its type is not useful, therefore if we hit a cache with an unknown type, stop populating sysfs so that userspace has the maximum amount of useful information.

This addresses the following lscpu error, which prevents any output.
lscpu: cannot open /sys/devices/system/cpu/cpu0/cache/index3/type: No such file or directory

---
 drivers/base/cacheinfo.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/base/cacheinfo.c +2 -0
index 5d5b598..cf78fa6 100644
@@ -615,6 +615,8 @@ static int cache_add_dev(unsigned int cpu)
 		this_leaf = this_cpu_ci->info_list + i;
 		if (this_leaf->disable_sysfs)
 			continue;
+		if (this_leaf->type == CACHE_TYPE_NOCACHE)
+			break;
 		cache_groups = cache_get_attribute_groups(this_leaf);
 		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
 					   "index%1u", i);
Signature · 3 lines
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
Reviewed-by on v3 1/2
#2 lore raw

Re: [PATCH v3 1/2] drivers: base: cacheinfo: Do not populate sysfs for unknown cache types

Quoted 10 lines · Jeffrey Hugo

If a cache has an unknown type because neither the hardware nor the firmware told us, an entry in the sysfs tree will be made, but the type file will not be present. lscpu depends on the type file being present for every entry, and will error out without printing system information if lscpu cannot open the type file.

Presenting information about a cache without indicating its type is not useful, therefore if we hit a cache with an unknown type, stop populating sysfs so that userspace has the maximum amount of useful information.

Quoted 7 lines

This addresses the following lscpu error, which prevents any output.
lscpu: cannot open /sys/devices/system/cpu/cpu0/cache/index3/type: No such file or directory

--
Regards,
Sudeep

#3 lore raw

Re: [PATCH v3 1/2] drivers: base: cacheinfo: Do not populate sysfs for unknown cache types

In reply to Jeffrey Hugo
Quoted 27 lines · CEST Jeffrey Hugo

If a cache has an unknown type because neither the hardware nor the firmware told us, an entry in the sysfs tree will be made, but the type file will not be present. lscpu depends on the type file being present for every entry, and will error out without printing system information if lscpu cannot open the type file.

Presenting information about a cache without indicating its type is not useful, therefore if we hit a cache with an unknown type, stop populating sysfs so that userspace has the maximum amount of useful information.

This addresses the following lscpu error, which prevents any output.
lscpu: cannot open /sys/devices/system/cpu/cpu0/cache/index3/type: No such file or directory

---
 drivers/base/cacheinfo.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/base/cacheinfo.c +0 -0
index 5d5b598..cf78fa6 100644

drivers/base/cacheinfo.c static int cache_add_dev(unsigned int cpu) · line 622

Quoted 8 lines
drivers/base/cacheinfo.c +2 -0
@@ -615,6 +615,8 @@ static int cache_add_dev(unsigned int cpu)
 		this_leaf = this_cpu_ci->info_list + i;
 		if (this_leaf->disable_sysfs)
 			continue;
+		if (this_leaf->type == CACHE_TYPE_NOCACHE)
+			break;
 		cache_groups = cache_get_attribute_groups(this_leaf);
 		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
 					   "index%1u", i);

Can you please resend this patch with all tags collected so far?

Patchwork doesn't seem to have picked it up.

Thanks,
Rafael

#4 lore raw

Re: [PATCH v3 1/2] drivers: base: cacheinfo: Do not populate sysfs for unknown cache types

Quoted 22 lines · Rafael J. Wysocki
Quoted 21 lines · CEST Jeffrey Hugo

If a cache has an unknown type because neither the hardware nor the firmware told us, an entry in the sysfs tree will be made, but the type file will not be present. lscpu depends on the type file being present for every entry, and will error out without printing system information if lscpu cannot open the type file.

Presenting information about a cache without indicating its type is not useful, therefore if we hit a cache with an unknown type, stop populating sysfs so that userspace has the maximum amount of useful information.

This addresses the following lscpu error, which prevents any output.
lscpu: cannot open /sys/devices/system/cpu/cpu0/cache/index3/type: No such file or directory

---
  drivers/base/cacheinfo.c | 2 ++
  1 file changed, 2 insertions(+)
Quoted 16 lines
Quoted 6 lines
drivers/base/cacheinfo.c +0 -0
index 5d5b598..cf78fa6 100644

drivers/base/cacheinfo.c static int cache_add_dev(unsigned int cpu) · line 622

Quoted 8 lines
drivers/base/cacheinfo.c +2 -0
@@ -615,6 +615,8 @@ static int cache_add_dev(unsigned int cpu)
  		this_leaf = this_cpu_ci->info_list + i;
  		if (this_leaf->disable_sysfs)
  			continue;
+		if (this_leaf->type == CACHE_TYPE_NOCACHE)
+			break;
  		cache_groups = cache_get_attribute_groups(this_leaf);
  		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
  					   "index%1u", i);

Can you please resend this patch with all tags collected so far?

Will do.

Signature · 4 lines
Jeffrey Hugo
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
#5 lore raw

PATCH v3 2/2 ACPI/PPTT: Handle architecturally unknown cache types

In reply to Jeffrey Hugo

The type of a cache might not be specified by architectural mechanisms (ie system registers), but its type might be specified in the PPTT. In this case, we should populate the type of the cache, rather than leave it undefined.

This fixes the issue where the cacheinfo driver will not populate sysfs for such caches, resulting in the information missing from utilities like lstopo and lscpu, thus degrading the user experience.

Fixes 2bd00bcd73e5 (ACPI/PPTT: Add Processor Properties Topology Table parsing)
---
 drivers/acpi/pptt.c | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)
drivers/acpi/pptt.c +13 -17
index d1e26cb..38ac30e 100644
@@ -357,25 +357,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 				    struct acpi_pptt_cache *found_cache,
 				    struct acpi_pptt_processor *cpu_node)
 {
-	int valid_flags = 0;
-
 	this_leaf->fw_token = cpu_node;
-	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
 		this_leaf->size = found_cache->size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
+	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
 		this_leaf->coherency_line_size = found_cache->line_size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
+	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
 		this_leaf->number_of_sets = found_cache->number_of_sets;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
 		this_leaf->ways_of_associativity = found_cache->associativity;
-		valid_flags++;
-	}
 	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
 		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
 		case ACPI_PPTT_CACHE_POLICY_WT:
@@ -402,11 +392,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 		}
 	}
 	/*
-	 * If the above flags are valid, and the cache type is NOCACHE
-	 * update the cache type as well.
+	 * If cache type is NOCACHE, then the cache hasn't been specified
+	 * via other mechanisms.  Update the type if a cache type has been
+	 * provided.
+	 *
+	 * Note, we assume such caches are unified based on conventional system
+	 * design and known examples.  Significant work is required elsewhere to
+	 * fully support data/instruction only type caches which are only
+	 * specified in PPTT.
 	 */
 	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
-	    valid_flags == PPTT_CHECKED_ATTRIBUTES)
+	    found_cache->flags & ACPI_PPTT_CACHE_TYPE_VALID)
 		this_leaf->type = CACHE_TYPE_UNIFIED;
 }
 
Signature · 3 lines
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
Reviewed-by on v3 2/2
#6 lore raw

Re: [PATCH v3 2/2] ACPI/PPTT: Handle architecturally unknown cache types

Hi,

Quoted 8 lines · Jeffrey Hugo

The type of a cache might not be specified by architectural mechanisms (ie system registers), but its type might be specified in the PPTT. In this case, we should populate the type of the cache, rather than leave it undefined.

This fixes the issue where the cacheinfo driver will not populate sysfs for such caches, resulting in the information missing from utilities like lstopo and lscpu, thus degrading the user experience.

The code looks fine to me.

Thanks!

Quoted 3 lines
Fixes 2bd00bcd73e5 (ACPI/PPTT: Add Processor Properties Topology Table parsing)

PS:

Although, if you end up re-spinning this, I think its appropriate to add in the commit message that what this is really working around is firmware that has declined to fill out all the fields in the cache description.

Quoted 61 lines
---
  drivers/acpi/pptt.c | 30 +++++++++++++-----------------
  1 file changed, 13 insertions(+), 17 deletions(-)
drivers/acpi/pptt.c +13 -17
index d1e26cb..38ac30e 100644
@@ -357,25 +357,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
  				    struct acpi_pptt_cache *found_cache,
  				    struct acpi_pptt_processor *cpu_node)
  {
-	int valid_flags = 0;
-
  	this_leaf->fw_token = cpu_node;
-	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
  		this_leaf->size = found_cache->size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
+	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
  		this_leaf->coherency_line_size = found_cache->line_size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
+	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
  		this_leaf->number_of_sets = found_cache->number_of_sets;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
  		this_leaf->ways_of_associativity = found_cache->associativity;
-		valid_flags++;
-	}
  	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
  		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
  		case ACPI_PPTT_CACHE_POLICY_WT:
@@ -402,11 +392,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
  		}
  	}
  	/*
-	 * If the above flags are valid, and the cache type is NOCACHE
-	 * update the cache type as well.
+	 * If cache type is NOCACHE, then the cache hasn't been specified
+	 * via other mechanisms.  Update the type if a cache type has been
+	 * provided.
+	 *
+	 * Note, we assume such caches are unified based on conventional system
+	 * design and known examples.  Significant work is required elsewhere to
+	 * fully support data/instruction only type caches which are only
+	 * specified in PPTT.
  	 */
  	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
-	    valid_flags == PPTT_CHECKED_ATTRIBUTES)
+	    found_cache->flags & ACPI_PPTT_CACHE_TYPE_VALID)
  		this_leaf->type = CACHE_TYPE_UNIFIED;
  }
 
Reviewed-by on v3 2/2
#7 lore raw

Re: [PATCH v3 2/2] ACPI/PPTT: Handle architecturally unknown cache types

In reply to Jeffrey Hugo
Quoted 57 lines · Jeffrey Hugo

The type of a cache might not be specified by architectural mechanisms (ie system registers), but its type might be specified in the PPTT. In this case, we should populate the type of the cache, rather than leave it undefined.

This fixes the issue where the cacheinfo driver will not populate sysfs for such caches, resulting in the information missing from utilities like lstopo and lscpu, thus degrading the user experience.

Fixes 2bd00bcd73e5 (ACPI/PPTT: Add Processor Properties Topology Table parsing)
---
 drivers/acpi/pptt.c | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)
drivers/acpi/pptt.c +5 -16
index d1e26cb..38ac30e 100644
@@ -357,25 +357,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 				    struct acpi_pptt_cache *found_cache,
 				    struct acpi_pptt_processor *cpu_node)
 {
-	int valid_flags = 0;
-
 	this_leaf->fw_token = cpu_node;
-	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
 		this_leaf->size = found_cache->size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
+	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
 		this_leaf->coherency_line_size = found_cache->line_size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
+	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
 		this_leaf->number_of_sets = found_cache->number_of_sets;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
 		this_leaf->ways_of_associativity = found_cache->associativity;
-		valid_flags++;
-	}
 	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
 		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
 		case ACPI_PPTT_CACHE_POLICY_WT:
@@ -402,11 +392,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 		}
 	}
 	/*
-	 * If the above flags are valid, and the cache type is NOCACHE
-	 * update the cache type as well.
+	 * If cache type is NOCACHE, then the cache hasn't been specified

drivers/acpi/pptt.c static void update_cache_properties(struct cacheinfo *this_leaf, · line 409

Quoted 10 lines
drivers/acpi/pptt.c +7 -1
+	 * via other mechanisms.  Update the type if a cache type has been
+	 * provided.
+	 *
+	 * Note, we assume such caches are unified based on conventional system
+	 * design and known examples.  Significant work is required elsewhere to
+	 * fully support data/instruction only type caches which are only
+	 * specified in PPTT.
 	 */
 	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
-	    valid_flags == PPTT_CHECKED_ATTRIBUTES)

I don't think we use PPTT_CHECKED_ATTRIBUTES elsewhere. If so, can we drop that ?

Other than that:

--
Regards,
Sudeep

#8 lore raw

Re: [PATCH v3 2/2] ACPI/PPTT: Handle architecturally unknown cache types

Quoted 72 lines · Sudeep Holla
Quoted 57 lines · Jeffrey Hugo

The type of a cache might not be specified by architectural mechanisms (ie system registers), but its type might be specified in the PPTT. In this case, we should populate the type of the cache, rather than leave it undefined.

This fixes the issue where the cacheinfo driver will not populate sysfs for such caches, resulting in the information missing from utilities like lstopo and lscpu, thus degrading the user experience.

Fixes 2bd00bcd73e5 (ACPI/PPTT: Add Processor Properties Topology Table parsing)
---
  drivers/acpi/pptt.c | 30 +++++++++++++-----------------
  1 file changed, 13 insertions(+), 17 deletions(-)
drivers/acpi/pptt.c +5 -16
index d1e26cb..38ac30e 100644
@@ -357,25 +357,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
  				    struct acpi_pptt_cache *found_cache,
  				    struct acpi_pptt_processor *cpu_node)
  {
-	int valid_flags = 0;
-
  	this_leaf->fw_token = cpu_node;
-	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
  		this_leaf->size = found_cache->size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
+	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
  		this_leaf->coherency_line_size = found_cache->line_size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
+	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
  		this_leaf->number_of_sets = found_cache->number_of_sets;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
  		this_leaf->ways_of_associativity = found_cache->associativity;
-		valid_flags++;
-	}
  	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
  		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
  		case ACPI_PPTT_CACHE_POLICY_WT:
@@ -402,11 +392,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
  		}
  	}
  	/*
-	 * If the above flags are valid, and the cache type is NOCACHE
-	 * update the cache type as well.
+	 * If cache type is NOCACHE, then the cache hasn't been specified

drivers/acpi/pptt.c static void update_cache_properties(struct cacheinfo *this_leaf, · line 409

Quoted 10 lines
drivers/acpi/pptt.c +7 -1
+	 * via other mechanisms.  Update the type if a cache type has been
+	 * provided.
+	 *
+	 * Note, we assume such caches are unified based on conventional system
+	 * design and known examples.  Significant work is required elsewhere to
+	 * fully support data/instruction only type caches which are only
+	 * specified in PPTT.
  	 */
  	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
-	    valid_flags == PPTT_CHECKED_ATTRIBUTES)

I don't think we use PPTT_CHECKED_ATTRIBUTES elsewhere. If so, can we drop that ?

Quoted 2 lines

Other than that:

Whoops, you are right. For some reason I thought that came from the standard ACPICA definitions. Let me drop that.

Signature · 4 lines
Jeffrey Hugo
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.