The CPU vendor IDs are required to be unique bits because they're used
for vendor_specific bitmask in the struct resctrl_test.
Consider for example their usage in test_vendor_specific_check():
        return get_vendor() & test->vendor_specific

However, the definitions of CPU vendor IDs in file resctrl.h is quite
subtle as a bitmask value:
  #define ARCH_INTEL     1
  #define ARCH_AMD       2

A clearer and more maintainable approach is to define these CPU vendor
IDs using BIT(). This ensures each vendor corresponds to a distinct bit
and makes it obvious when adding new vendor IDs.

Accordingly, update the return types of detect_vendor() and get_vendor()
from 'int' to 'unsigned int' to align with their usage as bitmask values
and to prevent potentially risky type conversions.

Furthermore, introduce a bool flag 'initialized' to simplify the
get_vendor() -> detect_vendor() logic. This ensures the vendor ID is
detected only once and resolves the ambiguity of using the same variable
'vendor' both as a value and as a state.

Suggested-by: Reinette Chatre <[email protected]>
Suggested-by: Fenghua Yu <[email protected]>
Signed-off-by: Xiaochen Shen <[email protected]>
---
 tools/testing/selftests/resctrl/resctrl.h     |  7 ++---
 .../testing/selftests/resctrl/resctrl_tests.c | 26 +++++++++++++------
 2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl.h 
b/tools/testing/selftests/resctrl/resctrl.h
index cd3adfc14969..d0f094360e6f 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -23,6 +23,7 @@
 #include <asm/unistd.h>
 #include <linux/perf_event.h>
 #include <linux/compiler.h>
+#include <linux/bits.h>
 #include "../kselftest.h"
 
 #define MB                     (1024 * 1024)
@@ -36,8 +37,8 @@
  * Define as bits because they're used for vendor_specific bitmask in
  * the struct resctrl_test.
  */
-#define ARCH_INTEL     1
-#define ARCH_AMD       2
+#define ARCH_INTEL     BIT(0)
+#define ARCH_AMD       BIT(1)
 
 #define END_OF_TESTS   1
 
@@ -163,7 +164,7 @@ extern int snc_unreliable;
 extern char llc_occup_path[1024];
 
 int snc_nodes_per_l3_cache(void);
-int get_vendor(void);
+unsigned int get_vendor(void);
 bool check_resctrlfs_support(void);
 int filter_dmesg(void);
 int get_domain_id(const char *resource, int cpu_no, int *domain_id);
diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c 
b/tools/testing/selftests/resctrl/resctrl_tests.c
index 5154ffd821c4..08cbd094e936 100644
--- a/tools/testing/selftests/resctrl/resctrl_tests.c
+++ b/tools/testing/selftests/resctrl/resctrl_tests.c
@@ -23,16 +23,24 @@ static struct resctrl_test *resctrl_tests[] = {
        &l2_noncont_cat_test,
 };
 
-static int detect_vendor(void)
+static unsigned int detect_vendor(void)
 {
-       FILE *inf = fopen("/proc/cpuinfo", "r");
-       int vendor_id = 0;
+       static bool initialized;
+       static unsigned int vendor_id;
+       FILE *inf;
        char *s = NULL;
        char *res;
 
-       if (!inf)
+       if (initialized)
                return vendor_id;
 
+       inf = fopen("/proc/cpuinfo", "r");
+       if (!inf) {
+               vendor_id = 0;
+               initialized = true;
+               return vendor_id;
+       }
+
        res = fgrep(inf, "vendor_id");
 
        if (res)
@@ -45,15 +53,17 @@ static int detect_vendor(void)
 
        fclose(inf);
        free(res);
+
+       initialized = true;
        return vendor_id;
 }
 
-int get_vendor(void)
+unsigned int get_vendor(void)
 {
-       static int vendor = -1;
+       unsigned int vendor;
+
+       vendor = detect_vendor();
 
-       if (vendor == -1)
-               vendor = detect_vendor();
        if (vendor == 0)
                ksft_print_msg("Can not get vendor info...\n");
 
-- 
2.47.3


Reply via email to