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