linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
@ 2020-11-30 20:19 Fenghua Yu
  2020-11-30 20:19 ` [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables Fenghua Yu
                   ` (20 more replies)
  0 siblings, 21 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

This patch set has several miscellaneous fixes to resctrl selftest tool
that are easily visible to user. V1 had fixes to CAT test and CMT test
but they were dropped in V2 because having them here made the patchset
humongous. So, changes to CAT test and CMT test will be posted in another
patchset.

Change Log:
v4:
- Address various comments from Shuah Khan:
  1. Combine a few patches e.g. a couple of fixing typos patches into one
     and a couple of unmounting patches into one etc.
  2. Add config file.
  3. Remove "Fixes" tags.
  4. Change strcmp() to strncmp().
  5. Move the global variable fixing patch to the patch 1 so that the
     compilation issue is fixed first.

Please note:
- I didn't move the patch of renaming CQM to CMT to the end of the series
  because code and commit messages in a few other patches depend on the
  new term of "CMT". If move the renaming patch to the end, the previous
  patches use the old "CQM" term and code which will be changed soon at
  the end of series and will cause more code and explanations.
[v3: https://lkml.org/lkml/2020/10/28/137]

v3:
Address various comments (commit messages, return value on test failure,
print failure info on test failure etc) from Reinette and Tony.
[v2: https://lore.kernel.org/linux-kselftest/cover.1589835155.git.sai.praneeth.prakhya@intel.com/]

v2:
1. Dropped changes to CAT test and CMT test as they will be posted in a later
   series.
2. Added several other fixes
[v1: https://lore.kernel.org/linux-kselftest/cover.1583657204.git.sai.praneeth.prakhya@intel.com/]

Fenghua Yu (15):
  selftests/resctrl: Fix compilation issues for global variables
  selftests/resctrl: Clean up resctrl features check
  selftests/resctrl: Rename CQM test as CMT test
  selftests/resctrl: Add a few dependencies
  selftests/resctrl: Check for resctrl mount point only if resctrl FS is
    supported
  selftests/resctrl: Use resctrl/info for feature detection
  selftests/resctrl: Fix missing options "-n" and "-p"
  selftests/resctrl: Fix MBA/MBM results reporting format
  selftests/resctrl: Enable gcc checks to detect buffer overflows
  selftests/resctrl: Don't hard code value of "no_of_bits" variable
  selftests/resctrl: Modularize resctrl test suite main() function
  selftests/resctrl: Skip the test if requested resctrl feature is not
    supported
  selftests/resctrl: Fix unmount resctrl FS
  selftests/resctrl: Fix incorrect parsing of iMC counters
  selftests/resctrl: Fix checking for < 0 for unsigned values

Reinette Chatre (2):
  selftests/resctrl: Fix printed messages
  selftests/resctrl: Ensure sibling CPU is not same as original CPU

 tools/testing/selftests/resctrl/Makefile      |   2 +-
 tools/testing/selftests/resctrl/README        |   4 +-
 tools/testing/selftests/resctrl/cache.c       |  10 +-
 tools/testing/selftests/resctrl/cat_test.c    |  22 +--
 .../resctrl/{cqm_test.c => cmt_test.c}        |  33 ++--
 tools/testing/selftests/resctrl/config        |   2 +
 tools/testing/selftests/resctrl/fill_buf.c    |   4 +-
 tools/testing/selftests/resctrl/mba_test.c    |  25 ++-
 tools/testing/selftests/resctrl/mbm_test.c    |  18 +-
 tools/testing/selftests/resctrl/resctrl.h     |  45 ++++-
 .../testing/selftests/resctrl/resctrl_tests.c | 162 ++++++++++++------
 tools/testing/selftests/resctrl/resctrl_val.c |  88 ++++++----
 tools/testing/selftests/resctrl/resctrlfs.c   |  85 ++++++---
 13 files changed, 318 insertions(+), 182 deletions(-)
 rename tools/testing/selftests/resctrl/{cqm_test.c => cmt_test.c} (85%)
 create mode 100644 tools/testing/selftests/resctrl/config

-- 
2.29.2


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2021-01-26  1:22   ` Shuah Khan
  2020-11-30 20:19 ` [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check Fenghua Yu
                   ` (19 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Reinette reported following compilation issue on Fedora 32, gcc version
10.1.1

/usr/bin/ld: cqm_test.o:<src_dir>/cqm_test.c:22: multiple definition of
`cache_size'; cat_test.o:<src_dir>/cat_test.c:23: first defined here

The same issue is reported for long_mask, cbm_mask, count_of_bits etc
variables as well. Compiler isn't happy because these variables are
defined globally in two .c files namely cqm_test.c and cat_test.c and
the compiler during compilation finds that the variable is already
defined (multiple definition error).

Taking a closer look at the usage of these variables reveals that these
variables are used only locally to functions such as cqm_resctrl_val()
(defined in cqm_test.c) and cat_perf_miss_val() (defined in cat_test.c).
These variables are not shared between those functions. So, there is no
need for these variables to be global. Hence, fix this issue by making
them local variables to the functions where they are used.

To fix issues for other global variables (e.g: bm_pid, ppid, llc_occup_path
and is_amd) that are used across .c files, declare them as extern.

Reported-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/cat_test.c  | 12 ++++--------
 tools/testing/selftests/resctrl/cqm_test.c  | 11 ++++-------
 tools/testing/selftests/resctrl/resctrl.h   | 10 +++++-----
 tools/testing/selftests/resctrl/resctrlfs.c | 10 +++++-----
 4 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
index 5da43767b973..7f723bd8f328 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -17,11 +17,6 @@
 #define MAX_DIFF_PERCENT	4
 #define MAX_DIFF		1000000
 
-int count_of_bits;
-char cbm_mask[256];
-unsigned long long_mask;
-unsigned long cache_size;
-
 /*
  * Change schemata. Write schemata to specified
  * con_mon grp, mon_grp in resctrl FS.
@@ -121,8 +116,9 @@ void cat_test_cleanup(void)
 
 int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 {
-	unsigned long l_mask, l_mask_1;
-	int ret, pipefd[2], sibling_cpu_no;
+	unsigned long l_mask, l_mask_1, long_mask, cache_size;
+	int ret, pipefd[2], sibling_cpu_no, count_of_bits;
+	char cbm_mask[256];
 	char pipe_message;
 	pid_t bm_pid;
 
@@ -136,7 +132,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 		return -1;
 
 	/* Get default cbm mask for L3/L2 cache */
-	ret = get_cbm_mask(cache_type);
+	ret = get_cbm_mask(cache_type, cbm_mask);
 	if (ret)
 		return ret;
 
diff --git a/tools/testing/selftests/resctrl/cqm_test.c b/tools/testing/selftests/resctrl/cqm_test.c
index c8756152bd61..b6af940ccfc2 100644
--- a/tools/testing/selftests/resctrl/cqm_test.c
+++ b/tools/testing/selftests/resctrl/cqm_test.c
@@ -16,11 +16,6 @@
 #define MAX_DIFF		2000000
 #define MAX_DIFF_PERCENT	15
 
-int count_of_bits;
-char cbm_mask[256];
-unsigned long long_mask;
-unsigned long cache_size;
-
 static int cqm_setup(int num, ...)
 {
 	struct resctrl_val_param *p;
@@ -113,7 +108,9 @@ void cqm_test_cleanup(void)
 
 int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 {
-	int ret, mum_resctrlfs;
+	int ret, mum_resctrlfs, count_of_bits;
+	unsigned long long_mask, cache_size;
+	char cbm_mask[256];
 
 	cache_size = 0;
 	mum_resctrlfs = 1;
@@ -125,7 +122,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 	if (!validate_resctrl_feature_request("cqm"))
 		return -1;
 
-	ret = get_cbm_mask("L3");
+	ret = get_cbm_mask("L3", cbm_mask);
 	if (ret)
 		return ret;
 
diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index 39bf59c6b9c5..12b77182cb44 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -62,11 +62,11 @@ struct resctrl_val_param {
 	int		(*setup)(int num, ...);
 };
 
-pid_t bm_pid, ppid;
-int tests_run;
+extern pid_t bm_pid, ppid;
+extern int tests_run;
 
-char llc_occup_path[1024];
-bool is_amd;
+extern char llc_occup_path[1024];
+extern bool is_amd;
 
 bool check_resctrlfs_support(void);
 int filter_dmesg(void);
@@ -92,7 +92,7 @@ void tests_cleanup(void);
 void mbm_test_cleanup(void);
 int mba_schemata_change(int cpu_no, char *bw_report, char **benchmark_cmd);
 void mba_test_cleanup(void);
-int get_cbm_mask(char *cache_type);
+int get_cbm_mask(char *cache_type, char *cbm_mask);
 int get_cache_size(int cpu_no, char *cache_type, unsigned long *cache_size);
 void ctrlc_handler(int signum, siginfo_t *info, void *ptr);
 int cat_val(struct resctrl_val_param *param);
diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index 19c0ec4045a4..2a16100c9c3f 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -49,8 +49,6 @@ static int find_resctrl_mount(char *buffer)
 	return -ENOENT;
 }
 
-char cbm_mask[256];
-
 /*
  * remount_resctrlfs - Remount resctrl FS at /sys/fs/resctrl
  * @mum_resctrlfs:	Should the resctrl FS be remounted?
@@ -205,16 +203,18 @@ int get_cache_size(int cpu_no, char *cache_type, unsigned long *cache_size)
 /*
  * get_cbm_mask - Get cbm mask for given cache
  * @cache_type:	Cache level L2/L3
- *
- * Mask is stored in cbm_mask which is global variable.
+ * @cbm_mask:	cbm_mask returned as a string
  *
  * Return: = 0 on success, < 0 on failure.
  */
-int get_cbm_mask(char *cache_type)
+int get_cbm_mask(char *cache_type, char *cbm_mask)
 {
 	char cbm_mask_path[1024];
 	FILE *fp;
 
+	if (!cbm_mask)
+		return -1;
+
 	sprintf(cbm_mask_path, "%s/%s/cbm_mask", CBM_MASK_PATH, cache_type);
 
 	fp = fopen(cbm_mask_path, "r");
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
  2020-11-30 20:19 ` [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2021-01-26  2:08   ` Shuah Khan
  2020-11-30 20:19 ` [PATCH v4 03/17] selftests/resctrl: Rename CQM test as CMT test Fenghua Yu
                   ` (18 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Checking resctrl features call strcmp() to compare feature strings
(e.g. "mba", "cat" etc). The checkings are error prone and don't have
good coding style. Define the constant strings in macros and call
strncmp() to solve the potential issues.

Suggested-by: Shuah Khan <shuah@kernel.org>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/cache.c       |  8 +++---
 tools/testing/selftests/resctrl/cat_test.c    |  2 +-
 tools/testing/selftests/resctrl/cqm_test.c    |  2 +-
 tools/testing/selftests/resctrl/fill_buf.c    |  4 +--
 tools/testing/selftests/resctrl/mba_test.c    |  2 +-
 tools/testing/selftests/resctrl/mbm_test.c    |  2 +-
 tools/testing/selftests/resctrl/resctrl.h     | 25 +++++++++++++++++++
 .../testing/selftests/resctrl/resctrl_tests.c | 12 ++++-----
 tools/testing/selftests/resctrl/resctrl_val.c | 19 ++++++--------
 tools/testing/selftests/resctrl/resctrlfs.c   | 14 +++++------
 10 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cache.c b/tools/testing/selftests/resctrl/cache.c
index 38dbf4962e33..248bf000c978 100644
--- a/tools/testing/selftests/resctrl/cache.c
+++ b/tools/testing/selftests/resctrl/cache.c
@@ -182,7 +182,7 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
 	/*
 	 * Measure cache miss from perf.
 	 */
-	if (!strcmp(param->resctrl_val, "cat")) {
+	if (is_cat(param->resctrl_val)) {
 		ret = get_llc_perf(&llc_perf_miss);
 		if (ret < 0)
 			return ret;
@@ -192,7 +192,7 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
 	/*
 	 * Measure llc occupancy from resctrl.
 	 */
-	if (!strcmp(param->resctrl_val, "cqm")) {
+	if (is_cqm(param->resctrl_val)) {
 		ret = get_llc_occu_resctrl(&llc_occu_resc);
 		if (ret < 0)
 			return ret;
@@ -234,7 +234,7 @@ int cat_val(struct resctrl_val_param *param)
 	if (ret)
 		return ret;
 
-	if ((strcmp(resctrl_val, "cat") == 0)) {
+	if (is_cat(resctrl_val)) {
 		ret = initialize_llc_perf();
 		if (ret)
 			return ret;
@@ -242,7 +242,7 @@ int cat_val(struct resctrl_val_param *param)
 
 	/* Test runs until the callback setup() tells the test to stop. */
 	while (1) {
-		if (strcmp(resctrl_val, "cat") == 0) {
+		if (is_cat(resctrl_val)) {
 			ret = param->setup(1, param);
 			if (ret) {
 				ret = 0;
diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
index 7f723bd8f328..6d9a41f3939a 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -160,7 +160,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 		return -1;
 
 	struct resctrl_val_param param = {
-		.resctrl_val	= "cat",
+		.resctrl_val	= CAT_STR,
 		.cpu_no		= cpu_no,
 		.mum_resctrlfs	= 0,
 		.setup		= cat_setup,
diff --git a/tools/testing/selftests/resctrl/cqm_test.c b/tools/testing/selftests/resctrl/cqm_test.c
index b6af940ccfc2..6635b24a74cc 100644
--- a/tools/testing/selftests/resctrl/cqm_test.c
+++ b/tools/testing/selftests/resctrl/cqm_test.c
@@ -142,7 +142,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 	}
 
 	struct resctrl_val_param param = {
-		.resctrl_val	= "cqm",
+		.resctrl_val	= CQM_STR,
 		.ctrlgrp	= "c1",
 		.mongrp		= "m1",
 		.cpu_no		= cpu_no,
diff --git a/tools/testing/selftests/resctrl/fill_buf.c b/tools/testing/selftests/resctrl/fill_buf.c
index 79c611c99a3d..bece8bb4b575 100644
--- a/tools/testing/selftests/resctrl/fill_buf.c
+++ b/tools/testing/selftests/resctrl/fill_buf.c
@@ -115,7 +115,7 @@ static int fill_cache_read(unsigned char *start_ptr, unsigned char *end_ptr,
 
 	while (1) {
 		ret = fill_one_span_read(start_ptr, end_ptr);
-		if (!strcmp(resctrl_val, "cat"))
+		if (is_cat(resctrl_val))
 			break;
 	}
 
@@ -134,7 +134,7 @@ static int fill_cache_write(unsigned char *start_ptr, unsigned char *end_ptr,
 {
 	while (1) {
 		fill_one_span_write(start_ptr, end_ptr);
-		if (!strcmp(resctrl_val, "cat"))
+		if (is_cat(resctrl_val))
 			break;
 	}
 
diff --git a/tools/testing/selftests/resctrl/mba_test.c b/tools/testing/selftests/resctrl/mba_test.c
index 7bf8eaa6204b..6449fbd96096 100644
--- a/tools/testing/selftests/resctrl/mba_test.c
+++ b/tools/testing/selftests/resctrl/mba_test.c
@@ -141,7 +141,7 @@ void mba_test_cleanup(void)
 int mba_schemata_change(int cpu_no, char *bw_report, char **benchmark_cmd)
 {
 	struct resctrl_val_param param = {
-		.resctrl_val	= "mba",
+		.resctrl_val	= MBA_STR,
 		.ctrlgrp	= "c1",
 		.mongrp		= "m1",
 		.cpu_no		= cpu_no,
diff --git a/tools/testing/selftests/resctrl/mbm_test.c b/tools/testing/selftests/resctrl/mbm_test.c
index 4700f7453f81..ec6cfe01c9c2 100644
--- a/tools/testing/selftests/resctrl/mbm_test.c
+++ b/tools/testing/selftests/resctrl/mbm_test.c
@@ -114,7 +114,7 @@ void mbm_test_cleanup(void)
 int mbm_bw_change(int span, int cpu_no, char *bw_report, char **benchmark_cmd)
 {
 	struct resctrl_val_param param = {
-		.resctrl_val	= "mbm",
+		.resctrl_val	= MBM_STR,
 		.ctrlgrp	= "c1",
 		.mongrp		= "m1",
 		.span		= span,
diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index 12b77182cb44..bfbc16b39a9e 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -62,6 +62,31 @@ struct resctrl_val_param {
 	int		(*setup)(int num, ...);
 };
 
+#define MBM_STR			"mbm"
+#define MBA_STR			"mba"
+#define CQM_STR			"cqm"
+#define CAT_STR			"cat"
+
+static inline bool is_mbm(const char *str)
+{
+	return !strncmp(str, MBM_STR, 3);
+}
+
+static inline bool is_mba(const char *str)
+{
+	return !strncmp(str, MBA_STR, 3);
+}
+
+static inline bool is_cqm(const char *str)
+{
+	return !strncmp(str, CQM_STR, 3);
+}
+
+static inline bool is_cat(const char *str)
+{
+	return !strncmp(str, CAT_STR, 3);
+}
+
 extern pid_t bm_pid, ppid;
 extern int tests_run;
 
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 425cc85ac883..f425eaf8c331 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -85,13 +85,13 @@ int main(int argc, char **argv)
 			cqm_test = false;
 			cat_test = false;
 			while (token) {
-				if (!strcmp(token, "mbm")) {
+				if (is_mbm(token)) {
 					mbm_test = true;
-				} else if (!strcmp(token, "mba")) {
+				} else if (is_mba(token)) {
 					mba_test = true;
-				} else if (!strcmp(token, "cqm")) {
+				} else if (is_cqm(token)) {
 					cqm_test = true;
-				} else if (!strcmp(token, "cat")) {
+				} else if (is_cat(token)) {
 					cat_test = true;
 				} else {
 					printf("invalid argument\n");
@@ -161,7 +161,7 @@ int main(int argc, char **argv)
 	if (!is_amd && mbm_test) {
 		printf("# Starting MBM BW change ...\n");
 		if (!has_ben)
-			sprintf(benchmark_cmd[5], "%s", "mba");
+			sprintf(benchmark_cmd[5], "%s", MBA_STR);
 		res = mbm_bw_change(span, cpu_no, bw_report, benchmark_cmd);
 		printf("%sok MBM: bw change\n", res ? "not " : "");
 		mbm_test_cleanup();
@@ -181,7 +181,7 @@ int main(int argc, char **argv)
 	if (cqm_test) {
 		printf("# Starting CQM test ...\n");
 		if (!has_ben)
-			sprintf(benchmark_cmd[5], "%s", "cqm");
+			sprintf(benchmark_cmd[5], "%s", CQM_STR);
 		res = cqm_resctrl_val(cpu_no, no_of_bits, benchmark_cmd);
 		printf("%sok CQM: test\n", res ? "not " : "");
 		cqm_test_cleanup();
diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index 520fea3606d1..f55e04a30a77 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -397,10 +397,10 @@ static void initialize_mem_bw_resctrl(const char *ctrlgrp, const char *mongrp,
 		return;
 	}
 
-	if (strcmp(resctrl_val, "mbm") == 0)
+	if (is_mbm(resctrl_val))
 		set_mbm_path(ctrlgrp, mongrp, resource_id);
 
-	if ((strcmp(resctrl_val, "mba") == 0)) {
+	if (is_mba(resctrl_val)) {
 		if (ctrlgrp)
 			sprintf(mbm_total_path, CON_MBM_LOCAL_BYTES_PATH,
 				RESCTRL_PATH, ctrlgrp, resource_id);
@@ -524,7 +524,7 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
 		return;
 	}
 
-	if (strcmp(resctrl_val, "cqm") == 0)
+	if (is_cqm(resctrl_val))
 		set_cqm_path(ctrlgrp, mongrp, resource_id);
 }
 
@@ -579,8 +579,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 	if (strcmp(param->filename, "") == 0)
 		sprintf(param->filename, "stdio");
 
-	if ((strcmp(resctrl_val, "mba")) == 0 ||
-	    (strcmp(resctrl_val, "mbm")) == 0) {
+	if (is_mba(resctrl_val) || is_mbm(resctrl_val)) {
 		ret = validate_bw_report_request(param->bw_report);
 		if (ret)
 			return ret;
@@ -674,15 +673,14 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 	if (ret)
 		goto out;
 
-	if ((strcmp(resctrl_val, "mbm") == 0) ||
-	    (strcmp(resctrl_val, "mba") == 0)) {
+	if (is_mbm(resctrl_val) || is_mba(resctrl_val)) {
 		ret = initialize_mem_bw_imc();
 		if (ret)
 			goto out;
 
 		initialize_mem_bw_resctrl(param->ctrlgrp, param->mongrp,
 					  param->cpu_no, resctrl_val);
-	} else if (strcmp(resctrl_val, "cqm") == 0)
+	} else if (is_cqm(resctrl_val))
 		initialize_llc_occu_resctrl(param->ctrlgrp, param->mongrp,
 					    param->cpu_no, resctrl_val);
 
@@ -710,8 +708,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 
 	/* Test runs until the callback setup() tells the test to stop. */
 	while (1) {
-		if ((strcmp(resctrl_val, "mbm") == 0) ||
-		    (strcmp(resctrl_val, "mba") == 0)) {
+		if (is_mbm(resctrl_val) || is_mba(resctrl_val)) {
 			ret = param->setup(1, param);
 			if (ret) {
 				ret = 0;
@@ -721,7 +718,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 			ret = measure_vals(param, &bw_resc_start);
 			if (ret)
 				break;
-		} else if (strcmp(resctrl_val, "cqm") == 0) {
+		} else if (is_cqm(resctrl_val)) {
 			ret = param->setup(1, param);
 			if (ret) {
 				ret = 0;
diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index 2a16100c9c3f..dc4f1286aefa 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -334,7 +334,7 @@ void run_benchmark(int signum, siginfo_t *info, void *ucontext)
 		operation = atoi(benchmark_cmd[4]);
 		sprintf(resctrl_val, "%s", benchmark_cmd[5]);
 
-		if (strcmp(resctrl_val, "cqm") != 0)
+		if (!is_cqm(resctrl_val))
 			buffer_span = span * MB;
 		else
 			buffer_span = span;
@@ -459,8 +459,7 @@ int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
 		goto out;
 
 	/* Create mon grp and write pid into it for "mbm" and "cqm" test */
-	if ((strcmp(resctrl_val, "cqm") == 0) ||
-	    (strcmp(resctrl_val, "mbm") == 0)) {
+	if (is_cqm(resctrl_val) || is_mbm(resctrl_val)) {
 		if (strlen(mongrp)) {
 			sprintf(monitorgroup_p, "%s/mon_groups", controlgroup);
 			sprintf(monitorgroup, "%s/%s", monitorgroup_p, mongrp);
@@ -505,9 +504,8 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
 	int resource_id, ret = 0;
 	FILE *fp;
 
-	if ((strcmp(resctrl_val, "mba") != 0) &&
-	    (strcmp(resctrl_val, "cat") != 0) &&
-	    (strcmp(resctrl_val, "cqm") != 0))
+	if (!is_mba(resctrl_val) && !is_cat(resctrl_val) &&
+	    !is_cqm(resctrl_val))
 		return -ENOENT;
 
 	if (!schemata) {
@@ -528,9 +526,9 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
 	else
 		sprintf(controlgroup, "%s/schemata", RESCTRL_PATH);
 
-	if (!strcmp(resctrl_val, "cat") || !strcmp(resctrl_val, "cqm"))
+	if (is_cat(resctrl_val) || is_cqm(resctrl_val))
 		sprintf(schema, "%s%d%c%s", "L3:", resource_id, '=', schemata);
-	if (strcmp(resctrl_val, "mba") == 0)
+	if (is_mba(resctrl_val))
 		sprintf(schema, "%s%d%c%s", "MB:", resource_id, '=', schemata);
 
 	fp = fopen(controlgroup, "w");
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 03/17] selftests/resctrl: Rename CQM test as CMT test
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
  2020-11-30 20:19 ` [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables Fenghua Yu
  2020-11-30 20:19 ` [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2020-11-30 20:19 ` [PATCH v4 04/17] selftests/resctrl: Fix printed messages Fenghua Yu
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

CMT (Cache Monitoring Technology) [1] is a H/W feature that reports cache
occupancy of a process. resctrl selftest suite has a unit test to test CMT
for LLC but the test is named as CQM (Cache Quality Monitoring).
Furthermore, the unit test source file is named as cqm_test.c and several
functions, variables, comments, preprocessors and statements widely use
"cqm" as either suffix or prefix. This rampant misusage of CQM for CMT
might confuse someone who is newly looking at resctrl selftests because
this feature is named CMT in the Intel Software Developer's Manual.

Hence, rename all the occurrences (unit test source file name, functions,
variables, comments and preprocessors) of cqm with cmt.

[1] Please see Intel SDM, Volume 3, chapter 17 and section 18 for more
    information on CMT: https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/README        |  4 +--
 tools/testing/selftests/resctrl/cache.c       |  4 +--
 .../resctrl/{cqm_test.c => cmt_test.c}        | 20 +++++++-------
 tools/testing/selftests/resctrl/resctrl.h     | 10 +++----
 .../testing/selftests/resctrl/resctrl_tests.c | 26 +++++++++----------
 tools/testing/selftests/resctrl/resctrl_val.c | 12 ++++-----
 tools/testing/selftests/resctrl/resctrlfs.c   | 10 +++----
 7 files changed, 43 insertions(+), 43 deletions(-)
 rename tools/testing/selftests/resctrl/{cqm_test.c => cmt_test.c} (89%)

diff --git a/tools/testing/selftests/resctrl/README b/tools/testing/selftests/resctrl/README
index 6e5a0ffa18e8..4b36b25b6ac0 100644
--- a/tools/testing/selftests/resctrl/README
+++ b/tools/testing/selftests/resctrl/README
@@ -46,8 +46,8 @@ ARGUMENTS
 Parameter '-h' shows usage information.
 
 usage: resctrl_tests [-h] [-b "benchmark_cmd [options]"] [-t test list] [-n no_of_bits]
-        -b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CQM default benchmark is builtin fill_buf
-        -t test list: run tests specified in the test list, e.g. -t mbm, mba, cqm, cat
+        -b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT default benchmark is builtin fill_buf
+        -t test list: run tests specified in the test list, e.g. -t mbm, mba, cmt, cat
         -n no_of_bits: run cache tests using specified no of bits in cache bit mask
         -p cpu_no: specify CPU number to run the test. 1 is default
         -h: help
diff --git a/tools/testing/selftests/resctrl/cache.c b/tools/testing/selftests/resctrl/cache.c
index 248bf000c978..4366a12ada11 100644
--- a/tools/testing/selftests/resctrl/cache.c
+++ b/tools/testing/selftests/resctrl/cache.c
@@ -111,7 +111,7 @@ static int get_llc_perf(unsigned long *llc_perf_miss)
 
 /*
  * Get LLC Occupancy as reported by RESCTRL FS
- * For CQM,
+ * For CMT,
  * 1. If con_mon grp and mon grp given, then read from mon grp in
  * con_mon grp
  * 2. If only con_mon grp given, then read from con_mon grp
@@ -192,7 +192,7 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
 	/*
 	 * Measure llc occupancy from resctrl.
 	 */
-	if (is_cqm(param->resctrl_val)) {
+	if (is_cmt(param->resctrl_val)) {
 		ret = get_llc_occu_resctrl(&llc_occu_resc);
 		if (ret < 0)
 			return ret;
diff --git a/tools/testing/selftests/resctrl/cqm_test.c b/tools/testing/selftests/resctrl/cmt_test.c
similarity index 89%
rename from tools/testing/selftests/resctrl/cqm_test.c
rename to tools/testing/selftests/resctrl/cmt_test.c
index 6635b24a74cc..05a180d85e93 100644
--- a/tools/testing/selftests/resctrl/cqm_test.c
+++ b/tools/testing/selftests/resctrl/cmt_test.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Cache Monitoring Technology (CQM) test
+ * Cache Monitoring Technology (CMT) test
  *
  * Copyright (C) 2018 Intel Corporation
  *
@@ -11,12 +11,12 @@
 #include "resctrl.h"
 #include <unistd.h>
 
-#define RESULT_FILE_NAME	"result_cqm"
+#define RESULT_FILE_NAME	"result_cmt"
 #define NUM_OF_RUNS		5
 #define MAX_DIFF		2000000
 #define MAX_DIFF_PERCENT	15
 
-static int cqm_setup(int num, ...)
+static int cmt_setup(int num, ...)
 {
 	struct resctrl_val_param *p;
 	va_list param;
@@ -53,7 +53,7 @@ static void show_cache_info(unsigned long sum_llc_occu_resc, int no_of_bits,
 	else
 		res = false;
 
-	printf("%sok CQM: diff within %d, %d\%%\n", res ? "" : "not",
+	printf("%sok CMT: diff within %d, %d\%%\n", res ? "" : "not",
 	       MAX_DIFF, (int)MAX_DIFF_PERCENT);
 
 	printf("# diff: %ld\n", avg_diff);
@@ -101,12 +101,12 @@ static int check_results(struct resctrl_val_param *param, int no_of_bits)
 	return 0;
 }
 
-void cqm_test_cleanup(void)
+void cmt_test_cleanup(void)
 {
 	remove(RESULT_FILE_NAME);
 }
 
-int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
+int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 {
 	int ret, mum_resctrlfs, count_of_bits;
 	unsigned long long_mask, cache_size;
@@ -119,7 +119,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 	if (ret)
 		return ret;
 
-	if (!validate_resctrl_feature_request("cqm"))
+	if (!validate_resctrl_feature_request("cmt"))
 		return -1;
 
 	ret = get_cbm_mask("L3", cbm_mask);
@@ -142,7 +142,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 	}
 
 	struct resctrl_val_param param = {
-		.resctrl_val	= CQM_STR,
+		.resctrl_val	= CMT_STR,
 		.ctrlgrp	= "c1",
 		.mongrp		= "m1",
 		.cpu_no		= cpu_no,
@@ -151,7 +151,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 		.mask		= ~(long_mask << n) & long_mask,
 		.span		= cache_size * n / count_of_bits,
 		.num_of_runs	= 0,
-		.setup		= cqm_setup,
+		.setup		= cmt_setup,
 	};
 
 	if (strcmp(benchmark_cmd[0], "fill_buf") == 0)
@@ -167,7 +167,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
 	if (ret)
 		return ret;
 
-	cqm_test_cleanup();
+	cmt_test_cleanup();
 
 	return 0;
 }
diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index bfbc16b39a9e..e99e62fddc61 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -64,7 +64,7 @@ struct resctrl_val_param {
 
 #define MBM_STR			"mbm"
 #define MBA_STR			"mba"
-#define CQM_STR			"cqm"
+#define CMT_STR			"cmt"
 #define CAT_STR			"cat"
 
 static inline bool is_mbm(const char *str)
@@ -77,9 +77,9 @@ static inline bool is_mba(const char *str)
 	return !strncmp(str, MBA_STR, 3);
 }
 
-static inline bool is_cqm(const char *str)
+static inline bool is_cmt(const char *str)
 {
-	return !strncmp(str, CQM_STR, 3);
+	return !strncmp(str, CMT_STR, 3);
 }
 
 static inline bool is_cat(const char *str)
@@ -123,9 +123,9 @@ void ctrlc_handler(int signum, siginfo_t *info, void *ptr);
 int cat_val(struct resctrl_val_param *param);
 void cat_test_cleanup(void);
 int cat_perf_miss_val(int cpu_no, int no_of_bits, char *cache_type);
-int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd);
+int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd);
 unsigned int count_bits(unsigned long n);
-void cqm_test_cleanup(void);
+void cmt_test_cleanup(void);
 int get_core_sibling(int cpu_no);
 int measure_cache_vals(struct resctrl_val_param *param, int bm_pid);
 
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index f425eaf8c331..2dceff59e245 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -37,10 +37,10 @@ void detect_amd(void)
 static void cmd_help(void)
 {
 	printf("usage: resctrl_tests [-h] [-b \"benchmark_cmd [options]\"] [-t test list] [-n no_of_bits]\n");
-	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CQM");
+	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT");
 	printf("\t default benchmark is builtin fill_buf\n");
 	printf("\t-t test list: run tests specified in the test list, ");
-	printf("e.g. -t mbm, mba, cqm, cat\n");
+	printf("e.g. -t mbm, mba, cmt, cat\n");
 	printf("\t-n no_of_bits: run cache tests using specified no of bits in cache bit mask\n");
 	printf("\t-p cpu_no: specify CPU number to run the test. 1 is default\n");
 	printf("\t-h: help\n");
@@ -50,13 +50,13 @@ void tests_cleanup(void)
 {
 	mbm_test_cleanup();
 	mba_test_cleanup();
-	cqm_test_cleanup();
+	cmt_test_cleanup();
 	cat_test_cleanup();
 }
 
 int main(int argc, char **argv)
 {
-	bool has_ben = false, mbm_test = true, mba_test = true, cqm_test = true;
+	bool has_ben = false, mbm_test = true, mba_test = true, cmt_test = true;
 	int res, c, cpu_no = 1, span = 250, argc_new = argc, i, no_of_bits = 5;
 	char *benchmark_cmd[BENCHMARK_ARGS], bw_report[64], bm_type[64];
 	char benchmark_cmd_area[BENCHMARK_ARGS][BENCHMARK_ARG_SIZE];
@@ -82,15 +82,15 @@ int main(int argc, char **argv)
 
 			mbm_test = false;
 			mba_test = false;
-			cqm_test = false;
+			cmt_test = false;
 			cat_test = false;
 			while (token) {
 				if (is_mbm(token)) {
 					mbm_test = true;
 				} else if (is_mba(token)) {
 					mba_test = true;
-				} else if (is_cqm(token)) {
-					cqm_test = true;
+				} else if (is_cmt(token)) {
+					cmt_test = true;
 				} else if (is_cat(token)) {
 					cat_test = true;
 				} else {
@@ -178,13 +178,13 @@ int main(int argc, char **argv)
 		tests_run++;
 	}
 
-	if (cqm_test) {
-		printf("# Starting CQM test ...\n");
+	if (cmt_test) {
+		printf("# Starting CMT test ...\n");
 		if (!has_ben)
-			sprintf(benchmark_cmd[5], "%s", CQM_STR);
-		res = cqm_resctrl_val(cpu_no, no_of_bits, benchmark_cmd);
-		printf("%sok CQM: test\n", res ? "not " : "");
-		cqm_test_cleanup();
+			sprintf(benchmark_cmd[5], "%s", "cmt");
+		res = cmt_resctrl_val(cpu_no, no_of_bits, benchmark_cmd);
+		printf("%sok CMT: test\n", res ? "not " : "");
+		cmt_test_cleanup();
 		tests_run++;
 	}
 
diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index f55e04a30a77..5ff336f62f8f 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -492,7 +492,7 @@ static int print_results_bw(char *filename,  int bm_pid, float bw_imc,
 	return 0;
 }
 
-static void set_cqm_path(const char *ctrlgrp, const char *mongrp, char sock_num)
+static void set_cmt_path(const char *ctrlgrp, const char *mongrp, char sock_num)
 {
 	if (strlen(ctrlgrp) && strlen(mongrp))
 		sprintf(llc_occup_path,	CON_MON_LCC_OCCUP_PATH,	RESCTRL_PATH,
@@ -512,7 +512,7 @@ static void set_cqm_path(const char *ctrlgrp, const char *mongrp, char sock_num)
  * @ctrlgrp:			Name of the control monitor group (con_mon grp)
  * @mongrp:			Name of the monitor group (mon grp)
  * @cpu_no:			CPU number that the benchmark PID is binded to
- * @resctrl_val:		Resctrl feature (Eg: cat, cqm.. etc)
+ * @resctrl_val:		Resctrl feature (Eg: cat, cmt.. etc)
  */
 static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
 					int cpu_no, char *resctrl_val)
@@ -524,8 +524,8 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
 		return;
 	}
 
-	if (is_cqm(resctrl_val))
-		set_cqm_path(ctrlgrp, mongrp, resource_id);
+	if (is_cmt(resctrl_val))
+		set_cmt_path(ctrlgrp, mongrp, resource_id);
 }
 
 static int
@@ -680,7 +680,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 
 		initialize_mem_bw_resctrl(param->ctrlgrp, param->mongrp,
 					  param->cpu_no, resctrl_val);
-	} else if (is_cqm(resctrl_val))
+	} else if (is_cmt(resctrl_val))
 		initialize_llc_occu_resctrl(param->ctrlgrp, param->mongrp,
 					    param->cpu_no, resctrl_val);
 
@@ -718,7 +718,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
 			ret = measure_vals(param, &bw_resc_start);
 			if (ret)
 				break;
-		} else if (is_cqm(resctrl_val)) {
+		} else if (is_cmt(resctrl_val)) {
 			ret = param->setup(1, param);
 			if (ret) {
 				ret = 0;
diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index dc4f1286aefa..2c574d143ff0 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -334,7 +334,7 @@ void run_benchmark(int signum, siginfo_t *info, void *ucontext)
 		operation = atoi(benchmark_cmd[4]);
 		sprintf(resctrl_val, "%s", benchmark_cmd[5]);
 
-		if (!is_cqm(resctrl_val))
+		if (!is_cmt(resctrl_val))
 			buffer_span = span * MB;
 		else
 			buffer_span = span;
@@ -458,8 +458,8 @@ int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
 	if (ret)
 		goto out;
 
-	/* Create mon grp and write pid into it for "mbm" and "cqm" test */
-	if (is_cqm(resctrl_val) || is_mbm(resctrl_val)) {
+	/* Create mon grp and write pid into it for "mbm" and "cmt" test */
+	if (is_cmt(resctrl_val) || is_mbm(resctrl_val)) {
 		if (strlen(mongrp)) {
 			sprintf(monitorgroup_p, "%s/mon_groups", controlgroup);
 			sprintf(monitorgroup, "%s/%s", monitorgroup_p, mongrp);
@@ -505,7 +505,7 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
 	FILE *fp;
 
 	if (!is_mba(resctrl_val) && !is_cat(resctrl_val) &&
-	    !is_cqm(resctrl_val))
+	    !is_cmt(resctrl_val))
 		return -ENOENT;
 
 	if (!schemata) {
@@ -526,7 +526,7 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
 	else
 		sprintf(controlgroup, "%s/schemata", RESCTRL_PATH);
 
-	if (is_cat(resctrl_val) || is_cqm(resctrl_val))
+	if (is_cat(resctrl_val) || is_cmt(resctrl_val))
 		sprintf(schema, "%s%d%c%s", "L3:", resource_id, '=', schemata);
 	if (is_mba(resctrl_val))
 		sprintf(schema, "%s%d%c%s", "MB:", resource_id, '=', schemata);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 04/17] selftests/resctrl: Fix printed messages
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (2 preceding siblings ...)
  2020-11-30 20:19 ` [PATCH v4 03/17] selftests/resctrl: Rename CQM test as CMT test Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2021-01-26  2:25   ` Shuah Khan
  2020-11-30 20:19 ` [PATCH v4 05/17] selftests/resctrl: Add a few dependencies Fenghua Yu
                   ` (16 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

From: Reinette Chatre <reinette.chatre@intel.com>

Fix one instance where "not" (without a space) is printed on test
failure resulting in output of "notok" on test failure.

Add a missing newline to the printed help text to improve readability.

Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/cmt_test.c      | 2 +-
 tools/testing/selftests/resctrl/resctrl_tests.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cmt_test.c b/tools/testing/selftests/resctrl/cmt_test.c
index 05a180d85e93..188b73b5a2cc 100644
--- a/tools/testing/selftests/resctrl/cmt_test.c
+++ b/tools/testing/selftests/resctrl/cmt_test.c
@@ -53,7 +53,7 @@ static void show_cache_info(unsigned long sum_llc_occu_resc, int no_of_bits,
 	else
 		res = false;
 
-	printf("%sok CMT: diff within %d, %d\%%\n", res ? "" : "not",
+	printf("%sok CMT: diff within %d, %d\%%\n", res ? "" : "not ",
 	       MAX_DIFF, (int)MAX_DIFF_PERCENT);
 
 	printf("# diff: %ld\n", avg_diff);
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 2dceff59e245..d92b0b32a349 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -37,8 +37,8 @@ void detect_amd(void)
 static void cmd_help(void)
 {
 	printf("usage: resctrl_tests [-h] [-b \"benchmark_cmd [options]\"] [-t test list] [-n no_of_bits]\n");
-	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT");
-	printf("\t default benchmark is builtin fill_buf\n");
+	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT\n");
+	printf("\t   default benchmark is builtin fill_buf\n");
 	printf("\t-t test list: run tests specified in the test list, ");
 	printf("e.g. -t mbm, mba, cmt, cat\n");
 	printf("\t-n no_of_bits: run cache tests using specified no of bits in cache bit mask\n");
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 05/17] selftests/resctrl: Add a few dependencies
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (3 preceding siblings ...)
  2020-11-30 20:19 ` [PATCH v4 04/17] selftests/resctrl: Fix printed messages Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2021-01-26  2:29   ` Shuah Khan
  2020-11-30 20:19 ` [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported Fenghua Yu
                   ` (15 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Add a couple of sanity checks and the config file for test dependencies.

Running any resctrl unit test involves writing to resctrl file system
and only a root user has permission to write to resctrl FS. Resctrl
test suite before running any test checks for the privilege of the
user and if it's not a root user, the test suite prints a warning
and continues attempting to run tests.

Attempting to run any test without root privileges will fail as below

TAP version 13
ok kernel supports resctrl filesystem
.................
not ok mounting resctrl to "/sys/fs/resctrl"
not ok MBA: schemata change

Hence, don't attempt to run any test if the user is not a root user and
change the warning message to a bail out message to comply with TAP 13
standards.

Regarding the second check, check_resctrlfs_support() checks if the
platform supports resctrl file system or not by looking for resctrl
in /proc/filesystems and returns a boolean value. The main function
of resctrl test suite calls check_resctrlfs_support() but forgets to
check for it's return value. This means that resctrl test suite will
attempt to run resctrl tests (like CMT, CAT, MBM and MBA) even if the
platform doesn't support resctrl file system.

Fix this by checking for the return value of check_resctrlfs_support() in
the main function. If resctrl file system isn't supported on the platform
then exit the test suite gracefully without attempting to run any of
resctrl unit tests.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/config          |  2 ++
 tools/testing/selftests/resctrl/resctrl_tests.c | 13 ++++++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)
 create mode 100644 tools/testing/selftests/resctrl/config

diff --git a/tools/testing/selftests/resctrl/config b/tools/testing/selftests/resctrl/config
new file mode 100644
index 000000000000..8d9f2deb56ed
--- /dev/null
+++ b/tools/testing/selftests/resctrl/config
@@ -0,0 +1,2 @@
+CONFIG_X86_CPU_RESCTRL=y
+CONFIG_PROC_CPU_RESCTRL=y
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index d92b0b32a349..0e036dbf5d17 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -125,8 +125,10 @@ int main(int argc, char **argv)
 	 * 1. We write to resctrl FS
 	 * 2. We execute perf commands
 	 */
-	if (geteuid() != 0)
-		printf("# WARNING: not running as root, tests may fail.\n");
+	if (geteuid() != 0) {
+		printf("Bail out! not running as root, abort testing\n");
+		goto out;
+	}
 
 	/* Detect AMD vendor */
 	detect_amd();
@@ -155,7 +157,11 @@ int main(int argc, char **argv)
 	sprintf(bw_report, "reads");
 	sprintf(bm_type, "fill_buf");
 
-	check_resctrlfs_support();
+	if (!check_resctrlfs_support()) {
+		printf("Bail out! resctrl FS does not exist\n");
+		goto out;
+	}
+
 	filter_dmesg();
 
 	if (!is_amd && mbm_test) {
@@ -196,6 +202,7 @@ int main(int argc, char **argv)
 		cat_test_cleanup();
 	}
 
+out:
 	printf("1..%d\n", tests_run);
 
 	return 0;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (4 preceding siblings ...)
  2020-11-30 20:19 ` [PATCH v4 05/17] selftests/resctrl: Add a few dependencies Fenghua Yu
@ 2020-11-30 20:19 ` Fenghua Yu
  2021-01-26  2:32   ` Shuah Khan
  2020-11-30 20:20 ` [PATCH v4 07/17] selftests/resctrl: Use resctrl/info for feature detection Fenghua Yu
                   ` (14 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:19 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

check_resctrlfs_support() does the following
1. Checks if the platform supports resctrl file system or not by looking
   for resctrl in /proc/filesystems
2. Calls opendir() on default resctrl file system path
   (i.e. /sys/fs/resctrl)
3. Checks if resctrl file system is mounted or not by looking at
   /proc/mounts

Steps 2 and 3 will fail if the platform does not support resctrl file
system. So, there is no need to check for them if step 1 fails.

Fix this by returning immediately if the platform does not support
resctrl file system.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrlfs.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index 2c574d143ff0..c676557b376d 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -579,6 +579,9 @@ bool check_resctrlfs_support(void)
 	printf("%sok kernel supports resctrl filesystem\n", ret ? "" : "not ");
 	tests_run++;
 
+	if (!ret)
+		return ret;
+
 	dp = opendir(RESCTRL_PATH);
 	printf("%sok resctrl mountpoint \"%s\" exists\n",
 	       dp ? "" : "not ", RESCTRL_PATH);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 07/17] selftests/resctrl: Use resctrl/info for feature detection
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (5 preceding siblings ...)
  2020-11-30 20:19 ` [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU Fenghua Yu
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Resctrl test suite before running any unit test (like cmt, cat, mbm and
mba) should first check if the feature is enabled (by kernel and not just
supported by H/W) on the platform or not.
validate_resctrl_feature_request() is supposed to do that. This function
intends to grep for relevant flags in /proc/cpuinfo but there are several
issues here

1. validate_resctrl_feature_request() calls fgrep() to get flags from
   /proc/cpuinfo. But, fgrep() can only return a string with maximum of 255
   characters and hence the complete cpu flags are never returned.
2. The substring search logic is also busted. If strstr() finds requested
   resctrl feature in the cpu flags, it returns pointer to the first
   occurrence. But, the logic negates the return value of strstr() and
   hence validate_resctrl_feature_request() returns false if the feature is
   present in the cpu flags and returns true if the feature is not present.
3. validate_resctrl_feature_request() checks if a resctrl feature is
   reported in /proc/cpuinfo flags or not. Having a cpu flag means that the
   H/W supports the feature, but it doesn't mean that the kernel enabled
   it. A user could selectively enable only a subset of resctrl features
   using kernel command line arguments. Hence, /proc/cpuinfo isn't a
   reliable source to check if a feature is enabled or not.

The 3rd issue being the major one and fixing it requires changing the way
validate_resctrl_feature_request() works. Since, /proc/cpuinfo isn't the
right place to check if a resctrl feature is enabled or not, a more
appropriate place is /sys/fs/resctrl/info directory. Change
validate_resctrl_feature_request() such that,

1. For cat, check if /sys/fs/resctrl/info/L3 directory is present or not
2. For mba, check if /sys/fs/resctrl/info/MB directory is present or not
3. For cmt, check if /sys/fs/resctrl/info/L3_MON directory is present and
   check if /sys/fs/resctrl/info/L3_MON/mon_features has llc_occupancy
4. For mbm, check if /sys/fs/resctrl/info/L3_MON directory is present and
   check if /sys/fs/resctrl/info/L3_MON/mon_features has
   mbm_<total/local>_bytes

Please note that only L3_CAT, L3_CMT, MBA and MBM are supported. CDP and L2
variants can be added later.

Reported-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrl.h   |  6 ++-
 tools/testing/selftests/resctrl/resctrlfs.c | 51 ++++++++++++++++-----
 2 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index e99e62fddc61..5ff71870e61c 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -28,6 +28,10 @@
 #define RESCTRL_PATH		"/sys/fs/resctrl"
 #define PHYS_ID_PATH		"/sys/devices/system/cpu/cpu"
 #define CBM_MASK_PATH		"/sys/fs/resctrl/info"
+#define L3_PATH			"/sys/fs/resctrl/info/L3"
+#define MB_PATH			"/sys/fs/resctrl/info/MB"
+#define L3_MON_PATH		"/sys/fs/resctrl/info/L3_MON"
+#define L3_MON_FEATURES_PATH	"/sys/fs/resctrl/info/L3_MON/mon_features"
 
 #define PARENT_EXIT(err_msg)			\
 	do {					\
@@ -99,7 +103,7 @@ int remount_resctrlfs(bool mum_resctrlfs);
 int get_resource_id(int cpu_no, int *resource_id);
 int umount_resctrlfs(void);
 int validate_bw_report_request(char *bw_report);
-bool validate_resctrl_feature_request(char *resctrl_val);
+bool validate_resctrl_feature_request(const char *resctrl_val);
 char *fgrep(FILE *inf, const char *str);
 int taskset_benchmark(pid_t bm_pid, int cpu_no);
 void run_benchmark(int signum, siginfo_t *info, void *ucontext);
diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index c676557b376d..d2cae4927b62 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -616,26 +616,55 @@ char *fgrep(FILE *inf, const char *str)
  * validate_resctrl_feature_request - Check if requested feature is valid.
  * @resctrl_val:	Requested feature
  *
- * Return: 0 on success, non-zero on failure
+ * Return: True if the feature is supported, else false
  */
-bool validate_resctrl_feature_request(char *resctrl_val)
+bool validate_resctrl_feature_request(const char *resctrl_val)
 {
-	FILE *inf = fopen("/proc/cpuinfo", "r");
+	struct stat statbuf;
 	bool found = false;
 	char *res;
+	FILE *inf;
 
-	if (!inf)
+	if (!resctrl_val)
 		return false;
 
-	res = fgrep(inf, "flags");
-
-	if (res) {
-		char *s = strchr(res, ':');
+	if (remount_resctrlfs(false))
+		return false;
 
-		found = s && !strstr(s, resctrl_val);
-		free(res);
+	if (is_cat(resctrl_val)) {
+		if (!stat(L3_PATH, &statbuf))
+			return true;
+	} else if (is_mba(resctrl_val)) {
+		if (!stat(MB_PATH, &statbuf))
+			return true;
+	} else if (is_mbm(resctrl_val) || is_cmt(resctrl_val)) {
+		if (!stat(L3_MON_PATH, &statbuf)) {
+			inf = fopen(L3_MON_FEATURES_PATH, "r");
+			if (!inf)
+				return false;
+
+			if (is_cmt(resctrl_val)) {
+				res = fgrep(inf, "llc_occupancy");
+				if (res) {
+					found = true;
+					free(res);
+				}
+			}
+
+			if (is_mbm(resctrl_val)) {
+				res = fgrep(inf, "mbm_total_bytes");
+				if (res) {
+					free(res);
+					res = fgrep(inf, "mbm_local_bytes");
+					if (res) {
+						found = true;
+						free(res);
+					}
+				}
+			}
+			fclose(inf);
+		}
 	}
-	fclose(inf);
 
 	return found;
 }
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (6 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 07/17] selftests/resctrl: Use resctrl/info for feature detection Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2021-01-26  2:35   ` Shuah Khan
  2020-11-30 20:20 ` [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p" Fenghua Yu
                   ` (12 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

From: Reinette Chatre <reinette.chatre@intel.com>

The resctrl tests can accept a CPU on which the tests are run and use
default of CPU #1 if it is not provided. In the CAT test a "sibling CPU"
is determined that is from the same package where another thread will be
run.

The current algorithm with which a "sibling CPU" is determined does not
take the provided/default CPU into account and when that CPU is the
first CPU in a package then the "sibling CPU" will be selected to be the
same CPU since it starts by picking the first CPU from core_siblings_list.

Fix the "sibling CPU" selection by taking the provided/default CPU into
account and ensuring a sibling that is a different CPU is selected.

Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrlfs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index d2cae4927b62..3f43bcf0b8d5 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -268,7 +268,7 @@ int get_core_sibling(int cpu_no)
 	while (token) {
 		sibling_cpu_no = atoi(token);
 		/* Skipping core 0 as we don't want to run test on core 0 */
-		if (sibling_cpu_no != 0)
+		if (sibling_cpu_no != 0 && sibling_cpu_no != cpu_no)
 			break;
 		token = strtok(NULL, "-,");
 	}
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p"
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (7 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2021-01-26  2:36   ` Shuah Khan
  2020-11-30 20:20 ` [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format Fenghua Yu
                   ` (11 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

resctrl test suite accepts command line arguments (like -b, -t, -n and -p)
as documented in the help. But passing -n and -p throws an invalid option
error. This happens because -n and -p are missing in the list of
characters that getopt() recognizes as valid arguments. Hence, they are
treated as invalid options.

Fix this by adding them to the list of characters that getopt() recognizes
as valid arguments. Please note that the main() function already has the
logic to deal with the values passed as part of these arguments and hence
no changes are needed there.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrl_tests.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 0e036dbf5d17..ef09e0ef2366 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -73,7 +73,7 @@ int main(int argc, char **argv)
 		}
 	}
 
-	while ((c = getopt(argc_new, argv, "ht:b:")) != -1) {
+	while ((c = getopt(argc_new, argv, "ht:b:n:p:")) != -1) {
 		char *token;
 
 		switch (c) {
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (8 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p" Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2021-01-26  2:38   ` Shuah Khan
  2020-11-30 20:20 ` [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows Fenghua Yu
                   ` (10 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

MBM unit test starts fill_buf (default built-in benchmark) in a new con_mon
group (c1, m1) and records resctrl reported mbm values and iMC (Integrated
Memory Controller) values every second. It does this for five seconds
(randomly chosen value) in total. It then calculates average of resctrl_mbm
values and imc_mbm values and if the difference is greater than 300 MB/sec
(randomly chosen value), the test treats it as a failure. MBA unit test is
similar to MBM but after every run it changes schemata.

Checking for a difference of 300 MB/sec doesn't look very meaningful when
the mbm values are changing over a wide range. For example, below are the
values running MBA test on SKL with different allocations

1. With 10% as schemata both iMC and resctrl mbm_values are around 2000
   MB/sec
2. With 100% as schemata both iMC and resctrl mbm_values are around 10000
   MB/sec

A 300 MB/sec difference between resctrl_mbm and imc_mbm values is
acceptable at 100% schemata but it isn't acceptable at 10% schemata because
that's a huge difference.

So, fix this by checking for percentage difference instead of absolute
difference i.e. check if the difference between resctrl_mbm value and
imc_mbm value is within 5% (randomly chosen value) of imc_mbm value. If the
difference is greater than 5% of imc_mbm value, treat it is a failure.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/mba_test.c | 20 +++++++++++---------
 tools/testing/selftests/resctrl/mbm_test.c | 13 +++++++------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/tools/testing/selftests/resctrl/mba_test.c b/tools/testing/selftests/resctrl/mba_test.c
index 6449fbd96096..b4c81d2ee53b 100644
--- a/tools/testing/selftests/resctrl/mba_test.c
+++ b/tools/testing/selftests/resctrl/mba_test.c
@@ -12,7 +12,7 @@
 
 #define RESULT_FILE_NAME	"result_mba"
 #define NUM_OF_RUNS		5
-#define MAX_DIFF		300
+#define MAX_DIFF_PERCENT	5
 #define ALLOCATION_MAX		100
 #define ALLOCATION_MIN		10
 #define ALLOCATION_STEP		10
@@ -62,7 +62,8 @@ static void show_mba_info(unsigned long *bw_imc, unsigned long *bw_resc)
 	     allocation++) {
 		unsigned long avg_bw_imc, avg_bw_resc;
 		unsigned long sum_bw_imc = 0, sum_bw_resc = 0;
-		unsigned long avg_diff;
+		int avg_diff_per;
+		float avg_diff;
 
 		/*
 		 * The first run is discarded due to inaccurate value from
@@ -76,17 +77,18 @@ static void show_mba_info(unsigned long *bw_imc, unsigned long *bw_resc)
 
 		avg_bw_imc = sum_bw_imc / (NUM_OF_RUNS - 1);
 		avg_bw_resc = sum_bw_resc / (NUM_OF_RUNS - 1);
-		avg_diff = labs((long)(avg_bw_resc - avg_bw_imc));
+		avg_diff = (float)labs(avg_bw_resc - avg_bw_imc) / avg_bw_imc;
+		avg_diff_per = (int)(avg_diff * 100);
 
-		printf("%sok MBA schemata percentage %u smaller than %d %%\n",
-		       avg_diff > MAX_DIFF ? "not " : "",
-		       ALLOCATION_MAX - ALLOCATION_STEP * allocation,
-		       MAX_DIFF);
+		printf("%sok MBA: diff within %d%% for schemata %u\n",
+		       avg_diff_per > MAX_DIFF_PERCENT ? "not " : "",
+		       MAX_DIFF_PERCENT,
+		       ALLOCATION_MAX - ALLOCATION_STEP * allocation);
 		tests_run++;
-		printf("# avg_diff: %lu\n", avg_diff);
+		printf("# avg_diff_per: %d%%\n", avg_diff_per);
 		printf("# avg_bw_imc: %lu\n", avg_bw_imc);
 		printf("# avg_bw_resc: %lu\n", avg_bw_resc);
-		if (avg_diff > MAX_DIFF)
+		if (avg_diff_per > MAX_DIFF_PERCENT)
 			failed = true;
 	}
 
diff --git a/tools/testing/selftests/resctrl/mbm_test.c b/tools/testing/selftests/resctrl/mbm_test.c
index ec6cfe01c9c2..672d3ddd6e85 100644
--- a/tools/testing/selftests/resctrl/mbm_test.c
+++ b/tools/testing/selftests/resctrl/mbm_test.c
@@ -11,7 +11,7 @@
 #include "resctrl.h"
 
 #define RESULT_FILE_NAME	"result_mbm"
-#define MAX_DIFF		300
+#define MAX_DIFF_PERCENT	5
 #define NUM_OF_RUNS		5
 
 static void
@@ -19,8 +19,8 @@ show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, int span)
 {
 	unsigned long avg_bw_imc = 0, avg_bw_resc = 0;
 	unsigned long sum_bw_imc = 0, sum_bw_resc = 0;
-	long avg_diff = 0;
-	int runs;
+	int runs, avg_diff_per;
+	float avg_diff = 0;
 
 	/*
 	 * Discard the first value which is inaccurate due to monitoring setup
@@ -33,12 +33,13 @@ show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, int span)
 
 	avg_bw_imc = sum_bw_imc / 4;
 	avg_bw_resc = sum_bw_resc / 4;
-	avg_diff = avg_bw_resc - avg_bw_imc;
+	avg_diff = (float)labs(avg_bw_resc - avg_bw_imc) / avg_bw_imc;
+	avg_diff_per = (int)(avg_diff * 100);
 
 	printf("%sok MBM: diff within %d%%\n",
-	       labs(avg_diff) > MAX_DIFF ? "not " : "", MAX_DIFF);
+	       avg_diff_per > MAX_DIFF_PERCENT ? "not " : "", MAX_DIFF_PERCENT);
 	tests_run++;
-	printf("# avg_diff: %lu\n", labs(avg_diff));
+	printf("# avg_diff_per: %d%%\n", avg_diff_per);
 	printf("# Span (MB): %d\n", span);
 	printf("# avg_bw_imc: %lu\n", avg_bw_imc);
 	printf("# avg_bw_resc: %lu\n", avg_bw_resc);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (9 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2021-01-26  2:38   ` Shuah Khan
  2020-11-30 20:20 ` [PATCH v4 12/17] selftests/resctrl: Don't hard code value of "no_of_bits" variable Fenghua Yu
                   ` (9 subsequent siblings)
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

David reported a buffer overflow error in the check_results() function of
the cmt unit test and he suggested enabling _FORTIFY_SOURCE gcc compiler
option to automatically detect any such errors.

Feature Test Macros man page describes_FORTIFY_SOURCE as below

"Defining this macro causes some lightweight checks to be performed to
detect some buffer overflow errors when employing various string and memory
manipulation functions (for example, memcpy, memset, stpcpy, strcpy,
strncpy, strcat, strncat, sprintf, snprintf, vsprintf, vsnprintf, gets, and
wide character variants thereof). For some functions, argument consistency
is checked; for example, a check is made that open has been supplied with a
mode argument when the specified flags include O_CREAT. Not all problems
are detected, just some common cases.

If _FORTIFY_SOURCE is set to 1, with compiler optimization level 1 (gcc
-O1) and above, checks that shouldn't change the behavior of conforming
programs are performed.

With _FORTIFY_SOURCE set to 2, some more checking is added, but some
conforming programs might fail.

Some of the checks can be performed at compile time (via macros logic
implemented in header files), and result in compiler warnings; other checks
take place at run time, and result in a run-time error if the check fails.

Use of this macro requires compiler support, available with gcc since
version 4.0."

Fix the buffer overflow error in the check_results() function of the cmt
unit test and enable _FORTIFY_SOURCE gcc check to catch any future buffer
overflow errors.

Reported-by: David Binderman <dcb314@hotmail.com>
Suggested-by: David Binderman <dcb314@hotmail.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/Makefile   | 2 +-
 tools/testing/selftests/resctrl/cmt_test.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/resctrl/Makefile b/tools/testing/selftests/resctrl/Makefile
index d585cc1948cc..6bcee2ec91a9 100644
--- a/tools/testing/selftests/resctrl/Makefile
+++ b/tools/testing/selftests/resctrl/Makefile
@@ -1,5 +1,5 @@
 CC = $(CROSS_COMPILE)gcc
-CFLAGS = -g -Wall
+CFLAGS = -g -Wall -O2 -D_FORTIFY_SOURCE=2
 SRCS=$(wildcard *.c)
 OBJS=$(SRCS:.c=.o)
 
diff --git a/tools/testing/selftests/resctrl/cmt_test.c b/tools/testing/selftests/resctrl/cmt_test.c
index 188b73b5a2cc..ac1a33d9ce12 100644
--- a/tools/testing/selftests/resctrl/cmt_test.c
+++ b/tools/testing/selftests/resctrl/cmt_test.c
@@ -81,7 +81,7 @@ static int check_results(struct resctrl_val_param *param, int no_of_bits)
 		return errno;
 	}
 
-	while (fgets(temp, 1024, fp)) {
+	while (fgets(temp, sizeof(temp), fp)) {
 		char *token = strtok(temp, ":\t");
 		int fields = 0;
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 12/17] selftests/resctrl: Don't hard code value of "no_of_bits" variable
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (10 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 13/17] selftests/resctrl: Modularize resctrl test suite main() function Fenghua Yu
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Cache related tests (like CAT and CMT) depend on a variable called
no_of_bits to run. no_of_bits defines the number of contiguous bits
that should be set in the CBM mask and a user can pass a value for
no_of_bits using -n command line argument. If a user hasn't passed any
value, it defaults to 5 (randomly chosen value).

Hard coding no_of_bits to 5 will make the cache tests fail to run on
systems that support maximum cbm mask that is less than or equal to 5 bits.
Hence, don't hard code no_of_bits value.

If a user passes a value for "no_of_bits" using -n option, use it.
Otherwise, no_of_bits is equal to half of the maximum number of bits in
the cbm mask.

Please note that CMT test is still hard coded to 5 bits. It will change in
subsequent patches that change CMT test.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/cat_test.c      | 5 ++++-
 tools/testing/selftests/resctrl/resctrl_tests.c | 8 ++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
index 6d9a41f3939a..6e935a6bb3e6 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -147,7 +147,10 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 	/* Get max number of bits from default-cabm mask */
 	count_of_bits = count_bits(long_mask);
 
-	if (n < 1 || n > count_of_bits - 1) {
+	if (!n)
+		n = count_of_bits / 2;
+
+	if (n > count_of_bits - 1) {
 		printf("Invalid input value for no_of_bits n!\n");
 		printf("Please Enter value in range 1 to %d\n",
 		       count_of_bits - 1);
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index ef09e0ef2366..244f1beb75da 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -57,7 +57,7 @@ void tests_cleanup(void)
 int main(int argc, char **argv)
 {
 	bool has_ben = false, mbm_test = true, mba_test = true, cmt_test = true;
-	int res, c, cpu_no = 1, span = 250, argc_new = argc, i, no_of_bits = 5;
+	int res, c, cpu_no = 1, span = 250, argc_new = argc, i, no_of_bits = 0;
 	char *benchmark_cmd[BENCHMARK_ARGS], bw_report[64], bm_type[64];
 	char benchmark_cmd_area[BENCHMARK_ARGS][BENCHMARK_ARG_SIZE];
 	int ben_ind, ben_count;
@@ -106,6 +106,10 @@ int main(int argc, char **argv)
 			break;
 		case 'n':
 			no_of_bits = atoi(optarg);
+			if (no_of_bits <= 0) {
+				printf("Bail out! invalid argument for no_of_bits\n");
+				return -1;
+			}
 			break;
 		case 'h':
 			cmd_help();
@@ -188,7 +192,7 @@ int main(int argc, char **argv)
 		printf("# Starting CMT test ...\n");
 		if (!has_ben)
 			sprintf(benchmark_cmd[5], "%s", "cmt");
-		res = cmt_resctrl_val(cpu_no, no_of_bits, benchmark_cmd);
+		res = cmt_resctrl_val(cpu_no, 5, benchmark_cmd);
 		printf("%sok CMT: test\n", res ? "not " : "");
 		cmt_test_cleanup();
 		tests_run++;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 13/17] selftests/resctrl: Modularize resctrl test suite main() function
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (11 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 12/17] selftests/resctrl: Don't hard code value of "no_of_bits" variable Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 14/17] selftests/resctrl: Skip the test if requested resctrl feature is not supported Fenghua Yu
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

Resctrl test suite main() function does the following things
1. Parses command line arguments passed by user
2. Some setup checks
3. Logic that calls into each unit test
4. Print result and clean up after running each unit test

Introduce wrapper functions for steps 3 and 4 to modularize the main()
function. Adding these wrapper functions makes it easier to add any logic
to each individual test.

Please note that this is a preparatory patch for the next one and no
functional changes are intended.

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 .../testing/selftests/resctrl/resctrl_tests.c | 96 ++++++++++++-------
 1 file changed, 61 insertions(+), 35 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 244f1beb75da..9b7017299ca2 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -54,10 +54,62 @@ void tests_cleanup(void)
 	cat_test_cleanup();
 }
 
+static void run_mbm_test(bool has_ben, char **benchmark_cmd, int span,
+			 int cpu_no, char *bw_report)
+{
+	int res;
+
+	printf("# Starting MBM BW change ...\n");
+	if (!has_ben)
+		sprintf(benchmark_cmd[5], "%s", "mba");
+	res = mbm_bw_change(span, cpu_no, bw_report, benchmark_cmd);
+	printf("%sok MBM: bw change\n", res ? "not " : "");
+	mbm_test_cleanup();
+	tests_run++;
+}
+
+static void run_mba_test(bool has_ben, char **benchmark_cmd, int span,
+			 int cpu_no, char *bw_report)
+{
+	int res;
+
+	printf("# Starting MBA Schemata change ...\n");
+	if (!has_ben)
+		sprintf(benchmark_cmd[1], "%d", span);
+	res = mba_schemata_change(cpu_no, bw_report, benchmark_cmd);
+	printf("%sok MBA: schemata change\n", res ? "not " : "");
+	mba_test_cleanup();
+	tests_run++;
+}
+
+static void run_cmt_test(bool has_ben, char **benchmark_cmd, int cpu_no)
+{
+	int res;
+
+	printf("# Starting CMT test ...\n");
+	if (!has_ben)
+		sprintf(benchmark_cmd[5], "%s", "cmt");
+	res = cmt_resctrl_val(cpu_no, 5, benchmark_cmd);
+	printf("%sok CMT: test\n", res ? "not " : "");
+	cmt_test_cleanup();
+	tests_run++;
+}
+
+static void run_cat_test(int cpu_no, int no_of_bits)
+{
+	int res;
+
+	printf("# Starting CAT test ...\n");
+	res = cat_perf_miss_val(cpu_no, no_of_bits, "L3");
+	printf("%sok CAT: test\n", res ? "not " : "");
+	tests_run++;
+	cat_test_cleanup();
+}
+
 int main(int argc, char **argv)
 {
 	bool has_ben = false, mbm_test = true, mba_test = true, cmt_test = true;
-	int res, c, cpu_no = 1, span = 250, argc_new = argc, i, no_of_bits = 0;
+	int c, cpu_no = 1, span = 250, argc_new = argc, i, no_of_bits = 0;
 	char *benchmark_cmd[BENCHMARK_ARGS], bw_report[64], bm_type[64];
 	char benchmark_cmd_area[BENCHMARK_ARGS][BENCHMARK_ARG_SIZE];
 	int ben_ind, ben_count;
@@ -168,43 +220,17 @@ int main(int argc, char **argv)
 
 	filter_dmesg();
 
-	if (!is_amd && mbm_test) {
-		printf("# Starting MBM BW change ...\n");
-		if (!has_ben)
-			sprintf(benchmark_cmd[5], "%s", MBA_STR);
-		res = mbm_bw_change(span, cpu_no, bw_report, benchmark_cmd);
-		printf("%sok MBM: bw change\n", res ? "not " : "");
-		mbm_test_cleanup();
-		tests_run++;
-	}
+	if (!is_amd && mbm_test)
+		run_mbm_test(has_ben, benchmark_cmd, span, cpu_no, bw_report);
 
-	if (!is_amd && mba_test) {
-		printf("# Starting MBA Schemata change ...\n");
-		if (!has_ben)
-			sprintf(benchmark_cmd[1], "%d", span);
-		res = mba_schemata_change(cpu_no, bw_report, benchmark_cmd);
-		printf("%sok MBA: schemata change\n", res ? "not " : "");
-		mba_test_cleanup();
-		tests_run++;
-	}
+	if (!is_amd && mba_test)
+		run_mba_test(has_ben, benchmark_cmd, span, cpu_no, bw_report);
 
-	if (cmt_test) {
-		printf("# Starting CMT test ...\n");
-		if (!has_ben)
-			sprintf(benchmark_cmd[5], "%s", "cmt");
-		res = cmt_resctrl_val(cpu_no, 5, benchmark_cmd);
-		printf("%sok CMT: test\n", res ? "not " : "");
-		cmt_test_cleanup();
-		tests_run++;
-	}
+	if (cmt_test)
+		run_cmt_test(has_ben, benchmark_cmd, cpu_no);
 
-	if (cat_test) {
-		printf("# Starting CAT test ...\n");
-		res = cat_perf_miss_val(cpu_no, no_of_bits, "L3");
-		printf("%sok CAT: test\n", res ? "not " : "");
-		tests_run++;
-		cat_test_cleanup();
-	}
+	if (cat_test)
+		run_cat_test(cpu_no, no_of_bits);
 
 out:
 	printf("1..%d\n", tests_run);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 14/17] selftests/resctrl: Skip the test if requested resctrl feature is not supported
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (12 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 13/17] selftests/resctrl: Modularize resctrl test suite main() function Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 15/17] selftests/resctrl: Fix unmount resctrl FS Fenghua Yu
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

There could be two reasons why a resctrl feature might not be enabled on
the platform
1. H/W might not support the feature
2. Even if the H/W supports it, the user might have disabled the feature
   through kernel command line arguments

Hence, any resctrl unit test (like cmt, cat, mbm and mba) before starting
the test will first check if the feature is enabled on the platform or not.
If the feature isn't enabled, then the test returns with an error status.
For example, if MBA isn't supported on a platform and if the user tries to
run MBA, the output will look like this

ok mounting resctrl to "/sys/fs/resctrl"
not ok MBA: schemata change

But, not supporting a feature isn't a test failure. So, instead of treating
it as an error, use the SKIP directive of the TAP protocol. With the
change, the output will look as below

ok MBA # SKIP Hardware does not support MBA or MBA is disabled

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/cat_test.c    |  3 ---
 tools/testing/selftests/resctrl/mba_test.c    |  3 ---
 tools/testing/selftests/resctrl/mbm_test.c    |  3 ---
 .../testing/selftests/resctrl/resctrl_tests.c | 24 +++++++++++++++++++
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
index 6e935a6bb3e6..9b38e6296d3d 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -128,9 +128,6 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 	if (ret)
 		return ret;
 
-	if (!validate_resctrl_feature_request("cat"))
-		return -1;
-
 	/* Get default cbm mask for L3/L2 cache */
 	ret = get_cbm_mask(cache_type, cbm_mask);
 	if (ret)
diff --git a/tools/testing/selftests/resctrl/mba_test.c b/tools/testing/selftests/resctrl/mba_test.c
index b4c81d2ee53b..d10e030b1a55 100644
--- a/tools/testing/selftests/resctrl/mba_test.c
+++ b/tools/testing/selftests/resctrl/mba_test.c
@@ -156,9 +156,6 @@ int mba_schemata_change(int cpu_no, char *bw_report, char **benchmark_cmd)
 
 	remove(RESULT_FILE_NAME);
 
-	if (!validate_resctrl_feature_request("mba"))
-		return -1;
-
 	ret = resctrl_val(benchmark_cmd, &param);
 	if (ret)
 		return ret;
diff --git a/tools/testing/selftests/resctrl/mbm_test.c b/tools/testing/selftests/resctrl/mbm_test.c
index 672d3ddd6e85..614614ecd58b 100644
--- a/tools/testing/selftests/resctrl/mbm_test.c
+++ b/tools/testing/selftests/resctrl/mbm_test.c
@@ -129,9 +129,6 @@ int mbm_bw_change(int span, int cpu_no, char *bw_report, char **benchmark_cmd)
 
 	remove(RESULT_FILE_NAME);
 
-	if (!validate_resctrl_feature_request("mbm"))
-		return -1;
-
 	ret = resctrl_val(benchmark_cmd, &param);
 	if (ret)
 		return ret;
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 9b7017299ca2..63400a51cbd8 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -60,6 +60,12 @@ static void run_mbm_test(bool has_ben, char **benchmark_cmd, int span,
 	int res;
 
 	printf("# Starting MBM BW change ...\n");
+
+	if (!validate_resctrl_feature_request("mbm")) {
+		printf("ok MBM # SKIP Hardware does not support MBM or MBM is disabled\n");
+		return;
+	}
+
 	if (!has_ben)
 		sprintf(benchmark_cmd[5], "%s", "mba");
 	res = mbm_bw_change(span, cpu_no, bw_report, benchmark_cmd);
@@ -74,6 +80,12 @@ static void run_mba_test(bool has_ben, char **benchmark_cmd, int span,
 	int res;
 
 	printf("# Starting MBA Schemata change ...\n");
+
+	if (!validate_resctrl_feature_request("mba")) {
+		printf("ok MBA # SKIP Hardware does not support MBA or MBA is disabled\n");
+		return;
+	}
+
 	if (!has_ben)
 		sprintf(benchmark_cmd[1], "%d", span);
 	res = mba_schemata_change(cpu_no, bw_report, benchmark_cmd);
@@ -87,6 +99,12 @@ static void run_cmt_test(bool has_ben, char **benchmark_cmd, int cpu_no)
 	int res;
 
 	printf("# Starting CMT test ...\n");
+
+	if (!validate_resctrl_feature_request("cmt")) {
+		printf("ok CMT # SKIP Hardware does not support CMT or CMT is disabled\n");
+		return;
+	}
+
 	if (!has_ben)
 		sprintf(benchmark_cmd[5], "%s", "cmt");
 	res = cmt_resctrl_val(cpu_no, 5, benchmark_cmd);
@@ -100,6 +118,12 @@ static void run_cat_test(int cpu_no, int no_of_bits)
 	int res;
 
 	printf("# Starting CAT test ...\n");
+
+	if (!validate_resctrl_feature_request("cat")) {
+		printf("ok CAT # SKIP Hardware does not support CAT or CAT is disabled\n");
+		return;
+	}
+
 	res = cat_perf_miss_val(cpu_no, no_of_bits, "L3");
 	printf("%sok CAT: test\n", res ? "not " : "");
 	tests_run++;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 15/17] selftests/resctrl: Fix unmount resctrl FS
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (13 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 14/17] selftests/resctrl: Skip the test if requested resctrl feature is not supported Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 16/17] selftests/resctrl: Fix incorrect parsing of iMC counters Fenghua Yu
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

umount_resctrlfs() directly attempts to unmount resctrl file system without
checking if resctrl FS is already mounted or not. It returns 0 on success
and on failure it prints an error message and returns an error status.
Calling umount_resctrlfs() when resctrl FS isn't mounted will return an
error status.

There could be situations where-in the caller might not know if resctrl
FS is already mounted or not and the caller might still want to unmount
resctrl FS if it's already mounted (For example during teardown).

To support above use cases, change umount_resctrlfs() such that it now
first checks if resctrl FS is already mounted or not and unmounts resctrl
FS only if it's already mounted.

unmount resctrl FS upon exit. For example, running only mba test on a
Broadwell (BDW) machine (MBA isn't supported on BDW CPU).

This happens because validate_resctrl_feature_request() would mount resctrl
FS to check if mba is enabled on the platform or not and finds that the H/W
doesn't support mba and hence will return false to run_mba_test(). This in
turn makes the main() function return without unmounting resctrl FS.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrl_tests.c | 1 +
 tools/testing/selftests/resctrl/resctrlfs.c     | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
index 63400a51cbd8..7a63d5fcf4e0 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -257,6 +257,7 @@ int main(int argc, char **argv)
 		run_cat_test(cpu_no, no_of_bits);
 
 out:
+	umount_resctrlfs();
 	printf("1..%d\n", tests_run);
 
 	return 0;
diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
index 3f43bcf0b8d5..868f6f186e98 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -90,6 +90,9 @@ int remount_resctrlfs(bool mum_resctrlfs)
 
 int umount_resctrlfs(void)
 {
+	if (find_resctrl_mount(NULL))
+		return 0;
+
 	if (umount(RESCTRL_PATH)) {
 		perror("# Unable to umount resctrl");
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 16/17] selftests/resctrl: Fix incorrect parsing of iMC counters
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (14 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 15/17] selftests/resctrl: Fix unmount resctrl FS Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-11-30 20:20 ` [PATCH v4 17/17] selftests/resctrl: Fix checking for < 0 for unsigned values Fenghua Yu
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu

iMC (Integrated Memory Controller) counters are usually at
"/sys/bus/event_source/devices/" and are named as "uncore_imc_<n>".
num_of_imcs() function tries to count number of such iMC counters so that
it could appropriately initialize required number of perf_attr structures
that could be used to read these iMC counters.

num_of_imcs() function assumes that all the directories under this path
that start with "uncore_imc" are iMC counters. But, on some systems there
could be directories named as "uncore_imc_free_running" which aren't iMC
counters. Trying to read from such directories will result in "not found
file" errors and MBM/MBA tests will fail.

Hence, fix the logic in num_of_imcs() such that it looks at the first
character after "uncore_imc_" to check if it's a numerical digit or not. If
it's a digit then the directory represents an iMC counter, else, skip the
directory.

Reported-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrl_val.c | 22 +++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index 5ff336f62f8f..d6f0688182e8 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -221,8 +221,8 @@ static int read_from_imc_dir(char *imc_dir, int count)
  */
 static int num_of_imcs(void)
 {
+	char imc_dir[512], *temp;
 	unsigned int count = 0;
-	char imc_dir[512];
 	struct dirent *ep;
 	int ret;
 	DIR *dp;
@@ -230,7 +230,25 @@ static int num_of_imcs(void)
 	dp = opendir(DYN_PMU_PATH);
 	if (dp) {
 		while ((ep = readdir(dp))) {
-			if (strstr(ep->d_name, UNCORE_IMC)) {
+			temp = strstr(ep->d_name, UNCORE_IMC);
+			if (!temp)
+				continue;
+
+			/*
+			 * imc 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.
+			 */
+			temp = temp + sizeof(UNCORE_IMC);
+
+			/*
+			 * Some directories under "DYN_PMU_PATH" could have
+			 * names like "uncore_imc_free_running", hence, check if
+			 * first character is a numerical digit or not.
+			 */
+			if (temp[0] >= '0' && temp[0] <= '9') {
 				sprintf(imc_dir, "%s/%s/", DYN_PMU_PATH,
 					ep->d_name);
 				ret = read_from_imc_dir(imc_dir, count);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 17/17] selftests/resctrl: Fix checking for < 0 for unsigned values
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (15 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 16/17] selftests/resctrl: Fix incorrect parsing of iMC counters Fenghua Yu
@ 2020-11-30 20:20 ` Fenghua Yu
  2020-12-11  0:21 ` [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Yu, Fenghua
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2020-11-30 20:20 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel, Fenghua Yu, Dan Carpenter

Dan reported following static checker warnings

tools/testing/selftests/resctrl/resctrl_val.c:545 measure_vals()
warn: 'bw_imc' unsigned <= 0

tools/testing/selftests/resctrl/resctrl_val.c:549 measure_vals()
warn: 'bw_resc_end' unsigned <= 0

These warnings are reported because
1. measure_vals() declares 'bw_imc' and 'bw_resc_end' as unsigned long
   variables
2. Return value of get_mem_bw_imc() and get_mem_bw_resctrl() are assigned
   to 'bw_imc' and 'bw_resc_end' respectively
3. The returned values are checked for <= 0 to see if the calls failed

Checking for < 0 for an unsigned value doesn't make any sense.

Fix this issue by changing the implementation of get_mem_bw_imc() and
get_mem_bw_resctrl() such that they now accept reference to a variable
and set the variable appropriately upon success and return 0, else return
< 0 on error.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 tools/testing/selftests/resctrl/resctrl_val.c | 41 +++++++++++--------
 1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index d6f0688182e8..ce8f0ec15f7b 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -300,9 +300,9 @@ static int initialize_mem_bw_imc(void)
  * Memory B/W utilized by a process on a socket can be calculated using
  * iMC counters. Perf events are used to read these counters.
  *
- * Return: >= 0 on success. < 0 on failure.
+ * Return: = 0 on success. < 0 on failure.
  */
-static float get_mem_bw_imc(int cpu_no, char *bw_report)
+static int get_mem_bw_imc(int cpu_no, char *bw_report, float *bw_imc)
 {
 	float reads, writes, of_mul_read, of_mul_write;
 	int imc, j, ret;
@@ -373,13 +373,18 @@ static float get_mem_bw_imc(int cpu_no, char *bw_report)
 		close(imc_counters_config[imc][WRITE].fd);
 	}
 
-	if (strcmp(bw_report, "reads") == 0)
-		return reads;
+	if (strcmp(bw_report, "reads") == 0) {
+		*bw_imc = reads;
+		return 0;
+	}
 
-	if (strcmp(bw_report, "writes") == 0)
-		return writes;
+	if (strcmp(bw_report, "writes") == 0) {
+		*bw_imc = writes;
+		return 0;
+	}
 
-	return (reads + writes);
+	*bw_imc = reads + writes;
+	return 0;
 }
 
 void set_mbm_path(const char *ctrlgrp, const char *mongrp, int resource_id)
@@ -438,9 +443,8 @@ static void initialize_mem_bw_resctrl(const char *ctrlgrp, const char *mongrp,
  * 1. If con_mon grp is given, then read from it
  * 2. If con_mon grp is not given, then read from root con_mon grp
  */
-static unsigned long get_mem_bw_resctrl(void)
+static int get_mem_bw_resctrl(unsigned long *mbm_total)
 {
-	unsigned long mbm_total = 0;
 	FILE *fp;
 
 	fp = fopen(mbm_total_path, "r");
@@ -449,7 +453,7 @@ static unsigned long get_mem_bw_resctrl(void)
 
 		return -1;
 	}
-	if (fscanf(fp, "%lu", &mbm_total) <= 0) {
+	if (fscanf(fp, "%lu", mbm_total) <= 0) {
 		perror("Could not get mbm local bytes");
 		fclose(fp);
 
@@ -457,7 +461,7 @@ static unsigned long get_mem_bw_resctrl(void)
 	}
 	fclose(fp);
 
-	return mbm_total;
+	return 0;
 }
 
 pid_t bm_pid, ppid;
@@ -549,7 +553,8 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
 static int
 measure_vals(struct resctrl_val_param *param, unsigned long *bw_resc_start)
 {
-	unsigned long bw_imc, bw_resc, bw_resc_end;
+	unsigned long bw_resc, bw_resc_end;
+	float bw_imc;
 	int ret;
 
 	/*
@@ -559,13 +564,13 @@ measure_vals(struct resctrl_val_param *param, unsigned long *bw_resc_start)
 	 * Compare the two values to validate resctrl value.
 	 * It takes 1sec to measure the data.
 	 */
-	bw_imc = get_mem_bw_imc(param->cpu_no, param->bw_report);
-	if (bw_imc <= 0)
-		return bw_imc;
+	ret = get_mem_bw_imc(param->cpu_no, param->bw_report, &bw_imc);
+	if (ret < 0)
+		return ret;
 
-	bw_resc_end = get_mem_bw_resctrl();
-	if (bw_resc_end <= 0)
-		return bw_resc_end;
+	ret = get_mem_bw_resctrl(&bw_resc_end);
+	if (ret < 0)
+		return ret;
 
 	bw_resc = (bw_resc_end - *bw_resc_start) / MB;
 	ret = print_results_bw(param->filename, bm_pid, bw_imc, bw_resc);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* RE: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (16 preceding siblings ...)
  2020-11-30 20:20 ` [PATCH v4 17/17] selftests/resctrl: Fix checking for < 0 for unsigned values Fenghua Yu
@ 2020-12-11  0:21 ` Yu, Fenghua
  2021-01-25 20:47 ` Fenghua Yu
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 33+ messages in thread
From: Yu, Fenghua @ 2020-12-11  0:21 UTC (permalink / raw)
  To: Shuah Khan, Luck, Tony, Chatre, Reinette, David Binderman,
	Babu Moger, James Morse, Shankar, Ravi V
  Cc: linux-kernel

Hi, Shuah,

> This patch set has several miscellaneous fixes to resctrl selftest tool that are
> easily visible to user. V1 had fixes to CAT test and CMT test but they were
> dropped in V2 because having them here made the patchset humongous. So,
> changes to CAT test and CMT test will be posted in another patchset.
> 
> Change Log:
> v4:
> - Address various comments from Shuah Khan:
>   1. Combine a few patches e.g. a couple of fixing typos patches into one
>      and a couple of unmounting patches into one etc.
>   2. Add config file.
>   3. Remove "Fixes" tags.
>   4. Change strcmp() to strncmp().
>   5. Move the global variable fixing patch to the patch 1 so that the
>      compilation issue is fixed first.

Any comment on this series?

Thank you very much for your review!

-Fenghua

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (17 preceding siblings ...)
  2020-12-11  0:21 ` [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Yu, Fenghua
@ 2021-01-25 20:47 ` Fenghua Yu
  2021-01-25 21:52   ` Shuah Khan
  2021-01-26  1:22 ` Shuah Khan
  2021-01-26 23:57 ` Shuah Khan
  20 siblings, 1 reply; 33+ messages in thread
From: Fenghua Yu @ 2021-01-25 20:47 UTC (permalink / raw)
  To: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar
  Cc: linux-kernel

Hi, Shuah,

On Mon, Nov 30, 2020 at 08:19:53PM +0000, Fenghua Yu wrote:
> This patch set has several miscellaneous fixes to resctrl selftest tool
> that are easily visible to user. V1 had fixes to CAT test and CMT test
> but they were dropped in V2 because having them here made the patchset
> humongous. So, changes to CAT test and CMT test will be posted in another
> patchset.
> 
> Change Log:
> v4:
> - Address various comments from Shuah Khan:
>   1. Combine a few patches e.g. a couple of fixing typos patches into one
>      and a couple of unmounting patches into one etc.

Just a friendly reminder. Will you push this series to the upstream?
Maybe I miss something but I don't see this series in the linux-kselftest
tree yet.

Thank you very much!

-Fenghua

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2021-01-25 20:47 ` Fenghua Yu
@ 2021-01-25 21:52   ` Shuah Khan
  2021-01-25 21:54     ` Fenghua Yu
  0 siblings, 1 reply; 33+ messages in thread
From: Shuah Khan @ 2021-01-25 21:52 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 1/25/21 1:47 PM, Fenghua Yu wrote:
> Hi, Shuah,
> 
> On Mon, Nov 30, 2020 at 08:19:53PM +0000, Fenghua Yu wrote:
>> This patch set has several miscellaneous fixes to resctrl selftest tool
>> that are easily visible to user. V1 had fixes to CAT test and CMT test
>> but they were dropped in V2 because having them here made the patchset
>> humongous. So, changes to CAT test and CMT test will be posted in another
>> patchset.
>>
>> Change Log:
>> v4:
>> - Address various comments from Shuah Khan:
>>    1. Combine a few patches e.g. a couple of fixing typos patches into one
>>       and a couple of unmounting patches into one etc.
> 
> Just a friendly reminder. Will you push this series to the upstream?
> Maybe I miss something but I don't see this series in the linux-kselftest
> tree yet.
> 

Sorry I am a bit behind on reviews. I will pull these fixes in this
week for 5.12-rc1 and will let you know if I would like changes.

thanks,
-- Shuah


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2021-01-25 21:52   ` Shuah Khan
@ 2021-01-25 21:54     ` Fenghua Yu
  0 siblings, 0 replies; 33+ messages in thread
From: Fenghua Yu @ 2021-01-25 21:54 UTC (permalink / raw)
  To: Shuah Khan
  Cc: Shuah Khan, Tony Luck, Reinette Chatre, David Binderman,
	Babu Moger, James Morse, Ravi V Shankar, linux-kernel

On Mon, Jan 25, 2021 at 02:52:09PM -0700, Shuah Khan wrote:
> On 1/25/21 1:47 PM, Fenghua Yu wrote:
> > On Mon, Nov 30, 2020 at 08:19:53PM +0000, Fenghua Yu wrote:
> > > This patch set has several miscellaneous fixes to resctrl selftest tool
> > > that are easily visible to user. V1 had fixes to CAT test and CMT test
> > > but they were dropped in V2 because having them here made the patchset
> > Just a friendly reminder. Will you push this series to the upstream?
> > Maybe I miss something but I don't see this series in the linux-kselftest
> > tree yet.
> > 
> 
> Sorry I am a bit behind on reviews. I will pull these fixes in this
> week for 5.12-rc1 and will let you know if I would like changes.

Really appreciate your help, Shuah!

-Fenghua

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (18 preceding siblings ...)
  2021-01-25 20:47 ` Fenghua Yu
@ 2021-01-26  1:22 ` Shuah Khan
  2021-01-26 23:57 ` Shuah Khan
  20 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  1:22 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> This patch set has several miscellaneous fixes to resctrl selftest tool
> that are easily visible to user. V1 had fixes to CAT test and CMT test
> but they were dropped in V2 because having them here made the patchset
> humongous. So, changes to CAT test and CMT test will be posted in another
> patchset.
> 
> Change Log:
> v4:
> - Address various comments from Shuah Khan:
>    1. Combine a few patches e.g. a couple of fixing typos patches into one
>       and a couple of unmounting patches into one etc.
>    2. Add config file.
>    3. Remove "Fixes" tags.
>    4. Change strcmp() to strncmp().
>    5. Move the global variable fixing patch to the patch 1 so that the
>       compilation issue is fixed first.
> 

Sorry for the delay. Please cc linux-kselftest in your next version.
I have a few comments on the patches.

thanks,
-- Shuah


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables
  2020-11-30 20:19 ` [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables Fenghua Yu
@ 2021-01-26  1:22   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  1:22 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> Reinette reported following compilation issue on Fedora 32, gcc version
> 10.1.1
> 
> /usr/bin/ld: cqm_test.o:<src_dir>/cqm_test.c:22: multiple definition of
> `cache_size'; cat_test.o:<src_dir>/cat_test.c:23: first defined here
> 
> The same issue is reported for long_mask, cbm_mask, count_of_bits etc
> variables as well. Compiler isn't happy because these variables are
> defined globally in two .c files namely cqm_test.c and cat_test.c and
> the compiler during compilation finds that the variable is already
> defined (multiple definition error).
> 
> Taking a closer look at the usage of these variables reveals that these
> variables are used only locally to functions such as cqm_resctrl_val()
> (defined in cqm_test.c) and cat_perf_miss_val() (defined in cat_test.c).
> These variables are not shared between those functions. So, there is no
> need for these variables to be global. Hence, fix this issue by making
> them local variables to the functions where they are used.
> 

Easy fix to this problem would be making these variables static to
these files. I am not seeing any real advantage to changing these
variable to local variables.

diff --git a/tools/testing/selftests/resctrl/cat_test.c 
b/tools/testing/selftests/resctrl/cat_test.c
index 5da43767b973..360456b8a1b6 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -17,10 +17,10 @@
  #define MAX_DIFF_PERCENT       4
  #define MAX_DIFF               1000000

-int count_of_bits;
-char cbm_mask[256];
-unsigned long long_mask;
-unsigned long cache_size;
+static int count_of_bits;
+static cbm_mask[256];
+static unsigned long long_mask;
+static unsigned long cache_size;

Same changes made to tools/testing/selftests/resctrl/cqm_test.c

> To fix issues for other global variables (e.g: bm_pid, ppid, llc_occup_path
> and is_amd) that are used across .c files, declare them as extern.
> 

This change is fine. Make this a separate patch.

This way, we can take it as a fixes to stables.

With the above the test builds fine. There is a bigger problem that
needs fixing: (thix might have been fixed in later patches perhaps):

cqm_test.c: In function ‘check_results’:
cqm_test.c:89:9: warning: ‘fgets’ writing 1024 bytes into a region of 
size 512 overflows the destination [-Wstringop-overflow=]
    89 |  while (fgets(temp, 1024, fp)) {
       |         ^~~~~~~~~~~~~~~~~~~~~
In file included from resctrl.h:5,
                  from cqm_test.c:11:
/usr/include/stdio.h:568:14: note: in a call to function ‘fgets’ 
declared with attribute ‘write_only (1, 2)’
   568 | extern char *fgets (char *__restrict __s, int __n, FILE 
*__restrict __stream)
       |              ^~~~~


thanks,
-- Shuah

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check
  2020-11-30 20:19 ` [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check Fenghua Yu
@ 2021-01-26  2:08   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:08 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> Checking resctrl features call strcmp() to compare feature strings
> (e.g. "mba", "cat" etc). The checkings are error prone and don't have
> good coding style. Define the constant strings in macros and call
> strncmp() to solve the potential issues.
> 
> Suggested-by: Shuah Khan <shuah@kernel.org>
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/cache.c       |  8 +++---
>   tools/testing/selftests/resctrl/cat_test.c    |  2 +-
>   tools/testing/selftests/resctrl/cqm_test.c    |  2 +-
>   tools/testing/selftests/resctrl/fill_buf.c    |  4 +--
>   tools/testing/selftests/resctrl/mba_test.c    |  2 +-
>   tools/testing/selftests/resctrl/mbm_test.c    |  2 +-
>   tools/testing/selftests/resctrl/resctrl.h     | 25 +++++++++++++++++++
>   .../testing/selftests/resctrl/resctrl_tests.c | 12 ++++-----
>   tools/testing/selftests/resctrl/resctrl_val.c | 19 ++++++--------
>   tools/testing/selftests/resctrl/resctrlfs.c   | 14 +++++------
>   10 files changed, 55 insertions(+), 35 deletions(-)
> 
> diff --git a/tools/testing/selftests/resctrl/cache.c b/tools/testing/selftests/resctrl/cache.c
> index 38dbf4962e33..248bf000c978 100644
> --- a/tools/testing/selftests/resctrl/cache.c
> +++ b/tools/testing/selftests/resctrl/cache.c
> @@ -182,7 +182,7 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
>   	/*
>   	 * Measure cache miss from perf.
>   	 */
> -	if (!strcmp(param->resctrl_val, "cat")) {
> +	if (is_cat(param->resctrl_val)) {

Is there reason to add this function for one line of code?
Same comment for all these is_* routines in this patch.

>   		ret = get_llc_perf(&llc_perf_miss);
>   		if (ret < 0)
>   			return ret;
> @@ -192,7 +192,7 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
>   	/*
>   	 * Measure llc occupancy from resctrl.
>   	 */
> -	if (!strcmp(param->resctrl_val, "cqm")) {
> +	if (is_cqm(param->resctrl_val)) {
>   		ret = get_llc_occu_resctrl(&llc_occu_resc);
>   		if (ret < 0)
>   			return ret;
> @@ -234,7 +234,7 @@ int cat_val(struct resctrl_val_param *param)
>   	if (ret)
>   		return ret;
>   
> -	if ((strcmp(resctrl_val, "cat") == 0)) {
> +	if (is_cat(resctrl_val)) {
>   		ret = initialize_llc_perf();
>   		if (ret)
>   			return ret;
> @@ -242,7 +242,7 @@ int cat_val(struct resctrl_val_param *param)
>   
>   	/* Test runs until the callback setup() tells the test to stop. */
>   	while (1) {
> -		if (strcmp(resctrl_val, "cat") == 0) {
> +		if (is_cat(resctrl_val)) {
>   			ret = param->setup(1, param);
>   			if (ret) {
>   				ret = 0;
> diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
> index 7f723bd8f328..6d9a41f3939a 100644
> --- a/tools/testing/selftests/resctrl/cat_test.c
> +++ b/tools/testing/selftests/resctrl/cat_test.c
> @@ -160,7 +160,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
>   		return -1;
>   
>   	struct resctrl_val_param param = {
> -		.resctrl_val	= "cat",
> +		.resctrl_val	= CAT_STR,
>   		.cpu_no		= cpu_no,
>   		.mum_resctrlfs	= 0,
>   		.setup		= cat_setup,
> diff --git a/tools/testing/selftests/resctrl/cqm_test.c b/tools/testing/selftests/resctrl/cqm_test.c
> index b6af940ccfc2..6635b24a74cc 100644
> --- a/tools/testing/selftests/resctrl/cqm_test.c
> +++ b/tools/testing/selftests/resctrl/cqm_test.c
> @@ -142,7 +142,7 @@ int cqm_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
>   	}
>   
>   	struct resctrl_val_param param = {
> -		.resctrl_val	= "cqm",
> +		.resctrl_val	= CQM_STR,
>   		.ctrlgrp	= "c1",
>   		.mongrp		= "m1",
>   		.cpu_no		= cpu_no,
> diff --git a/tools/testing/selftests/resctrl/fill_buf.c b/tools/testing/selftests/resctrl/fill_buf.c
> index 79c611c99a3d..bece8bb4b575 100644
> --- a/tools/testing/selftests/resctrl/fill_buf.c
> +++ b/tools/testing/selftests/resctrl/fill_buf.c
> @@ -115,7 +115,7 @@ static int fill_cache_read(unsigned char *start_ptr, unsigned char *end_ptr,
>   
>   	while (1) {
>   		ret = fill_one_span_read(start_ptr, end_ptr);
> -		if (!strcmp(resctrl_val, "cat"))
> +		if (is_cat(resctrl_val))
>   			break;
>   	}
>   
> @@ -134,7 +134,7 @@ static int fill_cache_write(unsigned char *start_ptr, unsigned char *end_ptr,
>   {
>   	while (1) {
>   		fill_one_span_write(start_ptr, end_ptr);
> -		if (!strcmp(resctrl_val, "cat"))
> +		if (is_cat(resctrl_val))
>   			break;
>   	}
>   
> diff --git a/tools/testing/selftests/resctrl/mba_test.c b/tools/testing/selftests/resctrl/mba_test.c
> index 7bf8eaa6204b..6449fbd96096 100644
> --- a/tools/testing/selftests/resctrl/mba_test.c
> +++ b/tools/testing/selftests/resctrl/mba_test.c
> @@ -141,7 +141,7 @@ void mba_test_cleanup(void)
>   int mba_schemata_change(int cpu_no, char *bw_report, char **benchmark_cmd)
>   {
>   	struct resctrl_val_param param = {
> -		.resctrl_val	= "mba",
> +		.resctrl_val	= MBA_STR,
>   		.ctrlgrp	= "c1",
>   		.mongrp		= "m1",
>   		.cpu_no		= cpu_no,
> diff --git a/tools/testing/selftests/resctrl/mbm_test.c b/tools/testing/selftests/resctrl/mbm_test.c
> index 4700f7453f81..ec6cfe01c9c2 100644
> --- a/tools/testing/selftests/resctrl/mbm_test.c
> +++ b/tools/testing/selftests/resctrl/mbm_test.c
> @@ -114,7 +114,7 @@ void mbm_test_cleanup(void)
>   int mbm_bw_change(int span, int cpu_no, char *bw_report, char **benchmark_cmd)
>   {
>   	struct resctrl_val_param param = {
> -		.resctrl_val	= "mbm",
> +		.resctrl_val	= MBM_STR,
>   		.ctrlgrp	= "c1",
>   		.mongrp		= "m1",
>   		.span		= span,
> diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
> index 12b77182cb44..bfbc16b39a9e 100644
> --- a/tools/testing/selftests/resctrl/resctrl.h
> +++ b/tools/testing/selftests/resctrl/resctrl.h
> @@ -62,6 +62,31 @@ struct resctrl_val_param {
>   	int		(*setup)(int num, ...);
>   };
>   
> +#define MBM_STR			"mbm"
> +#define MBA_STR			"mba"
> +#define CQM_STR			"cqm"
> +#define CAT_STR			"cat"
> +

This is fine.

> +static inline bool is_mbm(const char *str)
> +{
> +	return !strncmp(str, MBM_STR, 3);

Why not use sizeof(MBM_STR) instead of hardcoding?
Same comment on all the other such usahes below.

> +}
> +
There is no need to add an entire routine for this.

> +static inline bool is_mba(const char *str)
> +{
> +	return !strncmp(str, MBA_STR, 3);
> +}
> +

There is no need to add an entire routine for this.

> +static inline bool is_cqm(const char *str)
> +{
> +	return !strncmp(str, CQM_STR, 3);
> +}
> +

There is no need to add an entire routine for this.

> +static inline bool is_cat(const char *str)
> +{
> +	return !strncmp(str, CAT_STR, 3);
> +}
> +

There is no need to add an entire routine for this.

>   extern pid_t bm_pid, ppid;
>   extern int tests_run;
>   
> diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
> index 425cc85ac883..f425eaf8c331 100644
> --- a/tools/testing/selftests/resctrl/resctrl_tests.c
> +++ b/tools/testing/selftests/resctrl/resctrl_tests.c
> @@ -85,13 +85,13 @@ int main(int argc, char **argv)
>   			cqm_test = false;
>   			cat_test = false;
>   			while (token) {
> -				if (!strcmp(token, "mbm")) {
> +				if (is_mbm(token)) {
>   					mbm_test = true;
> -				} else if (!strcmp(token, "mba")) {
> +				} else if (is_mba(token)) {
>   					mba_test = true;
> -				} else if (!strcmp(token, "cqm")) {
> +				} else if (is_cqm(token)) {
>   					cqm_test = true;
> -				} else if (!strcmp(token, "cat")) {
> +				} else if (is_cat(token)) {
>   					cat_test = true;
>   				} else {
>   					printf("invalid argument\n");
> @@ -161,7 +161,7 @@ int main(int argc, char **argv)
>   	if (!is_amd && mbm_test) {
>   		printf("# Starting MBM BW change ...\n");
>   		if (!has_ben)
> -			sprintf(benchmark_cmd[5], "%s", "mba");
> +			sprintf(benchmark_cmd[5], "%s", MBA_STR);
>   		res = mbm_bw_change(span, cpu_no, bw_report, benchmark_cmd);
>   		printf("%sok MBM: bw change\n", res ? "not " : "");
>   		mbm_test_cleanup();
> @@ -181,7 +181,7 @@ int main(int argc, char **argv)
>   	if (cqm_test) {
>   		printf("# Starting CQM test ...\n");
>   		if (!has_ben)
> -			sprintf(benchmark_cmd[5], "%s", "cqm");
> +			sprintf(benchmark_cmd[5], "%s", CQM_STR);
>   		res = cqm_resctrl_val(cpu_no, no_of_bits, benchmark_cmd);
>   		printf("%sok CQM: test\n", res ? "not " : "");
>   		cqm_test_cleanup();
> diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
> index 520fea3606d1..f55e04a30a77 100644
> --- a/tools/testing/selftests/resctrl/resctrl_val.c
> +++ b/tools/testing/selftests/resctrl/resctrl_val.c
> @@ -397,10 +397,10 @@ static void initialize_mem_bw_resctrl(const char *ctrlgrp, const char *mongrp,
>   		return;
>   	}
>   
> -	if (strcmp(resctrl_val, "mbm") == 0)
> +	if (is_mbm(resctrl_val))
>   		set_mbm_path(ctrlgrp, mongrp, resource_id);
>   
> -	if ((strcmp(resctrl_val, "mba") == 0)) {
> +	if (is_mba(resctrl_val)) {
>   		if (ctrlgrp)
>   			sprintf(mbm_total_path, CON_MBM_LOCAL_BYTES_PATH,
>   				RESCTRL_PATH, ctrlgrp, resource_id);
> @@ -524,7 +524,7 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
>   		return;
>   	}
>   
> -	if (strcmp(resctrl_val, "cqm") == 0)
> +	if (is_cqm(resctrl_val))
>   		set_cqm_path(ctrlgrp, mongrp, resource_id);
>   }
>   
> @@ -579,8 +579,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
>   	if (strcmp(param->filename, "") == 0)
>   		sprintf(param->filename, "stdio");
>   
> -	if ((strcmp(resctrl_val, "mba")) == 0 ||
> -	    (strcmp(resctrl_val, "mbm")) == 0) {
> +	if (is_mba(resctrl_val) || is_mbm(resctrl_val)) {
>   		ret = validate_bw_report_request(param->bw_report);
>   		if (ret)
>   			return ret;
> @@ -674,15 +673,14 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
>   	if (ret)
>   		goto out;
>   
> -	if ((strcmp(resctrl_val, "mbm") == 0) ||
> -	    (strcmp(resctrl_val, "mba") == 0)) {
> +	if (is_mbm(resctrl_val) || is_mba(resctrl_val)) {
>   		ret = initialize_mem_bw_imc();
>   		if (ret)
>   			goto out;
>   
>   		initialize_mem_bw_resctrl(param->ctrlgrp, param->mongrp,
>   					  param->cpu_no, resctrl_val);
> -	} else if (strcmp(resctrl_val, "cqm") == 0)
> +	} else if (is_cqm(resctrl_val))
>   		initialize_llc_occu_resctrl(param->ctrlgrp, param->mongrp,
>   					    param->cpu_no, resctrl_val);
>   
> @@ -710,8 +708,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
>   
>   	/* Test runs until the callback setup() tells the test to stop. */
>   	while (1) {
> -		if ((strcmp(resctrl_val, "mbm") == 0) ||
> -		    (strcmp(resctrl_val, "mba") == 0)) {
> +		if (is_mbm(resctrl_val) || is_mba(resctrl_val)) {
>   			ret = param->setup(1, param);
>   			if (ret) {
>   				ret = 0;
> @@ -721,7 +718,7 @@ int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param)
>   			ret = measure_vals(param, &bw_resc_start);
>   			if (ret)
>   				break;
> -		} else if (strcmp(resctrl_val, "cqm") == 0) {
> +		} else if (is_cqm(resctrl_val)) {
>   			ret = param->setup(1, param);
>   			if (ret) {
>   				ret = 0;
> diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
> index 2a16100c9c3f..dc4f1286aefa 100644
> --- a/tools/testing/selftests/resctrl/resctrlfs.c
> +++ b/tools/testing/selftests/resctrl/resctrlfs.c
> @@ -334,7 +334,7 @@ void run_benchmark(int signum, siginfo_t *info, void *ucontext)
>   		operation = atoi(benchmark_cmd[4]);
>   		sprintf(resctrl_val, "%s", benchmark_cmd[5]);
>   
> -		if (strcmp(resctrl_val, "cqm") != 0)
> +		if (!is_cqm(resctrl_val))
>   			buffer_span = span * MB;
>   		else
>   			buffer_span = span;
> @@ -459,8 +459,7 @@ int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
>   		goto out;
>   
>   	/* Create mon grp and write pid into it for "mbm" and "cqm" test */
> -	if ((strcmp(resctrl_val, "cqm") == 0) ||
> -	    (strcmp(resctrl_val, "mbm") == 0)) {
> +	if (is_cqm(resctrl_val) || is_mbm(resctrl_val)) {
>   		if (strlen(mongrp)) {
>   			sprintf(monitorgroup_p, "%s/mon_groups", controlgroup);
>   			sprintf(monitorgroup, "%s/%s", monitorgroup_p, mongrp);
> @@ -505,9 +504,8 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
>   	int resource_id, ret = 0;
>   	FILE *fp;
>   
> -	if ((strcmp(resctrl_val, "mba") != 0) &&
> -	    (strcmp(resctrl_val, "cat") != 0) &&
> -	    (strcmp(resctrl_val, "cqm") != 0))
> +	if (!is_mba(resctrl_val) && !is_cat(resctrl_val) &&
> +	    !is_cqm(resctrl_val))
>   		return -ENOENT;
>   
>   	if (!schemata) {
> @@ -528,9 +526,9 @@ int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, char *resctrl_val)
>   	else
>   		sprintf(controlgroup, "%s/schemata", RESCTRL_PATH);
>   
> -	if (!strcmp(resctrl_val, "cat") || !strcmp(resctrl_val, "cqm"))
> +	if (is_cat(resctrl_val) || is_cqm(resctrl_val))
>   		sprintf(schema, "%s%d%c%s", "L3:", resource_id, '=', schemata);
> -	if (strcmp(resctrl_val, "mba") == 0)
> +	if (is_mba(resctrl_val))
>   		sprintf(schema, "%s%d%c%s", "MB:", resource_id, '=', schemata);
>   
>   	fp = fopen(controlgroup, "w");
> 

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 04/17] selftests/resctrl: Fix printed messages
  2020-11-30 20:19 ` [PATCH v4 04/17] selftests/resctrl: Fix printed messages Fenghua Yu
@ 2021-01-26  2:25   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:25 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> From: Reinette Chatre <reinette.chatre@intel.com>
> 
> Fix one instance where "not" (without a space) is printed on test
> failure resulting in output of "notok" on test failure.
> 
> Add a missing newline to the printed help text to improve readability.
> 
> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/cmt_test.c      | 2 +-
>   tools/testing/selftests/resctrl/resctrl_tests.c | 4 ++--
>   2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/testing/selftests/resctrl/cmt_test.c b/tools/testing/selftests/resctrl/cmt_test.c
> index 05a180d85e93..188b73b5a2cc 100644
> --- a/tools/testing/selftests/resctrl/cmt_test.c
> +++ b/tools/testing/selftests/resctrl/cmt_test.c
> @@ -53,7 +53,7 @@ static void show_cache_info(unsigned long sum_llc_occu_resc, int no_of_bits,
>   	else
>   		res = false;
>   
> -	printf("%sok CMT: diff within %d, %d\%%\n", res ? "" : "not",
> +	printf("%sok CMT: diff within %d, %d\%%\n", res ? "" : "not ",
>   	       MAX_DIFF, (int)MAX_DIFF_PERCENT);
>   

I noticed show_cache_info() is a duplicate of the one in cqm_test.c
Let's make this a common function.

I would make this a separate patch and before 2/7

>   	printf("# diff: %ld\n", avg_diff);
> diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
> index 2dceff59e245..d92b0b32a349 100644
> --- a/tools/testing/selftests/resctrl/resctrl_tests.c
> +++ b/tools/testing/selftests/resctrl/resctrl_tests.c
> @@ -37,8 +37,8 @@ void detect_amd(void)
>   static void cmd_help(void)
>   {
>   	printf("usage: resctrl_tests [-h] [-b \"benchmark_cmd [options]\"] [-t test list] [-n no_of_bits]\n");
> -	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT");
> -	printf("\t default benchmark is builtin fill_buf\n");
> +	printf("\t-b benchmark_cmd [options]: run specified benchmark for MBM, MBA and CMT\n");
> +	printf("\t   default benchmark is builtin fill_buf\n");
>   	printf("\t-t test list: run tests specified in the test list, ");
>   	printf("e.g. -t mbm, mba, cmt, cat\n");
>   	printf("\t-n no_of_bits: run cache tests using specified no of bits in cache bit mask\n");
> 

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 05/17] selftests/resctrl: Add a few dependencies
  2020-11-30 20:19 ` [PATCH v4 05/17] selftests/resctrl: Add a few dependencies Fenghua Yu
@ 2021-01-26  2:29   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:29 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> Add a couple of sanity checks and the config file for test dependencies.
> 
> Running any resctrl unit test involves writing to resctrl file system
> and only a root user has permission to write to resctrl FS. Resctrl
> test suite before running any test checks for the privilege of the
> user and if it's not a root user, the test suite prints a warning
> and continues attempting to run tests.
> 
> Attempting to run any test without root privileges will fail as below
> 
> TAP version 13
> ok kernel supports resctrl filesystem
> .................
> not ok mounting resctrl to "/sys/fs/resctrl"
> not ok MBA: schemata change
> 
> Hence, don't attempt to run any test if the user is not a root user and
> change the warning message to a bail out message to comply with TAP 13
> standards.
> 
> Regarding the second check, check_resctrlfs_support() checks if the
> platform supports resctrl file system or not by looking for resctrl
> in /proc/filesystems and returns a boolean value. The main function
> of resctrl test suite calls check_resctrlfs_support() but forgets to
> check for it's return value. This means that resctrl test suite will
> attempt to run resctrl tests (like CMT, CAT, MBM and MBA) even if the
> platform doesn't support resctrl file system.
> 
> Fix this by checking for the return value of check_resctrlfs_support() in
> the main function. If resctrl file system isn't supported on the platform
> then exit the test suite gracefully without attempting to run any of
> resctrl unit tests.
> 

Please use kselftest.h instead of adding TAP stuff. This way if updates
to newer TAP will not require changes.

thanks,
-- Shuah


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported
  2020-11-30 20:19 ` [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported Fenghua Yu
@ 2021-01-26  2:32   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:32 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> check_resctrlfs_support() does the following
> 1. Checks if the platform supports resctrl file system or not by looking
>     for resctrl in /proc/filesystems
> 2. Calls opendir() on default resctrl file system path
>     (i.e. /sys/fs/resctrl)
> 3. Checks if resctrl file system is mounted or not by looking at
>     /proc/mounts
> 
> Steps 2 and 3 will fail if the platform does not support resctrl file
> system. So, there is no need to check for them if step 1 fails.
> 
> Fix this by returning immediately if the platform does not support
> resctrl file system.
> 
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/resctrlfs.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
> index 2c574d143ff0..c676557b376d 100644
> --- a/tools/testing/selftests/resctrl/resctrlfs.c
> +++ b/tools/testing/selftests/resctrl/resctrlfs.c
> @@ -579,6 +579,9 @@ bool check_resctrlfs_support(void)
>   	printf("%sok kernel supports resctrl filesystem\n", ret ? "" : "not ");

Same comment. Please use kselftest API in kselftest.h for TAP.

>   	tests_run++;
>   
> +	if (!ret)
> +		return ret;
> +
>   	dp = opendir(RESCTRL_PATH);
>   	printf("%sok resctrl mountpoint \"%s\" exists\n",
>   	       dp ? "" : "not ", RESCTRL_PATH);

Same comment. Please use kselftest API in kselftest.h for TAP.
> 

Otherwise looks good.

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU
  2020-11-30 20:20 ` [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU Fenghua Yu
@ 2021-01-26  2:35   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:35 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:20 PM, Fenghua Yu wrote:
> From: Reinette Chatre <reinette.chatre@intel.com>
> 
> The resctrl tests can accept a CPU on which the tests are run and use
> default of CPU #1 if it is not provided. In the CAT test a "sibling CPU"
> is determined that is from the same package where another thread will be
> run.
> 
> The current algorithm with which a "sibling CPU" is determined does not
> take the provided/default CPU into account and when that CPU is the
> first CPU in a package then the "sibling CPU" will be selected to be the
> same CPU since it starts by picking the first CPU from core_siblings_list.
> 
> Fix the "sibling CPU" selection by taking the provided/default CPU into
> account and ensuring a sibling that is a different CPU is selected.
> 
> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/resctrlfs.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
> index d2cae4927b62..3f43bcf0b8d5 100644
> --- a/tools/testing/selftests/resctrl/resctrlfs.c
> +++ b/tools/testing/selftests/resctrl/resctrlfs.c
> @@ -268,7 +268,7 @@ int get_core_sibling(int cpu_no)
>   	while (token) {
>   		sibling_cpu_no = atoi(token);
>   		/* Skipping core 0 as we don't want to run test on core 0 */
> -		if (sibling_cpu_no != 0)
> +		if (sibling_cpu_no != 0 && sibling_cpu_no != cpu_no)
>   			break;
>   		token = strtok(NULL, "-,");
>   	}
> 

Shouldn't this be fixed first before the cleanup and restructure
changes?

Please make this patch 3.

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p"
  2020-11-30 20:20 ` [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p" Fenghua Yu
@ 2021-01-26  2:36   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:36 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:20 PM, Fenghua Yu wrote:
> resctrl test suite accepts command line arguments (like -b, -t, -n and -p)
> as documented in the help. But passing -n and -p throws an invalid option
> error. This happens because -n and -p are missing in the list of
> characters that getopt() recognizes as valid arguments. Hence, they are
> treated as invalid options.
> 
> Fix this by adding them to the list of characters that getopt() recognizes
> as valid arguments. Please note that the main() function already has the
> logic to deal with the values passed as part of these arguments and hence
> no changes are needed there.
> 
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/resctrl_tests.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c
> index 0e036dbf5d17..ef09e0ef2366 100644
> --- a/tools/testing/selftests/resctrl/resctrl_tests.c
> +++ b/tools/testing/selftests/resctrl/resctrl_tests.c
> @@ -73,7 +73,7 @@ int main(int argc, char **argv)
>   		}
>   	}
>   
> -	while ((c = getopt(argc_new, argv, "ht:b:")) != -1) {
> +	while ((c = getopt(argc_new, argv, "ht:b:n:p:")) != -1) {
>   		char *token;
>   
>   		switch (c) {
> 

Same comment. Please make this change before making the cleanup changes.

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format
  2020-11-30 20:20 ` [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format Fenghua Yu
@ 2021-01-26  2:38   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:38 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:20 PM, Fenghua Yu wrote:
> MBM unit test starts fill_buf (default built-in benchmark) in a new con_mon
> group (c1, m1) and records resctrl reported mbm values and iMC (Integrated
> Memory Controller) values every second. It does this for five seconds
> (randomly chosen value) in total. It then calculates average of resctrl_mbm
> values and imc_mbm values and if the difference is greater than 300 MB/sec
> (randomly chosen value), the test treats it as a failure. MBA unit test is
> similar to MBM but after every run it changes schemata.
> 
> Checking for a difference of 300 MB/sec doesn't look very meaningful when
> the mbm values are changing over a wide range. For example, below are the
> values running MBA test on SKL with different allocations
> 
> 1. With 10% as schemata both iMC and resctrl mbm_values are around 2000
>     MB/sec
> 2. With 100% as schemata both iMC and resctrl mbm_values are around 10000
>     MB/sec
> 
> A 300 MB/sec difference between resctrl_mbm and imc_mbm values is
> acceptable at 100% schemata but it isn't acceptable at 10% schemata because
> that's a huge difference.
> 
> So, fix this by checking for percentage difference instead of absolute
> difference i.e. check if the difference between resctrl_mbm value and
> imc_mbm value is within 5% (randomly chosen value) of imc_mbm value. If the
> difference is greater than 5% of imc_mbm value, treat it is a failure.
> 
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/mba_test.c | 20 +++++++++++---------
>   tools/testing/selftests/resctrl/mbm_test.c | 13 +++++++------
>   2 files changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/tools/testing/selftests/resctrl/mba_test.c b/tools/testing/selftests/resctrl/mba_test.c
> index 6449fbd96096..b4c81d2ee53b 100644
> --- a/tools/testing/selftests/resctrl/mba_test.c
> +++ b/tools/testing/selftests/resctrl/mba_test.c
> @@ -12,7 +12,7 @@
>   
>   #define RESULT_FILE_NAME	"result_mba"
>   #define NUM_OF_RUNS		5
> -#define MAX_DIFF		300
> +#define MAX_DIFF_PERCENT	5
>   #define ALLOCATION_MAX		100
>   #define ALLOCATION_MIN		10
>   #define ALLOCATION_STEP		10
> @@ -62,7 +62,8 @@ static void show_mba_info(unsigned long *bw_imc, unsigned long *bw_resc)
>   	     allocation++) {
>   		unsigned long avg_bw_imc, avg_bw_resc;
>   		unsigned long sum_bw_imc = 0, sum_bw_resc = 0;
> -		unsigned long avg_diff;
> +		int avg_diff_per;
> +		float avg_diff;
>   
>   		/*
>   		 * The first run is discarded due to inaccurate value from
> @@ -76,17 +77,18 @@ static void show_mba_info(unsigned long *bw_imc, unsigned long *bw_resc)
>   
>   		avg_bw_imc = sum_bw_imc / (NUM_OF_RUNS - 1);
>   		avg_bw_resc = sum_bw_resc / (NUM_OF_RUNS - 1);
> -		avg_diff = labs((long)(avg_bw_resc - avg_bw_imc));
> +		avg_diff = (float)labs(avg_bw_resc - avg_bw_imc) / avg_bw_imc;
> +		avg_diff_per = (int)(avg_diff * 100);
>   
> -		printf("%sok MBA schemata percentage %u smaller than %d %%\n",
> -		       avg_diff > MAX_DIFF ? "not " : "",
> -		       ALLOCATION_MAX - ALLOCATION_STEP * allocation,
> -		       MAX_DIFF);
> +		printf("%sok MBA: diff within %d%% for schemata %u\n",
> +		       avg_diff_per > MAX_DIFF_PERCENT ? "not " : "",
> +		       MAX_DIFF_PERCENT,
> +		       ALLOCATION_MAX - ALLOCATION_STEP * allocation);
>   		tests_run++;
> -		printf("# avg_diff: %lu\n", avg_diff);
> +		printf("# avg_diff_per: %d%%\n", avg_diff_per);
>   		printf("# avg_bw_imc: %lu\n", avg_bw_imc);
>   		printf("# avg_bw_resc: %lu\n", avg_bw_resc);
> -		if (avg_diff > MAX_DIFF)
> +		if (avg_diff_per > MAX_DIFF_PERCENT)
>   			failed = true;
>   	}
>   
> diff --git a/tools/testing/selftests/resctrl/mbm_test.c b/tools/testing/selftests/resctrl/mbm_test.c
> index ec6cfe01c9c2..672d3ddd6e85 100644
> --- a/tools/testing/selftests/resctrl/mbm_test.c
> +++ b/tools/testing/selftests/resctrl/mbm_test.c
> @@ -11,7 +11,7 @@
>   #include "resctrl.h"
>   
>   #define RESULT_FILE_NAME	"result_mbm"
> -#define MAX_DIFF		300
> +#define MAX_DIFF_PERCENT	5
>   #define NUM_OF_RUNS		5
>   
>   static void
> @@ -19,8 +19,8 @@ show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, int span)
>   {
>   	unsigned long avg_bw_imc = 0, avg_bw_resc = 0;
>   	unsigned long sum_bw_imc = 0, sum_bw_resc = 0;
> -	long avg_diff = 0;
> -	int runs;
> +	int runs, avg_diff_per;
> +	float avg_diff = 0;
>   
>   	/*
>   	 * Discard the first value which is inaccurate due to monitoring setup
> @@ -33,12 +33,13 @@ show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, int span)
>   
>   	avg_bw_imc = sum_bw_imc / 4;
>   	avg_bw_resc = sum_bw_resc / 4;
> -	avg_diff = avg_bw_resc - avg_bw_imc;
> +	avg_diff = (float)labs(avg_bw_resc - avg_bw_imc) / avg_bw_imc;
> +	avg_diff_per = (int)(avg_diff * 100);
>   
>   	printf("%sok MBM: diff within %d%%\n",
> -	       labs(avg_diff) > MAX_DIFF ? "not " : "", MAX_DIFF);
> +	       avg_diff_per > MAX_DIFF_PERCENT ? "not " : "", MAX_DIFF_PERCENT);
>   	tests_run++;
> -	printf("# avg_diff: %lu\n", labs(avg_diff));
> +	printf("# avg_diff_per: %d%%\n", avg_diff_per);
>   	printf("# Span (MB): %d\n", span);
>   	printf("# avg_bw_imc: %lu\n", avg_bw_imc);
>   	printf("# avg_bw_resc: %lu\n", avg_bw_resc);
> 

Can we move all the name changes after the real fixes?

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows
  2020-11-30 20:20 ` [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows Fenghua Yu
@ 2021-01-26  2:38   ` Shuah Khan
  0 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26  2:38 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:20 PM, Fenghua Yu wrote:
> David reported a buffer overflow error in the check_results() function of
> the cmt unit test and he suggested enabling _FORTIFY_SOURCE gcc compiler
> option to automatically detect any such errors.
> 
> Feature Test Macros man page describes_FORTIFY_SOURCE as below
> 
> "Defining this macro causes some lightweight checks to be performed to
> detect some buffer overflow errors when employing various string and memory
> manipulation functions (for example, memcpy, memset, stpcpy, strcpy,
> strncpy, strcat, strncat, sprintf, snprintf, vsprintf, vsnprintf, gets, and
> wide character variants thereof). For some functions, argument consistency
> is checked; for example, a check is made that open has been supplied with a
> mode argument when the specified flags include O_CREAT. Not all problems
> are detected, just some common cases.
> 
> If _FORTIFY_SOURCE is set to 1, with compiler optimization level 1 (gcc
> -O1) and above, checks that shouldn't change the behavior of conforming
> programs are performed.
> 
> With _FORTIFY_SOURCE set to 2, some more checking is added, but some
> conforming programs might fail.
> 
> Some of the checks can be performed at compile time (via macros logic
> implemented in header files), and result in compiler warnings; other checks
> take place at run time, and result in a run-time error if the check fails.
> 
> Use of this macro requires compiler support, available with gcc since
> version 4.0."
> 
> Fix the buffer overflow error in the check_results() function of the cmt
> unit test and enable _FORTIFY_SOURCE gcc check to catch any future buffer
> overflow errors.
> 
> Reported-by: David Binderman <dcb314@hotmail.com>
> Suggested-by: David Binderman <dcb314@hotmail.com>
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>   tools/testing/selftests/resctrl/Makefile   | 2 +-
>   tools/testing/selftests/resctrl/cmt_test.c | 2 +-
>   2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/resctrl/Makefile b/tools/testing/selftests/resctrl/Makefile
> index d585cc1948cc..6bcee2ec91a9 100644
> --- a/tools/testing/selftests/resctrl/Makefile
> +++ b/tools/testing/selftests/resctrl/Makefile
> @@ -1,5 +1,5 @@
>   CC = $(CROSS_COMPILE)gcc
> -CFLAGS = -g -Wall
> +CFLAGS = -g -Wall -O2 -D_FORTIFY_SOURCE=2
>   SRCS=$(wildcard *.c)
>   OBJS=$(SRCS:.c=.o)
>   
> diff --git a/tools/testing/selftests/resctrl/cmt_test.c b/tools/testing/selftests/resctrl/cmt_test.c
> index 188b73b5a2cc..ac1a33d9ce12 100644
> --- a/tools/testing/selftests/resctrl/cmt_test.c
> +++ b/tools/testing/selftests/resctrl/cmt_test.c
> @@ -81,7 +81,7 @@ static int check_results(struct resctrl_val_param *param, int no_of_bits)
>   		return errno;
>   	}
>   
> -	while (fgets(temp, 1024, fp)) {
> +	while (fgets(temp, sizeof(temp), fp)) {
>   		char *token = strtok(temp, ":\t");
>   		int fields = 0;
>   
> 

This should be fixed first before the other changes.

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests
  2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
                   ` (19 preceding siblings ...)
  2021-01-26  1:22 ` Shuah Khan
@ 2021-01-26 23:57 ` Shuah Khan
  20 siblings, 0 replies; 33+ messages in thread
From: Shuah Khan @ 2021-01-26 23:57 UTC (permalink / raw)
  To: Fenghua Yu, Shuah Khan, Tony Luck, Reinette Chatre,
	David Binderman, Babu Moger, James Morse, Ravi V Shankar,
	Shuah Khan
  Cc: linux-kernel

On 11/30/20 1:19 PM, Fenghua Yu wrote:
> This patch set has several miscellaneous fixes to resctrl selftest tool
> that are easily visible to user. V1 had fixes to CAT test and CMT test
> but they were dropped in V2 because having them here made the patchset
> humongous. So, changes to CAT test and CMT test will be posted in another
> patchset.
> 
> Change Log:
> v4:
> - Address various comments from Shuah Khan:
>    1. Combine a few patches e.g. a couple of fixing typos patches into one
>       and a couple of unmounting patches into one etc.
>    2. Add config file.
>    3. Remove "Fixes" tags.
>    4. Change strcmp() to strncmp().
>    5. Move the global variable fixing patch to the patch 1 so that the
>       compilation issue is fixed first.
> 

Please add .gitignore for the directory.

git status shows:
tools/testing/selftests/resctrl/resctrl_tests

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2021-01-27  3:49 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-30 20:19 [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Fenghua Yu
2020-11-30 20:19 ` [PATCH v4 01/17] selftests/resctrl: Fix compilation issues for global variables Fenghua Yu
2021-01-26  1:22   ` Shuah Khan
2020-11-30 20:19 ` [PATCH v4 02/17] selftests/resctrl: Clean up resctrl features check Fenghua Yu
2021-01-26  2:08   ` Shuah Khan
2020-11-30 20:19 ` [PATCH v4 03/17] selftests/resctrl: Rename CQM test as CMT test Fenghua Yu
2020-11-30 20:19 ` [PATCH v4 04/17] selftests/resctrl: Fix printed messages Fenghua Yu
2021-01-26  2:25   ` Shuah Khan
2020-11-30 20:19 ` [PATCH v4 05/17] selftests/resctrl: Add a few dependencies Fenghua Yu
2021-01-26  2:29   ` Shuah Khan
2020-11-30 20:19 ` [PATCH v4 06/17] selftests/resctrl: Check for resctrl mount point only if resctrl FS is supported Fenghua Yu
2021-01-26  2:32   ` Shuah Khan
2020-11-30 20:20 ` [PATCH v4 07/17] selftests/resctrl: Use resctrl/info for feature detection Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 08/17] selftests/resctrl: Ensure sibling CPU is not same as original CPU Fenghua Yu
2021-01-26  2:35   ` Shuah Khan
2020-11-30 20:20 ` [PATCH v4 09/17] selftests/resctrl: Fix missing options "-n" and "-p" Fenghua Yu
2021-01-26  2:36   ` Shuah Khan
2020-11-30 20:20 ` [PATCH v4 10/17] selftests/resctrl: Fix MBA/MBM results reporting format Fenghua Yu
2021-01-26  2:38   ` Shuah Khan
2020-11-30 20:20 ` [PATCH v4 11/17] selftests/resctrl: Enable gcc checks to detect buffer overflows Fenghua Yu
2021-01-26  2:38   ` Shuah Khan
2020-11-30 20:20 ` [PATCH v4 12/17] selftests/resctrl: Don't hard code value of "no_of_bits" variable Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 13/17] selftests/resctrl: Modularize resctrl test suite main() function Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 14/17] selftests/resctrl: Skip the test if requested resctrl feature is not supported Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 15/17] selftests/resctrl: Fix unmount resctrl FS Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 16/17] selftests/resctrl: Fix incorrect parsing of iMC counters Fenghua Yu
2020-11-30 20:20 ` [PATCH v4 17/17] selftests/resctrl: Fix checking for < 0 for unsigned values Fenghua Yu
2020-12-11  0:21 ` [PATCH v4 00/17] Miscellaneous fixes for resctrl selftests Yu, Fenghua
2021-01-25 20:47 ` Fenghua Yu
2021-01-25 21:52   ` Shuah Khan
2021-01-25 21:54     ` Fenghua Yu
2021-01-26  1:22 ` Shuah Khan
2021-01-26 23:57 ` Shuah Khan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).