Skip to content

Commit

Permalink
selftests/resctrl: Discover SNC kernel support and adjust messages
Browse files Browse the repository at this point in the history
Resctrl selftest prints a message on test failure that Sub-Numa
Clustering (SNC) could be enabled and points the user to check their BIOS
settings. No actual check is performed before printing that message so
it is not very accurate in pinpointing a problem.

When there is SNC support for kernel's resctrl subsystem and SNC is
enabled then sub node files are created for each node in the resctrlfs.
The sub node files exist in each regular node's L3 monitoring directory.
The reliable path to check for existence of sub node files is
/sys/fs/resctrl/mon_data/mon_L3_00/mon_sub_L3_00.

Add helper that checks for mon_sub_L3_00 existence.

Correct old messages to account for kernel support of SNC in
resctrl.

Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
  • Loading branch information
Maciej Wieczor-Retman authored and Shuah Khan committed Jan 15, 2025
1 parent a1cd99e commit d6d35d0
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 4 deletions.
4 changes: 2 additions & 2 deletions tools/testing/selftests/resctrl/cmt_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ static int cmt_run_test(const struct resctrl_test *test, const struct user_param
return ret;

ret = check_results(&param, span, n);
if (ret && (get_vendor() == ARCH_INTEL))
ksft_print_msg("Intel CMT may be inaccurate when Sub-NUMA Clustering is enabled. Check BIOS configuration.\n");
if (ret && (get_vendor() == ARCH_INTEL) && !snc_kernel_support())
ksft_print_msg("Kernel doesn't support Sub-NUMA Clustering but it is enabled on the system.\n");

return ret;
}
Expand Down
2 changes: 2 additions & 0 deletions tools/testing/selftests/resctrl/mba_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ static int mba_run_test(const struct resctrl_test *test, const struct user_param
return ret;

ret = check_results();
if (ret && (get_vendor() == ARCH_INTEL) && !snc_kernel_support())
ksft_print_msg("Kernel doesn't support Sub-NUMA Clustering but it is enabled on the system.\n");

return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions tools/testing/selftests/resctrl/mbm_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ static int mbm_run_test(const struct resctrl_test *test, const struct user_param
return ret;

ret = check_results(param.fill_buf ? param.fill_buf->buf_size : 0);
if (ret && (get_vendor() == ARCH_INTEL))
ksft_print_msg("Intel MBM may be inaccurate when Sub-NUMA Clustering is enabled. Check BIOS configuration.\n");
if (ret && (get_vendor() == ARCH_INTEL) && !snc_kernel_support())
ksft_print_msg("Kernel doesn't support Sub-NUMA Clustering but it is enabled on the system.\n");

return ret;
}
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/resctrl/resctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ void ctrlc_handler(int signum, siginfo_t *info, void *ptr);
int signal_handler_register(const struct resctrl_test *test);
void signal_handler_unregister(void);
unsigned int count_bits(unsigned long n);
int snc_kernel_support(void);

void perf_event_attr_initialize(struct perf_event_attr *pea, __u64 config);
void perf_event_initialize_read_format(struct perf_event_read *pe_read);
Expand Down
32 changes: 32 additions & 0 deletions tools/testing/selftests/resctrl/resctrlfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -957,3 +957,35 @@ unsigned int count_bits(unsigned long n)

return count;
}

/**
* snc_kernel_support - Check for existence of mon_sub_L3_00 file that indicates
* SNC resctrl support on the kernel side.
*
* Return: 0 if not supported, 1 if SNC is disabled or SNC discovery is
* unreliable or SNC is both enabled and supported.
*/
int snc_kernel_support(void)
{
char node_path[PATH_MAX];
struct stat statbuf;
int ret;

ret = snc_nodes_per_l3_cache();
/*
* If SNC is disabled then its kernel support isn't important. If SNC
* got disabled because the discovery process was unreliable the
* snc_unreliable variable was set. It can be used to verify the SNC
* discovery reliability elsewhere in the selftest.
*/
if (ret == 1)
return ret;

snprintf(node_path, sizeof(node_path), "%s/%s", RESCTRL_PATH,
"mon_data/mon_L3_00/mon_sub_L3_00");

if (!stat(node_path, &statbuf))
return 1;

return 0;
}

0 comments on commit d6d35d0

Please sign in to comment.