[PATCH] tst_test: Add needs_cpu_vendor to struct tst_test

Cyril Hrubis <[email protected]>
Newsgroups gmane.linux.ltp
Message-ID <[email protected]>
This adds a generic implementaiton of needs_cpu_vendor to the tst_test
structure that is based on parsing /proc/cpuinfo. It does not likely
work for non-x86 CPUs since the /proc/cpuinfo format is different, but
we do not care at the moment. For arm we would have to look at the
implementer field instead, we will add that if/once needed.

Signed-off-by: Cyril Hrubis <[email protected]>
CC: Piotr Kubaj <[email protected]>
---
 include/tst_cpu.h                  |  9 +++++++++
 include/tst_test.h                 |  5 +++++
 lib/newlib_tests/.gitignore        |  1 +
 lib/newlib_tests/test_cpu_vendor.c | 16 ++++++++++++++++
 lib/tst_cpu.c                      | 18 ++++++++++++++++++
 lib/tst_test.c                     |  5 +++++
 6 files changed, 54 insertions(+)
 create mode 100644 lib/newlib_tests/test_cpu_vendor.c

diff --git a/include/tst_cpu.h b/include/tst_cpu.h
index 0724975f0..31222a3e1 100644
--- a/include/tst_cpu.h
+++ b/include/tst_cpu.h
@@ -10,6 +10,13 @@ long tst_ncpus_conf(void);
 long tst_ncpus_max(void);
 long tst_ncpus_available(void);
 
+/**
+ * tst_cpu_vendor() - Returns CPU vendor.
+ *
+ * Return: A CPU vendor e.g. "GenuineIntel" or "AuthenticAMD".
+ */
+const char *tst_cpu_vendor(void);
+
 #define VIRT_ANY	0	/* catch-all argument for tst_is_virt() */
 #define VIRT_XEN	1	/* xen dom0/domU */
 #define VIRT_KVM	2	/* only default virtual CPU */
@@ -21,4 +28,6 @@ long tst_ncpus_available(void);
 
 int tst_is_virt(int virt_type);
 
+
+
 #endif	/* TST_CPU_H__ */
diff --git a/include/tst_test.h b/include/tst_test.h
index 9bc67cf6a..c69362485 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -391,6 +391,9 @@ struct tst_fs {
  *
  * @min_cpus: Minimal number of online CPUs the test needs to run.
  *
+ * @needs_cpu_vendor: The test needs a specific CPU vendor e.g. "GenuineIntel"
+ *                    or "AuthenticAMD".
+ *
  * @min_mem_avail: Minimal amount of available RAM memory in megabytes required
  *                 for the test to run.
  *
@@ -581,6 +584,8 @@ struct tst_fs {
 	const char *const *skip_filesystems;
 
 	unsigned long min_cpus;
+	const char *needs_cpu_vendor;
+
 	unsigned long min_mem_avail;
 	unsigned long min_swap_avail;
 
diff --git a/lib/newlib_tests/.gitignore b/lib/newlib_tests/.gitignore
index 1586e0ad6..b85163824 100644
--- a/lib/newlib_tests/.gitignore
+++ b/lib/newlib_tests/.gitignore
@@ -71,3 +71,4 @@ test_brk_parent
 test_brk_pass
 test_brk_variant
 test_fail_variant
+test_cpu_vendor
diff --git a/lib/newlib_tests/test_cpu_vendor.c b/lib/newlib_tests/test_cpu_vendor.c
new file mode 100644
index 000000000..10b473b7e
--- /dev/null
+++ b/lib/newlib_tests/test_cpu_vendor.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2026 Cyril Hrubis <[email protected]>
+ */
+
+#include "tst_test.h"
+
+static void do_test(void)
+{
+	tst_res(TPASS, "Test passed!");
+}
+
+static struct tst_test test = {
+	.test_all = do_test,
+	.needs_cpu_vendor = "Nonexistent",
+};
diff --git a/lib/tst_cpu.c b/lib/tst_cpu.c
index faffcba91..177661c82 100644
--- a/lib/tst_cpu.c
+++ b/lib/tst_cpu.c
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include "test.h"
 #include "tso_safe_macros.h"
+#include "tso_safe_file_ops.h"
 
 long tst_ncpus(void)
 {
@@ -97,3 +98,20 @@ long tst_ncpus_available(void)
 	return tst_ncpus();
 #endif
 }
+
+const char *tst_cpu_vendor(void)
+{
+	static char cpu_vendor[16];
+	int ret;
+
+	if (cpu_vendor[0])
+		return cpu_vendor;
+
+	ret = FILE_LINES_SCANF(NULL, "/proc/cpuinfo", "vendor_id : %16s[^\n]", cpu_vendor);
+	if (ret)
+		strcpy(cpu_vendor, "Unknown");
+
+	tst_resm(TDEBUG, "CPU vendor '%s'", cpu_vendor);
+
+	return cpu_vendor;
+}
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 0bebb0a3e..5f7156403 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -1416,6 +1416,11 @@ static void do_setup(int argc, char *argv[])
 	if (tst_test->supported_archs && !tst_is_on_arch(tst_test->supported_archs))
 		tst_brk(TCONF, "This arch '%s' is not supported for test!", tst_arch.name);
 
+	if (tst_test->needs_cpu_vendor && strcmp(tst_test->needs_cpu_vendor, tst_cpu_vendor())) {
+		tst_brk(TCONF, "Tests needs '%s' CPU to continue have '%s'",
+			tst_test->needs_cpu_vendor, tst_cpu_vendor());
+	}
+
 	if (tst_test->sample)
 		tst_test = tst_timer_test_setup(tst_test);
 
-- 
2.53.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.