xref: /xnu-8020.101.4/tests/zero_to_n_tests.c (revision e7776783b89a353188416a9a346c6cdb4928faad)
1*e7776783SApple OSS Distributions #include <darwintest.h>
2*e7776783SApple OSS Distributions #include <darwintest_utils.h>
3*e7776783SApple OSS Distributions #include <stdio.h>
4*e7776783SApple OSS Distributions #include <stdlib.h>
5*e7776783SApple OSS Distributions #include <stdbool.h>
6*e7776783SApple OSS Distributions #include <errno.h>
7*e7776783SApple OSS Distributions 
8*e7776783SApple OSS Distributions #if defined(__arm64__)
9*e7776783SApple OSS Distributions T_GLOBAL_META(
10*e7776783SApple OSS Distributions 	T_META_TAG_PERF,
11*e7776783SApple OSS Distributions 	T_META_RUN_CONCURRENTLY(false),
12*e7776783SApple OSS Distributions 	T_META_BOOTARGS_SET("enable_skstsct=1"),
13*e7776783SApple OSS Distributions 	T_META_CHECK_LEAKS(false),
14*e7776783SApple OSS Distributions 	T_META_ASROOT(true),
15*e7776783SApple OSS Distributions 	T_META_REQUIRES_SYSCTL_EQ("kern.hv_vmm_present", 0),
16*e7776783SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
17*e7776783SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("scheduler"),
18*e7776783SApple OSS Distributions 	T_META_OWNER("ngamble")
19*e7776783SApple OSS Distributions 	);
20*e7776783SApple OSS Distributions #else
21*e7776783SApple OSS Distributions T_GLOBAL_META(
22*e7776783SApple OSS Distributions 	T_META_TAG_PERF,
23*e7776783SApple OSS Distributions 	T_META_RUN_CONCURRENTLY(false),
24*e7776783SApple OSS Distributions 	T_META_CHECK_LEAKS(false),
25*e7776783SApple OSS Distributions 	T_META_ASROOT(true),
26*e7776783SApple OSS Distributions 	T_META_REQUIRES_SYSCTL_EQ("kern.hv_vmm_present", 0),
27*e7776783SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
28*e7776783SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("scheduler"),
29*e7776783SApple OSS Distributions 	T_META_OWNER("ngamble")
30*e7776783SApple OSS Distributions 	);
31*e7776783SApple OSS Distributions #endif
32*e7776783SApple OSS Distributions 
33*e7776783SApple OSS Distributions static void
log_cmd(char ** cmd)34*e7776783SApple OSS Distributions log_cmd(char **cmd)
35*e7776783SApple OSS Distributions {
36*e7776783SApple OSS Distributions #define MAX_CMD_STR 1024
37*e7776783SApple OSS Distributions 	char cmd_str[MAX_CMD_STR] = "";
38*e7776783SApple OSS Distributions 	char *s;
39*e7776783SApple OSS Distributions 
40*e7776783SApple OSS Distributions 	while ((s = *cmd) != NULL) {
41*e7776783SApple OSS Distributions 		strlcat(cmd_str, s, MAX_CMD_STR);
42*e7776783SApple OSS Distributions 		strlcat(cmd_str, " ", MAX_CMD_STR);
43*e7776783SApple OSS Distributions 		cmd++;
44*e7776783SApple OSS Distributions 	}
45*e7776783SApple OSS Distributions 	T_LOG("%s\n", cmd_str);
46*e7776783SApple OSS Distributions }
47*e7776783SApple OSS Distributions 
48*e7776783SApple OSS Distributions static void
run_zn(char * name,char ** cmd)49*e7776783SApple OSS Distributions run_zn(char *name, char **cmd)
50*e7776783SApple OSS Distributions {
51*e7776783SApple OSS Distributions 	char tracefile_path[MAXPATHLEN] = "zn.artrace";
52*e7776783SApple OSS Distributions 	snprintf(tracefile_path, MAXPATHLEN, "%s.artrace", name);
53*e7776783SApple OSS Distributions 
54*e7776783SApple OSS Distributions 	int ret = dt_resultfile(tracefile_path, sizeof(tracefile_path));
55*e7776783SApple OSS Distributions 	if (ret) {
56*e7776783SApple OSS Distributions 		T_ASSERT_FAIL("get file path for trace file failed with errno %d", errno);
57*e7776783SApple OSS Distributions 	}
58*e7776783SApple OSS Distributions 
59*e7776783SApple OSS Distributions 	cmd[3] = tracefile_path;
60*e7776783SApple OSS Distributions 	log_cmd(cmd);
61*e7776783SApple OSS Distributions 
62*e7776783SApple OSS Distributions 	__block bool test_failed = true;
63*e7776783SApple OSS Distributions 	__block bool test_skipped = false;
64*e7776783SApple OSS Distributions 
65*e7776783SApple OSS Distributions 	pid_t test_pid;
66*e7776783SApple OSS Distributions 	test_pid = dt_launch_tool_pipe(cmd, false, NULL, ^bool (__unused char *data, __unused size_t data_size, __unused dt_pipe_data_handler_context_t *context) {
67*e7776783SApple OSS Distributions 		T_LOG("%s", data);
68*e7776783SApple OSS Distributions 		if (strstr(data, "TEST PASSED")) {
69*e7776783SApple OSS Distributions 		        test_failed = false;
70*e7776783SApple OSS Distributions 		}
71*e7776783SApple OSS Distributions 		if (strstr(data, "TEST FAILED")) {
72*e7776783SApple OSS Distributions 		        test_failed = true;
73*e7776783SApple OSS Distributions 		}
74*e7776783SApple OSS Distributions 		if (strstr(data, "TEST SKIPPED")) {
75*e7776783SApple OSS Distributions 		        test_skipped = true;
76*e7776783SApple OSS Distributions 		}
77*e7776783SApple OSS Distributions 		return false;
78*e7776783SApple OSS Distributions 	}, ^bool (__unused char *data, __unused size_t data_size, __unused dt_pipe_data_handler_context_t *context) {
79*e7776783SApple OSS Distributions 		T_LOG("%s", data);
80*e7776783SApple OSS Distributions 		return false;
81*e7776783SApple OSS Distributions 	}, BUFFER_PATTERN_LINE, NULL);
82*e7776783SApple OSS Distributions 
83*e7776783SApple OSS Distributions 	if (test_pid == 0) {
84*e7776783SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool_pipe() failed unexpectedly with errno %d", errno);
85*e7776783SApple OSS Distributions 	}
86*e7776783SApple OSS Distributions 
87*e7776783SApple OSS Distributions 	int exitstatus;
88*e7776783SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
89*e7776783SApple OSS Distributions 	if (exitstatus != 0) {
90*e7776783SApple OSS Distributions 		T_LOG("ktrace artrace exitstatus=%d\n", exitstatus);
91*e7776783SApple OSS Distributions 	}
92*e7776783SApple OSS Distributions 	if (test_skipped) {
93*e7776783SApple OSS Distributions 		unlink(tracefile_path);
94*e7776783SApple OSS Distributions 		T_SKIP("%s", name);
95*e7776783SApple OSS Distributions 	} else if (test_failed) {
96*e7776783SApple OSS Distributions 		T_FAIL("%s", name);
97*e7776783SApple OSS Distributions 	} else {
98*e7776783SApple OSS Distributions 		unlink(tracefile_path);
99*e7776783SApple OSS Distributions 		T_PASS("%s", name);
100*e7776783SApple OSS Distributions 	}
101*e7776783SApple OSS Distributions 	T_END;
102*e7776783SApple OSS Distributions }
103*e7776783SApple OSS Distributions 
104*e7776783SApple OSS Distributions T_DECL(zn_rt, "Schedule 1 RT thread per performance core, and test max latency", T_META_ENABLED(!TARGET_OS_TV))
105*e7776783SApple OSS Distributions {
106*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
107*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
108*e7776783SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
109*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
110*e7776783SApple OSS Distributions 		       "--spin-all",
111*e7776783SApple OSS Distributions 		       "--test-rt",
112*e7776783SApple OSS Distributions #if defined(__x86_64__)
113*e7776783SApple OSS Distributions 		       "--trace", "2000000",
114*e7776783SApple OSS Distributions #else
115*e7776783SApple OSS Distributions 		       "--trace", "500000",
116*e7776783SApple OSS Distributions #endif
117*e7776783SApple OSS Distributions 		       NULL};
118*e7776783SApple OSS Distributions 
119*e7776783SApple OSS Distributions 	run_zn("zn_rt", cmd);
120*e7776783SApple OSS Distributions }
121*e7776783SApple OSS Distributions 
122*e7776783SApple OSS Distributions T_DECL(zn_rt_smt, "Schedule 1 RT thread per primary core, verify that the secondaries are idle iff the RT threads are running", T_META_ASROOT(true), T_META_ENABLED(TARGET_CPU_X86_64))
123*e7776783SApple OSS Distributions {
124*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
125*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
126*e7776783SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
127*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
128*e7776783SApple OSS Distributions 		       "--spin-all",
129*e7776783SApple OSS Distributions 		       "--churn-pri", "4",
130*e7776783SApple OSS Distributions 		       "--test-rt-smt",
131*e7776783SApple OSS Distributions 		       "--trace", "2000000",
132*e7776783SApple OSS Distributions 		       NULL};
133*e7776783SApple OSS Distributions 
134*e7776783SApple OSS Distributions 	run_zn("zn_rt_smt", cmd);
135*e7776783SApple OSS Distributions }
136*e7776783SApple OSS Distributions 
137*e7776783SApple OSS Distributions T_DECL(zn_rt_avoid0, "Schedule 1 RT thread per primary core except for CPU 0", T_META_ASROOT(true), T_META_ENABLED(TARGET_CPU_X86_64))
138*e7776783SApple OSS Distributions {
139*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
140*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
141*e7776783SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
142*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
143*e7776783SApple OSS Distributions 		       "--spin-all",
144*e7776783SApple OSS Distributions 		       "--test-rt-avoid0",
145*e7776783SApple OSS Distributions 		       "--trace", "2000000",
146*e7776783SApple OSS Distributions 		       NULL};
147*e7776783SApple OSS Distributions 
148*e7776783SApple OSS Distributions 	run_zn("zn_rt_avoid0", cmd);
149*e7776783SApple OSS Distributions }
150*e7776783SApple OSS Distributions 
151*e7776783SApple OSS Distributions T_DECL(zn_rt_apt, "Emulate AVID Pro Tools with default latency deadlines", T_META_ENABLED(!TARGET_OS_TV))
152*e7776783SApple OSS Distributions {
153*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
154*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
155*e7776783SApple OSS Distributions 		       "0", "chain", "realtime", "1000",
156*e7776783SApple OSS Distributions 		       "--extra-thread-count", "-3",
157*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
158*e7776783SApple OSS Distributions 		       "--spin-all",
159*e7776783SApple OSS Distributions 		       "--churn-pri", "31", "--churn-random",
160*e7776783SApple OSS Distributions 		       "--test-rt",
161*e7776783SApple OSS Distributions #if defined(__x86_64__)
162*e7776783SApple OSS Distributions 		       "--trace", "2000000",
163*e7776783SApple OSS Distributions #else
164*e7776783SApple OSS Distributions 		       "--trace", "500000",
165*e7776783SApple OSS Distributions #endif
166*e7776783SApple OSS Distributions 		       NULL};
167*e7776783SApple OSS Distributions 
168*e7776783SApple OSS Distributions 	run_zn("zn_rt_apt", cmd);
169*e7776783SApple OSS Distributions }
170*e7776783SApple OSS Distributions 
171*e7776783SApple OSS Distributions T_DECL(zn_rt_apt_ll, "Emulate AVID Pro Tools with low latency deadlines")
172*e7776783SApple OSS Distributions {
173*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
174*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
175*e7776783SApple OSS Distributions 		       "0", "chain", "realtime", "1000",
176*e7776783SApple OSS Distributions 		       "--extra-thread-count", "-3",
177*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
178*e7776783SApple OSS Distributions 		       "--spin-all",
179*e7776783SApple OSS Distributions 		       "--churn-pri", "31", "--churn-random",
180*e7776783SApple OSS Distributions 		       "--test-rt",
181*e7776783SApple OSS Distributions 		       "--rt-ll",
182*e7776783SApple OSS Distributions 		       "--trace", "500000",
183*e7776783SApple OSS Distributions 		       NULL};
184*e7776783SApple OSS Distributions 
185*e7776783SApple OSS Distributions 	run_zn("zn_rt_apt_ll", cmd);
186*e7776783SApple OSS Distributions }
187*e7776783SApple OSS Distributions 
188*e7776783SApple OSS Distributions T_DECL(zn_rt_edf, "Test max latency of earliest deadline RT threads in the presence of later deadline threads", T_META_ENABLED(!TARGET_OS_TV))
189*e7776783SApple OSS Distributions {
190*e7776783SApple OSS Distributions 	char *cmd[] = {"/usr/bin/ktrace", "artrace", "-o", "zn.artrace", "-c",
191*e7776783SApple OSS Distributions 		       "/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
192*e7776783SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
193*e7776783SApple OSS Distributions 		       "--extra-thread-count", "-1",
194*e7776783SApple OSS Distributions 		       "--spin-time", "200000",
195*e7776783SApple OSS Distributions 		       "--spin-all",
196*e7776783SApple OSS Distributions 		       "--rt-churn",
197*e7776783SApple OSS Distributions 		       "--test-rt",
198*e7776783SApple OSS Distributions #if defined(__x86_64__)
199*e7776783SApple OSS Distributions 		       "--trace", "2000000",
200*e7776783SApple OSS Distributions #else
201*e7776783SApple OSS Distributions 		       "--trace", "500000",
202*e7776783SApple OSS Distributions #endif
203*e7776783SApple OSS Distributions 		       NULL};
204*e7776783SApple OSS Distributions 
205*e7776783SApple OSS Distributions 	run_zn("zn_rt_edf", cmd);
206*e7776783SApple OSS Distributions }
207