From: Babu Moger <[email protected]>

The test detects the number of memory controllers by scanning the perf
sysfs (DYN_PMU_PATH) for the vendor specific memory controller PMU name.
On Intel this PMU is named "uncore_imc_<n>".

Detect the vendor and select the memory controller PMU name accordingly
so that the rest of the code stays generic and can be extended to other
vendors. Bail out on vendors that are not yet supported.

While at it, match against the full "uncore_imc_" string and use
strlen() instead of sizeof() to advance past the prefix. This is clearer
than relying on sizeof() counting the terminating NULL to make up for the
trailing underscore.

Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Babu Moger <[email protected]>
Co-developed-by: Swapnil Sapkal <[email protected]>
Signed-off-by: Swapnil Sapkal <[email protected]>
---

v3->v4:
    - Reworded the subject and changelog (Reinette)
    - Dropped the local vendor variable and call get_vendor() directly 
(Reinette)

 tools/testing/selftests/resctrl/resctrl_val.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_val.c 
b/tools/testing/selftests/resctrl/resctrl_val.c
index bd413d2d5420..c6089c42aa7e 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -10,7 +10,7 @@
  */
 #include "resctrl.h"
 
-#define UNCORE_IMC             "uncore_imc"
+#define UNCORE_IMC             "uncore_imc_"
 #define READ_FILE_NAME         "cas_count_read"
 #define DYN_PMU_PATH           "/sys/bus/event_source/devices"
 #define SCALE                  0.00006103515625
@@ -238,24 +238,29 @@ static int num_of_mem_controllers(void)
        char mc_dir[512], *temp;
        unsigned int count = 0;
        struct dirent *ep;
+       char *sysfs_name;
        int ret;
        DIR *dp;
 
+       if (get_vendor() == ARCH_INTEL) {
+               sysfs_name = UNCORE_IMC;
+       } else {
+               ksft_print_msg("Unsupported vendor\n");
+               return -1;
+       }
+
        dp = opendir(DYN_PMU_PATH);
        if (dp) {
                while ((ep = readdir(dp))) {
-                       temp = strstr(ep->d_name, UNCORE_IMC);
+                       temp = strstr(ep->d_name, sysfs_name);
                        if (!temp)
                                continue;
 
                        /*
                         * mc counters are named as "uncore_imc_<n>", hence
-                        * increment the pointer to point to <n>. Note that
-                        * sizeof(UNCORE_IMC) would count for null character as
-                        * well and hence the last underscore character in
-                        * uncore_imc'_' need not be counted.
+                        * increment the pointer to point to <n>.
                         */
-                       temp = temp + sizeof(UNCORE_IMC);
+                       temp = temp + strlen(sysfs_name);
 
                        /*
                         * Some directories under "DYN_PMU_PATH" could have
-- 
2.43.0


Reply via email to