selftests/resctrl: Add a helper for the non-contiguous test

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>
This commit is contained in:
Maciej Wieczor-Retman 2024-02-16 09:35:15 +01:00 committed by Shuah Khan
parent 5339792bd6
commit e331ac141f
2 changed files with 37 additions and 0 deletions

View 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);

View 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