Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[sfrench/cifs-2.6.git] / tools / testing / selftests / bpf / prog_tests / cpu_mask.c
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 }