xref: /linux/tools/testing/selftests/bpf/prog_tests/cpu_mask.c (revision 40d269c000bda9fcd276a0412a9cebd3f6e344c5)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
3 #include <bpf/btf.h>
4 #include "bpf/libbpf_internal.h"
5 
6 static int duration = 0;
7 
8 static void validate_mask(int case_nr, const char *exp, bool *mask, int n)
9 {
10 	int i;
11 
12 	for (i = 0; exp[i]; i++) {
13 		if (exp[i] == '1') {
14 			if (CHECK(i + 1 > n, "mask_short",
15 				  "case #%d: mask too short, got n=%d, need at least %d\n",
16 				  case_nr, n, i + 1))
17 				return;
18 			CHECK(!mask[i], "cpu_not_set",
19 			      "case #%d: mask differs, expected cpu#%d SET\n",
20 			      case_nr, i);
21 		} else {
22 			CHECK(i < n && mask[i], "cpu_set",
23 			      "case #%d: mask differs, expected cpu#%d UNSET\n",
24 			      case_nr, i);
25 		}
26 	}
27 	CHECK(i < n, "mask_long",
28 	      "case #%d: mask too long, got n=%d, expected at most %d\n",
29 	      case_nr, n, i);
30 }
31 
32 static struct {
33 	const char *cpu_mask;
34 	const char *expect;
35 	bool fails;
36 } test_cases[] = {
37 	{ "0\n", "1", false },
38 	{ "0,2\n", "101", false },
39 	{ "0-2\n", "111", false },
40 	{ "0-2,3-4\n", "11111", false },
41 	{ "0", "1", false },
42 	{ "0-2", "111", false },
43 	{ "0,2", "101", false },
44 	{ "0,1-3", "1111", false },
45 	{ "0,1,2,3", "1111", false },
46 	{ "0,2-3,5", "101101", false },
47 	{ "3-3", "0001", false },
48 	{ "2-4,6,9-10", "00111010011", false },
49 	/* failure cases */
50 	{ "", "", true },
51 	{ "0-", "", true },
52 	{ "0 ", "", true },
53 	{ "0_1", "", true },
54 	{ "1-0", "", true },
55 	{ "-1", "", true },
56 };
57 
58 void test_cpu_mask()
59 {
60 	int i, err, n;
61 	bool *mask;
62 
63 	for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
64 		mask = NULL;
65 		err = parse_cpu_mask_str(test_cases[i].cpu_mask, &mask, &n);
66 		if (test_cases[i].fails) {
67 			CHECK(!err, "should_fail",
68 			      "case #%d: parsing should fail!\n", i + 1);
69 		} else {
70 			if (CHECK(err, "parse_err",
71 				  "case #%d: cpu mask parsing failed: %d\n",
72 				  i + 1, err))
73 				continue;
74 			validate_mask(i + 1, test_cases[i].expect, mask, n);
75 		}
76 		free(mask);
77 	}
78 }
79