Patch "selftests/resctrl: Use resctrl/info for feature detection" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    selftests/resctrl: Use resctrl/info for feature detection

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selftests-resctrl-use-resctrl-info-for-feature-detec.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1aa1e155bdf4fcecfe80c48d0163fc60e12c65be
Author: Fenghua Yu <fenghua.yu@xxxxxxxxx>
Date:   Wed Mar 17 02:22:47 2021 +0000

    selftests/resctrl: Use resctrl/info for feature detection
    
    [ Upstream commit ee0415681eb661efa1eb2db7acc263f2c7df1e23 ]
    
    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@xxxxxxxxx>
    Tested-by: Babu Moger <babu.moger@xxxxxxx>
    Signed-off-by: Fenghua Yu <fenghua.yu@xxxxxxxxx>
    Signed-off-by: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index 36da6136af96..9dcc96e1ad3d 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 {					\
@@ -79,7 +83,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 4174e48e06d1..b57170f53861 100644
--- a/tools/testing/selftests/resctrl/resctrlfs.c
+++ b/tools/testing/selftests/resctrl/resctrlfs.c
@@ -616,26 +616,56 @@ 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 (!strncmp(resctrl_val, CAT_STR, sizeof(CAT_STR))) {
+		if (!stat(L3_PATH, &statbuf))
+			return true;
+	} else if (!strncmp(resctrl_val, MBA_STR, sizeof(MBA_STR))) {
+		if (!stat(MB_PATH, &statbuf))
+			return true;
+	} else if (!strncmp(resctrl_val, MBM_STR, sizeof(MBM_STR)) ||
+		   !strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR))) {
+		if (!stat(L3_MON_PATH, &statbuf)) {
+			inf = fopen(L3_MON_FEATURES_PATH, "r");
+			if (!inf)
+				return false;
+
+			if (!strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR))) {
+				res = fgrep(inf, "llc_occupancy");
+				if (res) {
+					found = true;
+					free(res);
+				}
+			}
+
+			if (!strncmp(resctrl_val, MBM_STR, sizeof(MBM_STR))) {
+				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;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux