xref: /openbmc/linux/tools/testing/selftests/bpf/prog_tests/cpu_mask.c (revision 8dd06ef34b6e2f41b29fbf5fc1663780f2524285)
165bc4c40SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
265bc4c40SAndrii Nakryiko #include <test_progs.h>
365bc4c40SAndrii Nakryiko #include <bpf/btf.h>
4*3e689141SToke Høiland-Jørgensen #include "bpf/libbpf_internal.h"
565bc4c40SAndrii Nakryiko 
665bc4c40SAndrii Nakryiko static int duration = 0;
765bc4c40SAndrii Nakryiko 
validate_mask(int case_nr,const char * exp,bool * mask,int n)865bc4c40SAndrii Nakryiko static void validate_mask(int case_nr, const char *exp, bool *mask, int n)
965bc4c40SAndrii Nakryiko {
1065bc4c40SAndrii Nakryiko 	int i;
1165bc4c40SAndrii Nakryiko 
1265bc4c40SAndrii Nakryiko 	for (i = 0; exp[i]; i++) {
1365bc4c40SAndrii Nakryiko 		if (exp[i] == '1') {
1465bc4c40SAndrii Nakryiko 			if (CHECK(i + 1 > n, "mask_short",
1565bc4c40SAndrii Nakryiko 				  "case #%d: mask too short, got n=%d, need at least %d\n",
1665bc4c40SAndrii Nakryiko 				  case_nr, n, i + 1))
1765bc4c40SAndrii Nakryiko 				return;
1865bc4c40SAndrii Nakryiko 			CHECK(!mask[i], "cpu_not_set",
1965bc4c40SAndrii Nakryiko 			      "case #%d: mask differs, expected cpu#%d SET\n",
2065bc4c40SAndrii Nakryiko 			      case_nr, i);
2165bc4c40SAndrii Nakryiko 		} else {
2265bc4c40SAndrii Nakryiko 			CHECK(i < n && mask[i], "cpu_set",
2365bc4c40SAndrii Nakryiko 			      "case #%d: mask differs, expected cpu#%d UNSET\n",
2465bc4c40SAndrii Nakryiko 			      case_nr, i);
2565bc4c40SAndrii Nakryiko 		}
2665bc4c40SAndrii Nakryiko 	}
2765bc4c40SAndrii Nakryiko 	CHECK(i < n, "mask_long",
2865bc4c40SAndrii Nakryiko 	      "case #%d: mask too long, got n=%d, expected at most %d\n",
2965bc4c40SAndrii Nakryiko 	      case_nr, n, i);
3065bc4c40SAndrii Nakryiko }
3165bc4c40SAndrii Nakryiko 
3265bc4c40SAndrii Nakryiko static struct {
3365bc4c40SAndrii Nakryiko 	const char *cpu_mask;
3465bc4c40SAndrii Nakryiko 	const char *expect;
3565bc4c40SAndrii Nakryiko 	bool fails;
3665bc4c40SAndrii Nakryiko } test_cases[] = {
3765bc4c40SAndrii Nakryiko 	{ "0\n", "1", false },
3865bc4c40SAndrii Nakryiko 	{ "0,2\n", "101", false },
3965bc4c40SAndrii Nakryiko 	{ "0-2\n", "111", false },
4065bc4c40SAndrii Nakryiko 	{ "0-2,3-4\n", "11111", false },
4165bc4c40SAndrii Nakryiko 	{ "0", "1", false },
4265bc4c40SAndrii Nakryiko 	{ "0-2", "111", false },
4365bc4c40SAndrii Nakryiko 	{ "0,2", "101", false },
4465bc4c40SAndrii Nakryiko 	{ "0,1-3", "1111", false },
4565bc4c40SAndrii Nakryiko 	{ "0,1,2,3", "1111", false },
4665bc4c40SAndrii Nakryiko 	{ "0,2-3,5", "101101", false },
4765bc4c40SAndrii Nakryiko 	{ "3-3", "0001", false },
4865bc4c40SAndrii Nakryiko 	{ "2-4,6,9-10", "00111010011", false },
4965bc4c40SAndrii Nakryiko 	/* failure cases */
5065bc4c40SAndrii Nakryiko 	{ "", "", true },
5165bc4c40SAndrii Nakryiko 	{ "0-", "", true },
5265bc4c40SAndrii Nakryiko 	{ "0 ", "", true },
5365bc4c40SAndrii Nakryiko 	{ "0_1", "", true },
5465bc4c40SAndrii Nakryiko 	{ "1-0", "", true },
5565bc4c40SAndrii Nakryiko 	{ "-1", "", true },
5665bc4c40SAndrii Nakryiko };
5765bc4c40SAndrii Nakryiko 
test_cpu_mask()5865bc4c40SAndrii Nakryiko void test_cpu_mask()
5965bc4c40SAndrii Nakryiko {
6065bc4c40SAndrii Nakryiko 	int i, err, n;
6165bc4c40SAndrii Nakryiko 	bool *mask;
6265bc4c40SAndrii Nakryiko 
6365bc4c40SAndrii Nakryiko 	for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
6465bc4c40SAndrii Nakryiko 		mask = NULL;
6565bc4c40SAndrii Nakryiko 		err = parse_cpu_mask_str(test_cases[i].cpu_mask, &mask, &n);
6665bc4c40SAndrii Nakryiko 		if (test_cases[i].fails) {
6765bc4c40SAndrii Nakryiko 			CHECK(!err, "should_fail",
6865bc4c40SAndrii Nakryiko 			      "case #%d: parsing should fail!\n", i + 1);
6965bc4c40SAndrii Nakryiko 		} else {
7065bc4c40SAndrii Nakryiko 			if (CHECK(err, "parse_err",
7165bc4c40SAndrii Nakryiko 				  "case #%d: cpu mask parsing failed: %d\n",
7265bc4c40SAndrii Nakryiko 				  i + 1, err))
7365bc4c40SAndrii Nakryiko 				continue;
7465bc4c40SAndrii Nakryiko 			validate_mask(i + 1, test_cases[i].expect, mask, n);
7565bc4c40SAndrii Nakryiko 		}
7665bc4c40SAndrii Nakryiko 		free(mask);
7765bc4c40SAndrii Nakryiko 	}
7865bc4c40SAndrii Nakryiko }
79