selftests/resctrl: Add a helper for the non-contiguous test
authorMaciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
Fri, 16 Feb 2024 08:35:15 +0000 (09:35 +0100)
committerShuah Khan <skhan@linuxfoundation.org>
Fri, 23 Feb 2024 22:19:09 +0000 (15:19 -0700)
The CAT non-contiguous selftests have to read the file responsible for
reporting support of non-contiguous CBMs in kernel (resctrl). Then the
test compares if that information matches what is reported by CPUID
output.

Add a generic helper function to read an unsigned number from
/sys/fs/resctrl/info/<RESOURCE>/<FILE>.

Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/testing/selftests/resctrl/resctrl.h
tools/testing/selftests/resctrl/resctrlfs.c

index a1462029998e5cf4e18fdcc19831099f041223f4..5116ea082d031458767e88e374397e588bcb7cdf 100644 (file)
@@ -162,6 +162,7 @@ unsigned int count_contiguous_bits(unsigned long val, unsigned int *start);
 int get_full_cbm(const char *cache_type, unsigned long *mask);
 int get_mask_no_shareable(const char *cache_type, unsigned long *mask);
 int get_cache_size(int cpu_no, const char *cache_type, unsigned long *cache_size);
+int resource_info_unsigned_get(const char *resource, const char *filename, unsigned int *val);
 void ctrlc_handler(int signum, siginfo_t *info, void *ptr);
 int signal_handler_register(void);
 void signal_handler_unregister(void);
index 5750662cce574a9bf4aac41169271dcb5b9bbdff..8a183c73bc23927fa135d477cd35f0d4d64c4309 100644 (file)
@@ -249,6 +249,42 @@ static int get_bit_mask(const char *filename, unsigned long *mask)
        return 0;
 }
 
+/*
+ * resource_info_unsigned_get - Read an unsigned value from
+ * /sys/fs/resctrl/info/@resource/@filename
+ * @resource:  Resource name that matches directory name in
+ *             /sys/fs/resctrl/info
+ * @filename:  File in /sys/fs/resctrl/info/@resource
+ * @val:       Contains read value on success.
+ *
+ * Return: = 0 on success, < 0 on failure. On success the read
+ * value is saved into @val.
+ */
+int resource_info_unsigned_get(const char *resource, const char *filename,
+                              unsigned int *val)
+{
+       char file_path[PATH_MAX];
+       FILE *fp;
+
+       snprintf(file_path, sizeof(file_path), "%s/%s/%s", INFO_PATH, resource,
+                filename);
+
+       fp = fopen(file_path, "r");
+       if (!fp) {
+               ksft_print_msg("Error opening %s: %m\n", file_path);
+               return -1;
+       }
+
+       if (fscanf(fp, "%u", val) <= 0) {
+               ksft_print_msg("Could not get contents of %s: %m\n", file_path);
+               fclose(fp);
+               return -1;
+       }
+
+       fclose(fp);
+       return 0;
+}
+
 /*
  * create_bit_mask- Create bit mask from start, len pair
  * @start:     LSB of the mask