xref: /xnu-12377.1.9/tests/coalition_policy.c (revision f6217f891ac0bb64f3d375211650a4c1ff8ca1ea)
1*f6217f89SApple OSS Distributions /*
2*f6217f89SApple OSS Distributions  * Copyright (c) 2024 Apple Inc. All rights reserved.
3*f6217f89SApple OSS Distributions  *
4*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*f6217f89SApple OSS Distributions  *
6*f6217f89SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*f6217f89SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*f6217f89SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*f6217f89SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*f6217f89SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*f6217f89SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*f6217f89SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*f6217f89SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*f6217f89SApple OSS Distributions  *
15*f6217f89SApple OSS Distributions  * Please obtain a copy of the License at
16*f6217f89SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*f6217f89SApple OSS Distributions  *
18*f6217f89SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*f6217f89SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*f6217f89SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*f6217f89SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*f6217f89SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*f6217f89SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*f6217f89SApple OSS Distributions  * limitations under the License.
25*f6217f89SApple OSS Distributions  *
26*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*f6217f89SApple OSS Distributions  */
28*f6217f89SApple OSS Distributions 
29*f6217f89SApple OSS Distributions #include <sys/coalition_private.h>
30*f6217f89SApple OSS Distributions 
31*f6217f89SApple OSS Distributions #include <mach/coalition.h>
32*f6217f89SApple OSS Distributions #include <sys/coalition.h>
33*f6217f89SApple OSS Distributions #include <libproc.h>
34*f6217f89SApple OSS Distributions 
35*f6217f89SApple OSS Distributions #include <sys/types.h>
36*f6217f89SApple OSS Distributions #include <unistd.h>
37*f6217f89SApple OSS Distributions 
38*f6217f89SApple OSS Distributions #include <darwintest.h>
39*f6217f89SApple OSS Distributions #include <darwintest_utils.h>
40*f6217f89SApple OSS Distributions #include <mach/task.h>
41*f6217f89SApple OSS Distributions #include <mach/task_policy.h>
42*f6217f89SApple OSS Distributions #include <mach/mach.h>
43*f6217f89SApple OSS Distributions 
44*f6217f89SApple OSS Distributions #include <sched/sched_test_utils.h>
45*f6217f89SApple OSS Distributions 
46*f6217f89SApple OSS Distributions T_GLOBAL_META(T_META_NAMESPACE("xnu.scheduler"),
47*f6217f89SApple OSS Distributions     T_META_RADAR_COMPONENT_NAME("xnu"),
48*f6217f89SApple OSS Distributions     T_META_RADAR_COMPONENT_VERSION("scheduler"),
49*f6217f89SApple OSS Distributions     T_META_OWNER("chimene"),
50*f6217f89SApple OSS Distributions     T_META_RUN_CONCURRENTLY(false));
51*f6217f89SApple OSS Distributions 
52*f6217f89SApple OSS Distributions static uint64_t
get_jet_id(void)53*f6217f89SApple OSS Distributions get_jet_id(void)
54*f6217f89SApple OSS Distributions {
55*f6217f89SApple OSS Distributions 	T_LOG("uid: %d, pid %d", getuid(), getpid());
56*f6217f89SApple OSS Distributions 
57*f6217f89SApple OSS Distributions 	struct proc_pidcoalitioninfo idinfo;
58*f6217f89SApple OSS Distributions 
59*f6217f89SApple OSS Distributions 	int ret = proc_pidinfo(getpid(), PROC_PIDCOALITIONINFO, 0,
60*f6217f89SApple OSS Distributions 	    &idinfo, sizeof(idinfo));
61*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "proc_pidinfo(... PROC_PIDCOALITIONINFO ...)");
62*f6217f89SApple OSS Distributions 
63*f6217f89SApple OSS Distributions 	uint64_t res_id = idinfo.coalition_id[COALITION_TYPE_RESOURCE];
64*f6217f89SApple OSS Distributions 	uint64_t jet_id = idinfo.coalition_id[COALITION_TYPE_JETSAM];
65*f6217f89SApple OSS Distributions 
66*f6217f89SApple OSS Distributions 	T_LOG("Resource coalition: %lld, Jetsam coalition: %lld", res_id, jet_id);
67*f6217f89SApple OSS Distributions 
68*f6217f89SApple OSS Distributions 	return jet_id;
69*f6217f89SApple OSS Distributions }
70*f6217f89SApple OSS Distributions 
71*f6217f89SApple OSS Distributions static void
check_is_bg(bool wants_bg)72*f6217f89SApple OSS Distributions check_is_bg(bool wants_bg)
73*f6217f89SApple OSS Distributions {
74*f6217f89SApple OSS Distributions 	kern_return_t kr;
75*f6217f89SApple OSS Distributions 	struct task_policy_state policy_state;
76*f6217f89SApple OSS Distributions 
77*f6217f89SApple OSS Distributions 	mach_msg_type_number_t count = TASK_POLICY_STATE_COUNT;
78*f6217f89SApple OSS Distributions 	boolean_t get_default = FALSE;
79*f6217f89SApple OSS Distributions 
80*f6217f89SApple OSS Distributions 	kr = task_policy_get(mach_task_self(), TASK_POLICY_STATE,
81*f6217f89SApple OSS Distributions 	    (task_policy_t)&policy_state, &count, &get_default);
82*f6217f89SApple OSS Distributions 
83*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_policy_get(TASK_POLICY_STATE)");
84*f6217f89SApple OSS Distributions 
85*f6217f89SApple OSS Distributions 	/*
86*f6217f89SApple OSS Distributions 	 * A test reporting type=APPLICATION should have the live donor bit set.
87*f6217f89SApple OSS Distributions 	 * If this fails, the test may have been launched as a daemon instead.
88*f6217f89SApple OSS Distributions 	 */
89*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_BITS_SET(policy_state.flags, TASK_IMP_LIVE_DONOR, "test should be live donor enabled");
90*f6217f89SApple OSS Distributions 
91*f6217f89SApple OSS Distributions 	/*
92*f6217f89SApple OSS Distributions 	 * The BG bit is updated via task_policy_update_internal_locked,
93*f6217f89SApple OSS Distributions 	 * checking this proves that the first phase update ran on this task.
94*f6217f89SApple OSS Distributions 	 */
95*f6217f89SApple OSS Distributions 	if (wants_bg) {
96*f6217f89SApple OSS Distributions 		T_ASSERT_BITS_SET(policy_state.effective, POLICY_EFF_DARWIN_BG, "%d: is BG", getpid());
97*f6217f89SApple OSS Distributions 	} else {
98*f6217f89SApple OSS Distributions 		T_ASSERT_BITS_NOTSET(policy_state.effective, POLICY_EFF_DARWIN_BG, "%d: is not BG", getpid());
99*f6217f89SApple OSS Distributions 	}
100*f6217f89SApple OSS Distributions 
101*f6217f89SApple OSS Distributions 	/*
102*f6217f89SApple OSS Distributions 	 * The live donor bit is updated via task_policy_update_complete_unlocked,
103*f6217f89SApple OSS Distributions 	 * checking this proves that the second phase update ran on this task.
104*f6217f89SApple OSS Distributions 	 */
105*f6217f89SApple OSS Distributions 	if (wants_bg) {
106*f6217f89SApple OSS Distributions 		T_ASSERT_BITS_NOTSET(policy_state.flags, TASK_IMP_DONOR, "%d: is not live donor", getpid());
107*f6217f89SApple OSS Distributions 	} else {
108*f6217f89SApple OSS Distributions 		T_ASSERT_BITS_SET(policy_state.flags, TASK_IMP_DONOR, "%d: is live donor", getpid());
109*f6217f89SApple OSS Distributions 	}
110*f6217f89SApple OSS Distributions }
111*f6217f89SApple OSS Distributions 
112*f6217f89SApple OSS Distributions static void
set_coalition_bg(uint64_t jet_id,bool set_bg)113*f6217f89SApple OSS Distributions set_coalition_bg(uint64_t jet_id, bool set_bg)
114*f6217f89SApple OSS Distributions {
115*f6217f89SApple OSS Distributions 	if (set_bg) {
116*f6217f89SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(coalition_policy_set(jet_id, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_DARWIN_BG),
117*f6217f89SApple OSS Distributions 		    "coalition_policy_set(%lld, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_DARWIN_BG)", jet_id);
118*f6217f89SApple OSS Distributions 	} else {
119*f6217f89SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(coalition_policy_set(jet_id, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_NONE),
120*f6217f89SApple OSS Distributions 		    "coalition_policy_set(%lld, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_NONE)", jet_id);
121*f6217f89SApple OSS Distributions 	}
122*f6217f89SApple OSS Distributions }
123*f6217f89SApple OSS Distributions 
124*f6217f89SApple OSS Distributions static void
log_suppress(uint64_t jet_id)125*f6217f89SApple OSS Distributions log_suppress(uint64_t jet_id)
126*f6217f89SApple OSS Distributions {
127*f6217f89SApple OSS Distributions 	int suppress = coalition_policy_get(jet_id, COALITION_POLICY_SUPPRESS);
128*f6217f89SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(suppress, "coalition_policy_get(%lld, COALITION_POLICY_SUPPRESS)", jet_id);
129*f6217f89SApple OSS Distributions 	T_LOG("suppress: %d", suppress);
130*f6217f89SApple OSS Distributions }
131*f6217f89SApple OSS Distributions 
132*f6217f89SApple OSS Distributions static void
restore_coalition_state(void)133*f6217f89SApple OSS Distributions restore_coalition_state(void)
134*f6217f89SApple OSS Distributions {
135*f6217f89SApple OSS Distributions 	struct proc_pidcoalitioninfo idinfo;
136*f6217f89SApple OSS Distributions 
137*f6217f89SApple OSS Distributions 	int ret = proc_pidinfo(getpid(), PROC_PIDCOALITIONINFO, 0,
138*f6217f89SApple OSS Distributions 	    &idinfo, sizeof(idinfo));
139*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "proc_pidinfo(... PROC_PIDCOALITIONINFO ...)");
140*f6217f89SApple OSS Distributions 
141*f6217f89SApple OSS Distributions 	uint64_t jet_id = idinfo.coalition_id[COALITION_TYPE_JETSAM];
142*f6217f89SApple OSS Distributions 
143*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(coalition_policy_set(jet_id, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_NONE),
144*f6217f89SApple OSS Distributions 	    "coalition_policy_set(%lld, COALITION_POLICY_SUPPRESS, COALITION_POLICY_SUPPRESS_NONE)", jet_id);
145*f6217f89SApple OSS Distributions }
146*f6217f89SApple OSS Distributions 
147*f6217f89SApple OSS Distributions static void
quiesce(int argc,char * const * argv)148*f6217f89SApple OSS Distributions quiesce(int argc, char *const *argv)
149*f6217f89SApple OSS Distributions {
150*f6217f89SApple OSS Distributions 	if (!wait_for_quiescence_default(argc, argv)) {
151*f6217f89SApple OSS Distributions 		T_LOG("WARN: System did not quiesce. BG threads may experience starvation, causing this test to fail.");
152*f6217f89SApple OSS Distributions 	}
153*f6217f89SApple OSS Distributions }
154*f6217f89SApple OSS Distributions 
155*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_read_entitled, "COALITION_POLICY_SUPPRESS should be readable with entitlement")
156*f6217f89SApple OSS Distributions {
157*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
158*f6217f89SApple OSS Distributions 
159*f6217f89SApple OSS Distributions 	uint64_t jet_id = get_jet_id();
160*f6217f89SApple OSS Distributions 
161*f6217f89SApple OSS Distributions 	int suppress = coalition_policy_get(jet_id, COALITION_POLICY_SUPPRESS);
162*f6217f89SApple OSS Distributions 
163*f6217f89SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(suppress, "coalition_policy_get(%lld, COALITION_POLICY_SUPPRESS)", jet_id);
164*f6217f89SApple OSS Distributions 
165*f6217f89SApple OSS Distributions 	T_LOG("suppress: %d", suppress);
166*f6217f89SApple OSS Distributions }
167*f6217f89SApple OSS Distributions 
168*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_read_rsrc_coalition, "COALITION_POLICY_SUPPRESS shouldn't work on resource coalitions")
169*f6217f89SApple OSS Distributions {
170*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
171*f6217f89SApple OSS Distributions 
172*f6217f89SApple OSS Distributions 	T_LOG("uid: %d, pid %d", getuid(), getpid());
173*f6217f89SApple OSS Distributions 
174*f6217f89SApple OSS Distributions 	struct proc_pidcoalitioninfo idinfo;
175*f6217f89SApple OSS Distributions 
176*f6217f89SApple OSS Distributions 	int ret = proc_pidinfo(getpid(), PROC_PIDCOALITIONINFO, 0,
177*f6217f89SApple OSS Distributions 	    &idinfo, sizeof(idinfo));
178*f6217f89SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "proc_pidinfo(... PROC_PIDCOALITIONINFO ...)");
179*f6217f89SApple OSS Distributions 
180*f6217f89SApple OSS Distributions 	uint64_t res_id = idinfo.coalition_id[COALITION_TYPE_RESOURCE];
181*f6217f89SApple OSS Distributions 	uint64_t jet_id = idinfo.coalition_id[COALITION_TYPE_JETSAM];
182*f6217f89SApple OSS Distributions 
183*f6217f89SApple OSS Distributions 	T_LOG("res_id: %lld, jet_id: %lld", res_id, jet_id);
184*f6217f89SApple OSS Distributions 
185*f6217f89SApple OSS Distributions 	int suppress = coalition_policy_get(res_id, COALITION_POLICY_SUPPRESS);
186*f6217f89SApple OSS Distributions 
187*f6217f89SApple OSS Distributions 	T_EXPECT_POSIX_FAILURE(suppress,
188*f6217f89SApple OSS Distributions 	    ENOTSUP, "coalition_policy_get(%lld, COALITION_POLICY_SUPPRESS)", res_id);
189*f6217f89SApple OSS Distributions 
190*f6217f89SApple OSS Distributions 	T_LOG("suppress: %d", suppress);
191*f6217f89SApple OSS Distributions }
192*f6217f89SApple OSS Distributions 
193*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_set, "COALITION_POLICY_SUPPRESS should be settable with entitlement")
194*f6217f89SApple OSS Distributions {
195*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
196*f6217f89SApple OSS Distributions 	quiesce(argc, argv);
197*f6217f89SApple OSS Distributions 
198*f6217f89SApple OSS Distributions 	uint64_t jet_id = get_jet_id();
199*f6217f89SApple OSS Distributions 
200*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, true);
201*f6217f89SApple OSS Distributions 
202*f6217f89SApple OSS Distributions 	log_suppress(jet_id);
203*f6217f89SApple OSS Distributions 
204*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, false);
205*f6217f89SApple OSS Distributions 
206*f6217f89SApple OSS Distributions 	log_suppress(jet_id);
207*f6217f89SApple OSS Distributions }
208*f6217f89SApple OSS Distributions 
209*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_set_check_task, "current task should become BG when coalition changes", T_META_ASROOT(true))
210*f6217f89SApple OSS Distributions {
211*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
212*f6217f89SApple OSS Distributions 	quiesce(argc, argv);
213*f6217f89SApple OSS Distributions 
214*f6217f89SApple OSS Distributions 	uint64_t jet_id = get_jet_id();
215*f6217f89SApple OSS Distributions 
216*f6217f89SApple OSS Distributions 	log_suppress(jet_id);
217*f6217f89SApple OSS Distributions 
218*f6217f89SApple OSS Distributions 	check_is_bg(false);
219*f6217f89SApple OSS Distributions 
220*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, true);
221*f6217f89SApple OSS Distributions 
222*f6217f89SApple OSS Distributions 	log_suppress(jet_id);
223*f6217f89SApple OSS Distributions 
224*f6217f89SApple OSS Distributions 	check_is_bg(true);
225*f6217f89SApple OSS Distributions 
226*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, false);
227*f6217f89SApple OSS Distributions 
228*f6217f89SApple OSS Distributions 	log_suppress(jet_id);
229*f6217f89SApple OSS Distributions 
230*f6217f89SApple OSS Distributions 	check_is_bg(false);
231*f6217f89SApple OSS Distributions }
232*f6217f89SApple OSS Distributions 
233*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_child_bg, "child spawned into bg coalition should be bg", T_META_ASROOT(true))
234*f6217f89SApple OSS Distributions {
235*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
236*f6217f89SApple OSS Distributions 	quiesce(argc, argv);
237*f6217f89SApple OSS Distributions 
238*f6217f89SApple OSS Distributions 	uint64_t jet_id = get_jet_id();
239*f6217f89SApple OSS Distributions 
240*f6217f89SApple OSS Distributions 	check_is_bg(false);
241*f6217f89SApple OSS Distributions 
242*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, true);
243*f6217f89SApple OSS Distributions 
244*f6217f89SApple OSS Distributions 	check_is_bg(true);
245*f6217f89SApple OSS Distributions 
246*f6217f89SApple OSS Distributions 	T_LOG("Spawning child");
247*f6217f89SApple OSS Distributions 
248*f6217f89SApple OSS Distributions 	pid_t child_pid = fork();
249*f6217f89SApple OSS Distributions 
250*f6217f89SApple OSS Distributions 	if (child_pid == 0) {
251*f6217f89SApple OSS Distributions 		/* child process */
252*f6217f89SApple OSS Distributions 
253*f6217f89SApple OSS Distributions 		//T_LOG("child pid %d sleeping", getpid());
254*f6217f89SApple OSS Distributions 
255*f6217f89SApple OSS Distributions 		//sleep(10000);
256*f6217f89SApple OSS Distributions 
257*f6217f89SApple OSS Distributions 		check_is_bg(true);
258*f6217f89SApple OSS Distributions 
259*f6217f89SApple OSS Distributions 		T_LOG("Exit pid %d", getpid());
260*f6217f89SApple OSS Distributions 
261*f6217f89SApple OSS Distributions 		exit(0);
262*f6217f89SApple OSS Distributions 	} else {
263*f6217f89SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(child_pid, "fork returned, child pid %d", child_pid);
264*f6217f89SApple OSS Distributions 
265*f6217f89SApple OSS Distributions 		/* wait for child process to exit */
266*f6217f89SApple OSS Distributions 		int exit_status = 0, signum = 0;
267*f6217f89SApple OSS Distributions 
268*f6217f89SApple OSS Distributions 		T_ASSERT_TRUE(dt_waitpid(child_pid, &exit_status, &signum, 500000), /* TODO */
269*f6217f89SApple OSS Distributions 		    "wait for child (%d) complete", child_pid);
270*f6217f89SApple OSS Distributions 
271*f6217f89SApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(exit_status, 0, "dt_waitpid: exit_status");
272*f6217f89SApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(signum, 0, "dt_waitpid: signum");
273*f6217f89SApple OSS Distributions 	}
274*f6217f89SApple OSS Distributions 
275*f6217f89SApple OSS Distributions 	check_is_bg(true);
276*f6217f89SApple OSS Distributions 
277*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, false);
278*f6217f89SApple OSS Distributions 
279*f6217f89SApple OSS Distributions 	check_is_bg(false);
280*f6217f89SApple OSS Distributions }
281*f6217f89SApple OSS Distributions 
282*f6217f89SApple OSS Distributions T_DECL(coalition_suppress_child_change_bg, "child changing coalition to bg should affect parent", T_META_ASROOT(true))
283*f6217f89SApple OSS Distributions {
284*f6217f89SApple OSS Distributions 	T_ATEND(restore_coalition_state);
285*f6217f89SApple OSS Distributions 	quiesce(argc, argv);
286*f6217f89SApple OSS Distributions 
287*f6217f89SApple OSS Distributions 	uint64_t jet_id = get_jet_id();
288*f6217f89SApple OSS Distributions 
289*f6217f89SApple OSS Distributions 	check_is_bg(false);
290*f6217f89SApple OSS Distributions 
291*f6217f89SApple OSS Distributions 	T_LOG("Spawning child");
292*f6217f89SApple OSS Distributions 
293*f6217f89SApple OSS Distributions 	pid_t child_pid = fork();
294*f6217f89SApple OSS Distributions 
295*f6217f89SApple OSS Distributions 	if (child_pid == 0) {
296*f6217f89SApple OSS Distributions 		/* child process */
297*f6217f89SApple OSS Distributions 
298*f6217f89SApple OSS Distributions 		check_is_bg(false);
299*f6217f89SApple OSS Distributions 
300*f6217f89SApple OSS Distributions 		set_coalition_bg(jet_id, true);
301*f6217f89SApple OSS Distributions 
302*f6217f89SApple OSS Distributions 		check_is_bg(true);
303*f6217f89SApple OSS Distributions 
304*f6217f89SApple OSS Distributions 		T_LOG("Exit pid %d", getpid());
305*f6217f89SApple OSS Distributions 
306*f6217f89SApple OSS Distributions 		exit(0);
307*f6217f89SApple OSS Distributions 	} else {
308*f6217f89SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(child_pid, "fork returned, child pid %d", child_pid);
309*f6217f89SApple OSS Distributions 
310*f6217f89SApple OSS Distributions 		/* wait for child process to exit */
311*f6217f89SApple OSS Distributions 		int exit_status = 0, signum = 0;
312*f6217f89SApple OSS Distributions 
313*f6217f89SApple OSS Distributions 		T_ASSERT_TRUE(dt_waitpid(child_pid, &exit_status, &signum, 5),
314*f6217f89SApple OSS Distributions 		    "wait for child (%d) complete", child_pid);
315*f6217f89SApple OSS Distributions 
316*f6217f89SApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(exit_status, 0, "dt_waitpid: exit_status");
317*f6217f89SApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(signum, 0, "dt_waitpid: signum");
318*f6217f89SApple OSS Distributions 	}
319*f6217f89SApple OSS Distributions 
320*f6217f89SApple OSS Distributions 	check_is_bg(true);
321*f6217f89SApple OSS Distributions 
322*f6217f89SApple OSS Distributions 	set_coalition_bg(jet_id, false);
323*f6217f89SApple OSS Distributions 
324*f6217f89SApple OSS Distributions 	check_is_bg(false);
325*f6217f89SApple OSS Distributions }
326