xref: /freebsd/lib/libc/tests/sys/cpuset_test.c (revision 16837d35)
11fc42128SKyle Evans /*-
21fc42128SKyle Evans  * SPDX-License-Identifier: BSD-2-Clause
31fc42128SKyle Evans  *
460c4ec80SKyle Evans  * Copyright (c) 2020-2021 Kyle Evans <kevans@FreeBSD.org>
51fc42128SKyle Evans  *
61fc42128SKyle Evans  * Redistribution and use in source and binary forms, with or without
71fc42128SKyle Evans  * modification, are permitted provided that the following conditions
81fc42128SKyle Evans  * are met:
91fc42128SKyle Evans  * 1. Redistributions of source code must retain the above copyright
101fc42128SKyle Evans  *    notice, this list of conditions and the following disclaimer.
111fc42128SKyle Evans  * 2. Redistributions in binary form must reproduce the above copyright
121fc42128SKyle Evans  *    notice, this list of conditions and the following disclaimer in the
131fc42128SKyle Evans  *    documentation and/or other materials provided with the distribution.
141fc42128SKyle Evans  *
151fc42128SKyle Evans  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
161fc42128SKyle Evans  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
171fc42128SKyle Evans  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
181fc42128SKyle Evans  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
191fc42128SKyle Evans  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
201fc42128SKyle Evans  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
211fc42128SKyle Evans  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
221fc42128SKyle Evans  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
231fc42128SKyle Evans  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
241fc42128SKyle Evans  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
251fc42128SKyle Evans  * SUCH DAMAGE.
261fc42128SKyle Evans  */
271fc42128SKyle Evans 
281fc42128SKyle Evans #include <sys/param.h>
291fc42128SKyle Evans #include <sys/cpuset.h>
301fc42128SKyle Evans #include <sys/jail.h>
3160c4ec80SKyle Evans #include <sys/procdesc.h>
3260c4ec80SKyle Evans #include <sys/select.h>
331fc42128SKyle Evans #include <sys/socket.h>
341fc42128SKyle Evans #include <sys/uio.h>
351fc42128SKyle Evans #include <sys/wait.h>
361fc42128SKyle Evans 
371fc42128SKyle Evans #include <errno.h>
381fc42128SKyle Evans #include <stdio.h>
391fc42128SKyle Evans #include <unistd.h>
401fc42128SKyle Evans 
411fc42128SKyle Evans #include <atf-c.h>
421fc42128SKyle Evans 
431fc42128SKyle Evans #define	SP_PARENT	0
441fc42128SKyle Evans #define	SP_CHILD	1
451fc42128SKyle Evans 
461fc42128SKyle Evans struct jail_test_info {
471fc42128SKyle Evans 	cpuset_t	jail_tidmask;
481fc42128SKyle Evans 	cpusetid_t	jail_cpuset;
491fc42128SKyle Evans 	cpusetid_t	jail_child_cpuset;
501fc42128SKyle Evans };
511fc42128SKyle Evans 
521fc42128SKyle Evans struct jail_test_cb_params {
531fc42128SKyle Evans 	struct jail_test_info		info;
541fc42128SKyle Evans 	cpuset_t			mask;
551fc42128SKyle Evans 	cpusetid_t			rootid;
561fc42128SKyle Evans 	cpusetid_t			setid;
571fc42128SKyle Evans };
581fc42128SKyle Evans 
591fc42128SKyle Evans typedef void (*jail_test_cb)(struct jail_test_cb_params *);
601fc42128SKyle Evans 
611fc42128SKyle Evans #define	FAILURE_JAIL	42
621fc42128SKyle Evans #define	FAILURE_MASK	43
631fc42128SKyle Evans #define	FAILURE_JAILSET	44
641fc42128SKyle Evans #define	FAILURE_PIDSET	45
651fc42128SKyle Evans #define	FAILURE_SEND	46
6660c4ec80SKyle Evans #define	FAILURE_DEADLK	47
6760c4ec80SKyle Evans #define	FAILURE_ATTACH	48
6860c4ec80SKyle Evans #define	FAILURE_BADAFFIN	49
6960c4ec80SKyle Evans #define	FAILURE_SUCCESS	50
701fc42128SKyle Evans 
711fc42128SKyle Evans static const char *
do_jail_errstr(int error)721fc42128SKyle Evans do_jail_errstr(int error)
731fc42128SKyle Evans {
741fc42128SKyle Evans 
751fc42128SKyle Evans 	switch (error) {
761fc42128SKyle Evans 	case FAILURE_JAIL:
771fc42128SKyle Evans 		return ("jail_set(2) failed");
781fc42128SKyle Evans 	case FAILURE_MASK:
791fc42128SKyle Evans 		return ("Failed to get the thread cpuset mask");
801fc42128SKyle Evans 	case FAILURE_JAILSET:
811fc42128SKyle Evans 		return ("Failed to get the jail setid");
821fc42128SKyle Evans 	case FAILURE_PIDSET:
831fc42128SKyle Evans 		return ("Failed to get the pid setid");
841fc42128SKyle Evans 	case FAILURE_SEND:
851fc42128SKyle Evans 		return ("Failed to send(2) cpuset information");
8660c4ec80SKyle Evans 	case FAILURE_DEADLK:
8760c4ec80SKyle Evans 		return ("Deadlock hit trying to attach to jail");
8860c4ec80SKyle Evans 	case FAILURE_ATTACH:
8960c4ec80SKyle Evans 		return ("jail_attach(2) failed");
9060c4ec80SKyle Evans 	case FAILURE_BADAFFIN:
9160c4ec80SKyle Evans 		return ("Unexpected post-attach affinity");
9260c4ec80SKyle Evans 	case FAILURE_SUCCESS:
9360c4ec80SKyle Evans 		return ("jail_attach(2) succeeded, but should have failed.");
941fc42128SKyle Evans 	default:
951fc42128SKyle Evans 		return (NULL);
961fc42128SKyle Evans 	}
971fc42128SKyle Evans }
981fc42128SKyle Evans 
991fc42128SKyle Evans static void
skip_ltncpu(int ncpu,cpuset_t * mask)1001fc42128SKyle Evans skip_ltncpu(int ncpu, cpuset_t *mask)
1011fc42128SKyle Evans {
1021fc42128SKyle Evans 
1031fc42128SKyle Evans 	CPU_ZERO(mask);
1041fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
1051fc42128SKyle Evans 	    -1, sizeof(*mask), mask));
1061fc42128SKyle Evans 	if (CPU_COUNT(mask) < ncpu)
1071fc42128SKyle Evans 		atf_tc_skip("Test requires %d or more cores.", ncpu);
1081fc42128SKyle Evans }
1091fc42128SKyle Evans 
1101fc42128SKyle Evans ATF_TC(newset);
ATF_TC_HEAD(newset,tc)1111fc42128SKyle Evans ATF_TC_HEAD(newset, tc)
1121fc42128SKyle Evans {
1131fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr", "Test cpuset(2)");
1141fc42128SKyle Evans }
ATF_TC_BODY(newset,tc)1151fc42128SKyle Evans ATF_TC_BODY(newset, tc)
1161fc42128SKyle Evans {
1171fc42128SKyle Evans 	cpusetid_t nsetid, setid, qsetid;
1181fc42128SKyle Evans 
1191fc42128SKyle Evans 	/* Obtain our initial set id. */
1201fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, -1,
1211fc42128SKyle Evans 	    &setid));
1221fc42128SKyle Evans 
1231fc42128SKyle Evans 	/* Create a new one. */
1241fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset(&nsetid));
1251fc42128SKyle Evans 	ATF_CHECK(nsetid != setid);
1261fc42128SKyle Evans 
1271fc42128SKyle Evans 	/* Query id again, make sure it's equal to the one we just got. */
1281fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, -1,
1291fc42128SKyle Evans 	    &qsetid));
1301fc42128SKyle Evans 	ATF_CHECK_EQ(nsetid, qsetid);
1311fc42128SKyle Evans }
1321fc42128SKyle Evans 
1331fc42128SKyle Evans ATF_TC(transient);
ATF_TC_HEAD(transient,tc)1341fc42128SKyle Evans ATF_TC_HEAD(transient, tc)
1351fc42128SKyle Evans {
1361fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
1371fc42128SKyle Evans 	   "Test that transient cpusets are freed.");
1381fc42128SKyle Evans }
ATF_TC_BODY(transient,tc)1391fc42128SKyle Evans ATF_TC_BODY(transient, tc)
1401fc42128SKyle Evans {
1411fc42128SKyle Evans 	cpusetid_t isetid, scratch, setid;
1421fc42128SKyle Evans 
1431fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_PID, -1,
1441fc42128SKyle Evans 	    &isetid));
1451fc42128SKyle Evans 
1461fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset(&setid));
1471fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_CPUSET,
1481fc42128SKyle Evans 	    setid, &scratch));
1491fc42128SKyle Evans 
1501fc42128SKyle Evans 	/*
1511fc42128SKyle Evans 	 * Return back to our initial cpuset; the kernel should free the cpuset
1521fc42128SKyle Evans 	 * we just created.
1531fc42128SKyle Evans 	 */
1541fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setid(CPU_WHICH_PID, -1, isetid));
1551fc42128SKyle Evans 	ATF_REQUIRE_EQ(-1, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_CPUSET,
1561fc42128SKyle Evans 	    setid, &scratch));
1571fc42128SKyle Evans 	ATF_CHECK_EQ(ESRCH, errno);
1581fc42128SKyle Evans }
1591fc42128SKyle Evans 
1601fc42128SKyle Evans ATF_TC(deadlk);
ATF_TC_HEAD(deadlk,tc)1611fc42128SKyle Evans ATF_TC_HEAD(deadlk, tc)
1621fc42128SKyle Evans {
1631fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr", "Test against disjoint cpusets.");
1641fc42128SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
1651fc42128SKyle Evans }
ATF_TC_BODY(deadlk,tc)1661fc42128SKyle Evans ATF_TC_BODY(deadlk, tc)
1671fc42128SKyle Evans {
1681fc42128SKyle Evans 	cpusetid_t setid;
1691fc42128SKyle Evans 	cpuset_t dismask, mask, omask;
1701fc42128SKyle Evans 	int fcpu, i, found, ncpu, second;
1711fc42128SKyle Evans 
1721fc42128SKyle Evans 	/* Make sure we have 3 cpus, so we test partial overlap. */
1731fc42128SKyle Evans 	skip_ltncpu(3, &omask);
1741fc42128SKyle Evans 
1751fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset(&setid));
1761fc42128SKyle Evans 	CPU_ZERO(&mask);
1771fc42128SKyle Evans 	CPU_ZERO(&dismask);
1781fc42128SKyle Evans 	CPU_COPY(&omask, &mask);
1791fc42128SKyle Evans 	CPU_COPY(&omask, &dismask);
1801fc42128SKyle Evans 	fcpu = CPU_FFS(&mask);
1811fc42128SKyle Evans 	ncpu = CPU_COUNT(&mask);
1821fc42128SKyle Evans 
1831fc42128SKyle Evans 	/*
1841fc42128SKyle Evans 	 * Turn off all but the first two for mask, turn off the first for
1851fc42128SKyle Evans 	 * dismask and turn them all off for both after the third.
1861fc42128SKyle Evans 	 */
1871fc42128SKyle Evans 	for (i = fcpu - 1, found = 0; i < CPU_MAXSIZE && found != ncpu; i++) {
1881fc42128SKyle Evans 		if (CPU_ISSET(i, &omask)) {
1891fc42128SKyle Evans 			found++;
1901fc42128SKyle Evans 			if (found == 1) {
1911fc42128SKyle Evans 				CPU_CLR(i, &dismask);
1921fc42128SKyle Evans 			} else if (found == 2) {
1931fc42128SKyle Evans 				second = i;
1941fc42128SKyle Evans 			} else if (found >= 3) {
1951fc42128SKyle Evans 				CPU_CLR(i, &mask);
1961fc42128SKyle Evans 				if (found > 3)
1971fc42128SKyle Evans 					CPU_CLR(i, &dismask);
1981fc42128SKyle Evans 			}
1991fc42128SKyle Evans 		}
2001fc42128SKyle Evans 	}
2011fc42128SKyle Evans 
2021fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
2031fc42128SKyle Evans 	    -1, sizeof(mask), &mask));
2041fc42128SKyle Evans 
2051fc42128SKyle Evans 	/* Must be a strict subset! */
2061fc42128SKyle Evans 	ATF_REQUIRE_EQ(-1, cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
2071fc42128SKyle Evans 	    -1, sizeof(dismask), &dismask));
2081fc42128SKyle Evans 	ATF_REQUIRE_EQ(EINVAL, errno);
2091fc42128SKyle Evans 
2101fc42128SKyle Evans 	/*
2111fc42128SKyle Evans 	 * We'll set our anonymous set to the 0,1 set that currently matches
2121fc42128SKyle Evans 	 * the process.  If we then set the process to the 1,2 set that's in
2131fc42128SKyle Evans 	 * dismask, we should then personally be restricted down to the single
2141fc42128SKyle Evans 	 * overlapping CPOU.
2151fc42128SKyle Evans 	 */
2161fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
2171fc42128SKyle Evans 	    -1, sizeof(mask), &mask));
2181fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
2191fc42128SKyle Evans 	    -1, sizeof(dismask), &dismask));
2201fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
2211fc42128SKyle Evans 	    -1, sizeof(mask), &mask));
2221fc42128SKyle Evans 	ATF_REQUIRE_EQ(1, CPU_COUNT(&mask));
2231fc42128SKyle Evans 	ATF_REQUIRE(CPU_ISSET(second, &mask));
2241fc42128SKyle Evans 
2251fc42128SKyle Evans 	/*
2261fc42128SKyle Evans 	 * Finally, clearing the overlap and attempting to set the process
2271fc42128SKyle Evans 	 * cpuset to a completely disjoint mask should fail, because this
2281fc42128SKyle Evans 	 * process will then not have anything to run on.
2291fc42128SKyle Evans 	 */
2301fc42128SKyle Evans 	CPU_CLR(second, &dismask);
2311fc42128SKyle Evans 	ATF_REQUIRE_EQ(-1, cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
2321fc42128SKyle Evans 	    -1, sizeof(dismask), &dismask));
2331fc42128SKyle Evans 	ATF_REQUIRE_EQ(EDEADLK, errno);
2341fc42128SKyle Evans }
2351fc42128SKyle Evans 
2361fc42128SKyle Evans static int
do_jail(int sock)2371fc42128SKyle Evans do_jail(int sock)
2381fc42128SKyle Evans {
2391fc42128SKyle Evans 	struct jail_test_info info;
2401fc42128SKyle Evans 	struct iovec iov[2];
2411fc42128SKyle Evans 	char *name;
2421fc42128SKyle Evans 	int error;
2431fc42128SKyle Evans 
2441fc42128SKyle Evans 	if (asprintf(&name, "cpuset_%d", getpid()) == -1)
2451fc42128SKyle Evans 		_exit(42);
2461fc42128SKyle Evans 
2471fc42128SKyle Evans 	iov[0].iov_base = "name";
2481fc42128SKyle Evans 	iov[0].iov_len = 5;
2491fc42128SKyle Evans 
2501fc42128SKyle Evans 	iov[1].iov_base = name;
2511fc42128SKyle Evans 	iov[1].iov_len = strlen(name) + 1;
2521fc42128SKyle Evans 
2531fc42128SKyle Evans 	if (jail_set(iov, 2, JAIL_CREATE | JAIL_ATTACH) < 0)
2541fc42128SKyle Evans 		return (FAILURE_JAIL);
2551fc42128SKyle Evans 
2561fc42128SKyle Evans 	/* Record parameters, kick them over, then make a swift exit. */
2571fc42128SKyle Evans 	CPU_ZERO(&info.jail_tidmask);
2581fc42128SKyle Evans 	error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
2591fc42128SKyle Evans 	    -1, sizeof(info.jail_tidmask), &info.jail_tidmask);
2601fc42128SKyle Evans 	if (error != 0)
2611fc42128SKyle Evans 		return (FAILURE_MASK);
2621fc42128SKyle Evans 
2631fc42128SKyle Evans 	error = cpuset_getid(CPU_LEVEL_ROOT, CPU_WHICH_TID, -1,
2641fc42128SKyle Evans 	    &info.jail_cpuset);
2651fc42128SKyle Evans 	if (error != 0)
2661fc42128SKyle Evans 		return (FAILURE_JAILSET);
2671fc42128SKyle Evans 	error = cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, -1,
2681fc42128SKyle Evans 	    &info.jail_child_cpuset);
2691fc42128SKyle Evans 	if (error != 0)
2701fc42128SKyle Evans 		return (FAILURE_PIDSET);
2711fc42128SKyle Evans 	if (send(sock, &info, sizeof(info), 0) != sizeof(info))
2721fc42128SKyle Evans 		return (FAILURE_SEND);
2731fc42128SKyle Evans 	return (0);
2741fc42128SKyle Evans }
2751fc42128SKyle Evans 
2761fc42128SKyle Evans static void
do_jail_test(int ncpu,bool newset,jail_test_cb prologue,jail_test_cb epilogue)2771fc42128SKyle Evans do_jail_test(int ncpu, bool newset, jail_test_cb prologue,
2781fc42128SKyle Evans     jail_test_cb epilogue)
2791fc42128SKyle Evans {
2801fc42128SKyle Evans 	struct jail_test_cb_params cbp;
2811fc42128SKyle Evans 	const char *errstr;
2821fc42128SKyle Evans 	pid_t pid;
2831fc42128SKyle Evans 	int error, sock, sockpair[2], status;
2841fc42128SKyle Evans 
2851fc42128SKyle Evans 	memset(&cbp.info, '\0', sizeof(cbp.info));
2861fc42128SKyle Evans 
2871fc42128SKyle Evans 	skip_ltncpu(ncpu, &cbp.mask);
2881fc42128SKyle Evans 
2891fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_ROOT, CPU_WHICH_PID, -1,
2901fc42128SKyle Evans 	    &cbp.rootid));
2911fc42128SKyle Evans 	if (newset)
2921fc42128SKyle Evans 		ATF_REQUIRE_EQ(0, cpuset(&cbp.setid));
2931fc42128SKyle Evans 	else
2941fc42128SKyle Evans 		ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
2951fc42128SKyle Evans 		    -1, &cbp.setid));
2961fc42128SKyle Evans 	/* Special hack for prison0; it uses cpuset 1 as the root. */
2971fc42128SKyle Evans 	if (cbp.rootid == 0)
2981fc42128SKyle Evans 		cbp.rootid = 1;
2991fc42128SKyle Evans 
3001fc42128SKyle Evans 	/* Not every test needs early setup. */
3011fc42128SKyle Evans 	if (prologue != NULL)
3021fc42128SKyle Evans 		(*prologue)(&cbp);
3031fc42128SKyle Evans 
3041fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, socketpair(PF_UNIX, SOCK_STREAM, 0, sockpair));
3051fc42128SKyle Evans 	ATF_REQUIRE((pid = fork()) != -1);
3061fc42128SKyle Evans 
3071fc42128SKyle Evans 	if (pid == 0) {
3081fc42128SKyle Evans 		/* Child */
3091fc42128SKyle Evans 		close(sockpair[SP_PARENT]);
3101fc42128SKyle Evans 		sock = sockpair[SP_CHILD];
3111fc42128SKyle Evans 
3121fc42128SKyle Evans 		_exit(do_jail(sock));
3131fc42128SKyle Evans 	} else {
3141fc42128SKyle Evans 		/* Parent */
3151fc42128SKyle Evans 		sock = sockpair[SP_PARENT];
3161fc42128SKyle Evans 		close(sockpair[SP_CHILD]);
3171fc42128SKyle Evans 
3181fc42128SKyle Evans 		while ((error = waitpid(pid, &status, 0)) == -1 &&
3191fc42128SKyle Evans 		    errno == EINTR) {
3201fc42128SKyle Evans 		}
3211fc42128SKyle Evans 
3221fc42128SKyle Evans 		ATF_REQUIRE_EQ(sizeof(cbp.info), recv(sock, &cbp.info,
3231fc42128SKyle Evans 		    sizeof(cbp.info), 0));
3241fc42128SKyle Evans 
3251fc42128SKyle Evans 		/* Sanity check the exit info. */
3261fc42128SKyle Evans 		ATF_REQUIRE_EQ(pid, error);
3271fc42128SKyle Evans 		ATF_REQUIRE(WIFEXITED(status));
3281fc42128SKyle Evans 		if (WEXITSTATUS(status) != 0) {
3291fc42128SKyle Evans 			errstr = do_jail_errstr(WEXITSTATUS(status));
3301fc42128SKyle Evans 			if (errstr != NULL)
3311fc42128SKyle Evans 				atf_tc_fail("%s", errstr);
3321fc42128SKyle Evans 			else
3331fc42128SKyle Evans 				atf_tc_fail("Unknown error '%d'",
3341fc42128SKyle Evans 				    WEXITSTATUS(status));
3351fc42128SKyle Evans 		}
3361fc42128SKyle Evans 
3371fc42128SKyle Evans 		epilogue(&cbp);
3381fc42128SKyle Evans 	}
3391fc42128SKyle Evans }
3401fc42128SKyle Evans 
3411fc42128SKyle Evans static void
jail_attach_mutate_pro(struct jail_test_cb_params * cbp)3421fc42128SKyle Evans jail_attach_mutate_pro(struct jail_test_cb_params *cbp)
3431fc42128SKyle Evans {
3441fc42128SKyle Evans 	cpuset_t *mask;
3451fc42128SKyle Evans 	int count;
3461fc42128SKyle Evans 
3471fc42128SKyle Evans 	mask = &cbp->mask;
3481fc42128SKyle Evans 
3491fc42128SKyle Evans 	/* Knock out the first cpu. */
3501fc42128SKyle Evans 	count = CPU_COUNT(mask);
3511fc42128SKyle Evans 	CPU_CLR(CPU_FFS(mask) - 1, mask);
3521fc42128SKyle Evans 	ATF_REQUIRE_EQ(count - 1, CPU_COUNT(mask));
3531fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
3541fc42128SKyle Evans 	    -1, sizeof(*mask), mask));
3551fc42128SKyle Evans }
3561fc42128SKyle Evans 
3571fc42128SKyle Evans static void
jail_attach_newbase_epi(struct jail_test_cb_params * cbp)3581fc42128SKyle Evans jail_attach_newbase_epi(struct jail_test_cb_params *cbp)
3591fc42128SKyle Evans {
3601fc42128SKyle Evans 	struct jail_test_info *info;
3611fc42128SKyle Evans 	cpuset_t *mask;
3621fc42128SKyle Evans 
3631fc42128SKyle Evans 	info = &cbp->info;
3641fc42128SKyle Evans 	mask = &cbp->mask;
3651fc42128SKyle Evans 
3661fc42128SKyle Evans 	/*
3671fc42128SKyle Evans 	 * The rootid test has been thrown in because a bug was discovered
3681fc42128SKyle Evans 	 * where any newly derived cpuset during attach would be parented to
3691fc42128SKyle Evans 	 * the wrong cpuset.  Otherwise, we should observe that a new cpuset
3701fc42128SKyle Evans 	 * has been created for this process.
3711fc42128SKyle Evans 	 */
3721fc42128SKyle Evans 	ATF_REQUIRE(info->jail_cpuset != cbp->rootid);
3731fc42128SKyle Evans 	ATF_REQUIRE(info->jail_cpuset != cbp->setid);
3741fc42128SKyle Evans 	ATF_REQUIRE(info->jail_cpuset != info->jail_child_cpuset);
3751fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, CPU_CMP(mask, &info->jail_tidmask));
3761fc42128SKyle Evans }
3771fc42128SKyle Evans 
3781fc42128SKyle Evans ATF_TC(jail_attach_newbase);
ATF_TC_HEAD(jail_attach_newbase,tc)3791fc42128SKyle Evans ATF_TC_HEAD(jail_attach_newbase, tc)
3801fc42128SKyle Evans {
3811fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
3821fc42128SKyle Evans 	    "Test jail attachment effect on affinity with a new base cpuset.");
3831fc42128SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
3841fc42128SKyle Evans }
ATF_TC_BODY(jail_attach_newbase,tc)3851fc42128SKyle Evans ATF_TC_BODY(jail_attach_newbase, tc)
3861fc42128SKyle Evans {
3871fc42128SKyle Evans 
3881fc42128SKyle Evans 	/* Need >= 2 cpus to test restriction. */
3891fc42128SKyle Evans 	do_jail_test(2, true, &jail_attach_mutate_pro,
3901fc42128SKyle Evans 	    &jail_attach_newbase_epi);
3911fc42128SKyle Evans }
3921fc42128SKyle Evans 
3931fc42128SKyle Evans ATF_TC(jail_attach_newbase_plain);
ATF_TC_HEAD(jail_attach_newbase_plain,tc)3941fc42128SKyle Evans ATF_TC_HEAD(jail_attach_newbase_plain, tc)
3951fc42128SKyle Evans {
3961fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
3971fc42128SKyle Evans 	    "Test jail attachment effect on affinity with a new, unmodified base cpuset.");
3981fc42128SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
3991fc42128SKyle Evans }
ATF_TC_BODY(jail_attach_newbase_plain,tc)4001fc42128SKyle Evans ATF_TC_BODY(jail_attach_newbase_plain, tc)
4011fc42128SKyle Evans {
4021fc42128SKyle Evans 
4031fc42128SKyle Evans 	do_jail_test(2, true, NULL, &jail_attach_newbase_epi);
4041fc42128SKyle Evans }
4051fc42128SKyle Evans 
4061fc42128SKyle Evans /*
4071fc42128SKyle Evans  * Generic epilogue for tests that are expecting to use the jail's root cpuset
4081fc42128SKyle Evans  * with their own mask, whether that's been modified or not.
4091fc42128SKyle Evans  */
4101fc42128SKyle Evans static void
jail_attach_jset_epi(struct jail_test_cb_params * cbp)4111fc42128SKyle Evans jail_attach_jset_epi(struct jail_test_cb_params *cbp)
4121fc42128SKyle Evans {
4131fc42128SKyle Evans 	struct jail_test_info *info;
4141fc42128SKyle Evans 	cpuset_t *mask;
4151fc42128SKyle Evans 
4161fc42128SKyle Evans 	info = &cbp->info;
4171fc42128SKyle Evans 	mask = &cbp->mask;
4181fc42128SKyle Evans 
4191fc42128SKyle Evans 	ATF_REQUIRE(info->jail_cpuset != cbp->setid);
4201fc42128SKyle Evans 	ATF_REQUIRE_EQ(info->jail_cpuset, info->jail_child_cpuset);
4211fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, CPU_CMP(mask, &info->jail_tidmask));
4221fc42128SKyle Evans }
4231fc42128SKyle Evans 
4241fc42128SKyle Evans ATF_TC(jail_attach_prevbase);
ATF_TC_HEAD(jail_attach_prevbase,tc)4251fc42128SKyle Evans ATF_TC_HEAD(jail_attach_prevbase, tc)
4261fc42128SKyle Evans {
4271fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
4281fc42128SKyle Evans 	    "Test jail attachment effect on affinity without a new base.");
4291fc42128SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
4301fc42128SKyle Evans }
ATF_TC_BODY(jail_attach_prevbase,tc)4311fc42128SKyle Evans ATF_TC_BODY(jail_attach_prevbase, tc)
4321fc42128SKyle Evans {
4331fc42128SKyle Evans 
4341fc42128SKyle Evans 	do_jail_test(2, false, &jail_attach_mutate_pro, &jail_attach_jset_epi);
4351fc42128SKyle Evans }
4361fc42128SKyle Evans 
4371fc42128SKyle Evans static void
jail_attach_plain_pro(struct jail_test_cb_params * cbp)4381fc42128SKyle Evans jail_attach_plain_pro(struct jail_test_cb_params *cbp)
4391fc42128SKyle Evans {
4401fc42128SKyle Evans 
4411fc42128SKyle Evans 	if (cbp->setid != cbp->rootid)
4421fc42128SKyle Evans 		atf_tc_skip("Must be running with the root cpuset.");
4431fc42128SKyle Evans }
4441fc42128SKyle Evans 
4451fc42128SKyle Evans ATF_TC(jail_attach_plain);
ATF_TC_HEAD(jail_attach_plain,tc)4461fc42128SKyle Evans ATF_TC_HEAD(jail_attach_plain, tc)
4471fc42128SKyle Evans {
4481fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
4491fc42128SKyle Evans 	    "Test jail attachment effect on affinity without specialization.");
4501fc42128SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
4511fc42128SKyle Evans }
ATF_TC_BODY(jail_attach_plain,tc)4521fc42128SKyle Evans ATF_TC_BODY(jail_attach_plain, tc)
4531fc42128SKyle Evans {
4541fc42128SKyle Evans 
4551fc42128SKyle Evans 	do_jail_test(1, false, &jail_attach_plain_pro, &jail_attach_jset_epi);
4561fc42128SKyle Evans }
4571fc42128SKyle Evans 
45860c4ec80SKyle Evans static int
jail_attach_disjoint_newjail(int fd)45960c4ec80SKyle Evans jail_attach_disjoint_newjail(int fd)
46060c4ec80SKyle Evans {
46160c4ec80SKyle Evans 	struct iovec iov[2];
46260c4ec80SKyle Evans 	char *name;
46360c4ec80SKyle Evans 	int jid;
46460c4ec80SKyle Evans 
46560c4ec80SKyle Evans 	if (asprintf(&name, "cpuset_%d", getpid()) == -1)
46660c4ec80SKyle Evans 		_exit(42);
46760c4ec80SKyle Evans 
46860c4ec80SKyle Evans 	iov[0].iov_base = "name";
46960c4ec80SKyle Evans 	iov[0].iov_len = sizeof("name");
47060c4ec80SKyle Evans 
47160c4ec80SKyle Evans 	iov[1].iov_base = name;
47260c4ec80SKyle Evans 	iov[1].iov_len = strlen(name) + 1;
47360c4ec80SKyle Evans 
47460c4ec80SKyle Evans 	if ((jid = jail_set(iov, 2, JAIL_CREATE | JAIL_ATTACH)) < 0)
47560c4ec80SKyle Evans 		return (FAILURE_JAIL);
47660c4ec80SKyle Evans 
47760c4ec80SKyle Evans 	/* Signal that we're ready. */
47860c4ec80SKyle Evans 	write(fd, &jid, sizeof(jid));
47960c4ec80SKyle Evans 	for (;;) {
48060c4ec80SKyle Evans 		/* Spin */
48160c4ec80SKyle Evans 	}
48260c4ec80SKyle Evans }
48360c4ec80SKyle Evans 
48460c4ec80SKyle Evans static int
wait_jail(int fd,int pfd)48560c4ec80SKyle Evans wait_jail(int fd, int pfd)
48660c4ec80SKyle Evans {
48760c4ec80SKyle Evans 	fd_set lset;
48860c4ec80SKyle Evans 	struct timeval tv;
48960c4ec80SKyle Evans 	int error, jid, maxfd;
49060c4ec80SKyle Evans 
49160c4ec80SKyle Evans 	FD_ZERO(&lset);
49260c4ec80SKyle Evans 	FD_SET(fd, &lset);
49360c4ec80SKyle Evans 	FD_SET(pfd, &lset);
49460c4ec80SKyle Evans 
49560c4ec80SKyle Evans 	maxfd = MAX(fd, pfd);
49660c4ec80SKyle Evans 
49760c4ec80SKyle Evans 	tv.tv_sec = 5;
49860c4ec80SKyle Evans 	tv.tv_usec = 0;
49960c4ec80SKyle Evans 
50060c4ec80SKyle Evans 	/* Wait for jid to be written. */
50160c4ec80SKyle Evans 	do {
50260c4ec80SKyle Evans 		error = select(maxfd + 1, &lset, NULL, NULL, &tv);
50360c4ec80SKyle Evans 	} while (error == -1 && errno == EINTR);
50460c4ec80SKyle Evans 
50560c4ec80SKyle Evans 	if (error == 0) {
50660c4ec80SKyle Evans 		atf_tc_fail("Jail creator did not respond in time.");
50760c4ec80SKyle Evans 	}
50860c4ec80SKyle Evans 
50960c4ec80SKyle Evans 	ATF_REQUIRE_MSG(error > 0, "Unexpected error %d from select()", errno);
51060c4ec80SKyle Evans 
51160c4ec80SKyle Evans 	if (FD_ISSET(pfd, &lset)) {
51260c4ec80SKyle Evans 		/* Process died */
51360c4ec80SKyle Evans 		atf_tc_fail("Jail creator died unexpectedly.");
51460c4ec80SKyle Evans 	}
51560c4ec80SKyle Evans 
51660c4ec80SKyle Evans 	ATF_REQUIRE(FD_ISSET(fd, &lset));
51760c4ec80SKyle Evans 	ATF_REQUIRE_EQ(sizeof(jid), recv(fd, &jid, sizeof(jid), 0));
51860c4ec80SKyle Evans 
51960c4ec80SKyle Evans 	return (jid);
52060c4ec80SKyle Evans }
52160c4ec80SKyle Evans 
52260c4ec80SKyle Evans static int
try_attach_child(int jid,cpuset_t * expected_mask)52360c4ec80SKyle Evans try_attach_child(int jid, cpuset_t *expected_mask)
52460c4ec80SKyle Evans {
52560c4ec80SKyle Evans 	cpuset_t mask;
52660c4ec80SKyle Evans 
52760c4ec80SKyle Evans 	if (jail_attach(jid) == -1) {
52860c4ec80SKyle Evans 		if (errno == EDEADLK)
52960c4ec80SKyle Evans 			return (FAILURE_DEADLK);
53060c4ec80SKyle Evans 		return (FAILURE_ATTACH);
53160c4ec80SKyle Evans 	}
53260c4ec80SKyle Evans 
53360c4ec80SKyle Evans 	if (expected_mask == NULL)
53460c4ec80SKyle Evans 		return (FAILURE_SUCCESS);
53560c4ec80SKyle Evans 
53660c4ec80SKyle Evans 	/* If we had an expected mask, check it against the new process mask. */
53760c4ec80SKyle Evans 	CPU_ZERO(&mask);
53860c4ec80SKyle Evans 	if (cpuset_getaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID,
53960c4ec80SKyle Evans 	    -1, sizeof(mask), &mask) != 0) {
54060c4ec80SKyle Evans 		return (FAILURE_MASK);
54160c4ec80SKyle Evans 	}
54260c4ec80SKyle Evans 
54360c4ec80SKyle Evans 	if (CPU_CMP(expected_mask, &mask) != 0)
54460c4ec80SKyle Evans 		return (FAILURE_BADAFFIN);
54560c4ec80SKyle Evans 
54660c4ec80SKyle Evans 	return (0);
54760c4ec80SKyle Evans }
54860c4ec80SKyle Evans 
54960c4ec80SKyle Evans static void
try_attach(int jid,cpuset_t * expected_mask)55060c4ec80SKyle Evans try_attach(int jid, cpuset_t *expected_mask)
55160c4ec80SKyle Evans {
55260c4ec80SKyle Evans 	const char *errstr;
55360c4ec80SKyle Evans 	pid_t pid;
55460c4ec80SKyle Evans 	int error, fail, status;
55560c4ec80SKyle Evans 
55660c4ec80SKyle Evans 	ATF_REQUIRE(expected_mask != NULL);
55760c4ec80SKyle Evans 	ATF_REQUIRE((pid = fork()) != -1);
55860c4ec80SKyle Evans 	if (pid == 0)
55960c4ec80SKyle Evans 		_exit(try_attach_child(jid, expected_mask));
56060c4ec80SKyle Evans 
56160c4ec80SKyle Evans 	while ((error = waitpid(pid, &status, 0)) == -1 && errno == EINTR) {
56260c4ec80SKyle Evans 		/* Try again. */
56360c4ec80SKyle Evans 	}
56460c4ec80SKyle Evans 
56560c4ec80SKyle Evans 	/* Sanity check the exit info. */
56660c4ec80SKyle Evans 	ATF_REQUIRE_EQ(pid, error);
56760c4ec80SKyle Evans 	ATF_REQUIRE(WIFEXITED(status));
56860c4ec80SKyle Evans 	if ((fail = WEXITSTATUS(status)) != 0) {
56960c4ec80SKyle Evans 		errstr = do_jail_errstr(fail);
57060c4ec80SKyle Evans 		if (errstr != NULL)
57160c4ec80SKyle Evans 			atf_tc_fail("%s", errstr);
57260c4ec80SKyle Evans 		else
57360c4ec80SKyle Evans 			atf_tc_fail("Unknown error '%d'", WEXITSTATUS(status));
57460c4ec80SKyle Evans 	}
57560c4ec80SKyle Evans }
57660c4ec80SKyle Evans 
57760c4ec80SKyle Evans ATF_TC(jail_attach_disjoint);
ATF_TC_HEAD(jail_attach_disjoint,tc)57860c4ec80SKyle Evans ATF_TC_HEAD(jail_attach_disjoint, tc)
57960c4ec80SKyle Evans {
58060c4ec80SKyle Evans 	atf_tc_set_md_var(tc, "descr",
58160c4ec80SKyle Evans 	    "Test root attachment into completely disjoint jail cpuset.");
58260c4ec80SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
58360c4ec80SKyle Evans }
ATF_TC_BODY(jail_attach_disjoint,tc)58460c4ec80SKyle Evans ATF_TC_BODY(jail_attach_disjoint, tc)
58560c4ec80SKyle Evans {
58660c4ec80SKyle Evans 	cpuset_t smask, jmask;
58760c4ec80SKyle Evans 	int sockpair[2];
58860c4ec80SKyle Evans 	cpusetid_t setid;
58960c4ec80SKyle Evans 	pid_t pid;
59060c4ec80SKyle Evans 	int fcpu, jid, pfd, sock, scpu;
59160c4ec80SKyle Evans 
59260c4ec80SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset(&setid));
59360c4ec80SKyle Evans 
59460c4ec80SKyle Evans 	skip_ltncpu(2, &jmask);
59560c4ec80SKyle Evans 	fcpu = CPU_FFS(&jmask) - 1;
59660c4ec80SKyle Evans 	ATF_REQUIRE_EQ(0, socketpair(PF_UNIX, SOCK_STREAM, 0, sockpair));
59760c4ec80SKyle Evans 
59860c4ec80SKyle Evans 	/* We'll wait on the procdesc, too, so we can fail faster if it dies. */
59960c4ec80SKyle Evans 	ATF_REQUIRE((pid = pdfork(&pfd, 0)) != -1);
60060c4ec80SKyle Evans 
60160c4ec80SKyle Evans 	if (pid == 0) {
60260c4ec80SKyle Evans 		/* First child sets up the jail. */
60360c4ec80SKyle Evans 		sock = sockpair[SP_CHILD];
60460c4ec80SKyle Evans 		close(sockpair[SP_PARENT]);
60560c4ec80SKyle Evans 
60660c4ec80SKyle Evans 		_exit(jail_attach_disjoint_newjail(sock));
60760c4ec80SKyle Evans 	}
60860c4ec80SKyle Evans 
60960c4ec80SKyle Evans 	close(sockpair[SP_CHILD]);
61060c4ec80SKyle Evans 	sock = sockpair[SP_PARENT];
61160c4ec80SKyle Evans 
61260c4ec80SKyle Evans 	ATF_REQUIRE((jid = wait_jail(sock, pfd)) > 0);
61360c4ec80SKyle Evans 
61460c4ec80SKyle Evans 	/*
61560c4ec80SKyle Evans 	 * This process will be clamped down to the first cpu, while the jail
61660c4ec80SKyle Evans 	 * will simply have the first CPU removed to make it a completely
61760c4ec80SKyle Evans 	 * disjoint operation.
61860c4ec80SKyle Evans 	 */
61960c4ec80SKyle Evans 	CPU_ZERO(&smask);
62060c4ec80SKyle Evans 	CPU_SET(fcpu, &smask);
62160c4ec80SKyle Evans 	CPU_CLR(fcpu, &jmask);
62260c4ec80SKyle Evans 
62360c4ec80SKyle Evans 	/*
62460c4ec80SKyle Evans 	 * We'll test with the first and second cpu set as well.  Only the
62560c4ec80SKyle Evans 	 * second cpu should be used.
62660c4ec80SKyle Evans 	 */
62760c4ec80SKyle Evans 	scpu = CPU_FFS(&jmask) - 1;
62860c4ec80SKyle Evans 
62960c4ec80SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_ROOT, CPU_WHICH_JAIL,
63060c4ec80SKyle Evans 	    jid, sizeof(jmask), &jmask));
63160c4ec80SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_CPUSET,
63260c4ec80SKyle Evans 	    setid, sizeof(smask), &smask));
63360c4ec80SKyle Evans 
63460c4ec80SKyle Evans 	try_attach(jid, &jmask);
63560c4ec80SKyle Evans 
63660c4ec80SKyle Evans 	CPU_SET(scpu, &smask);
63760c4ec80SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_CPUSET,
63860c4ec80SKyle Evans 	    setid, sizeof(smask), &smask));
63960c4ec80SKyle Evans 
64060c4ec80SKyle Evans 	CPU_CLR(fcpu, &smask);
64160c4ec80SKyle Evans 	try_attach(jid, &smask);
64260c4ec80SKyle Evans }
64360c4ec80SKyle Evans 
6441fc42128SKyle Evans ATF_TC(badparent);
ATF_TC_HEAD(badparent,tc)6451fc42128SKyle Evans ATF_TC_HEAD(badparent, tc)
6461fc42128SKyle Evans {
6471fc42128SKyle Evans 	atf_tc_set_md_var(tc, "descr",
6481fc42128SKyle Evans 	    "Test parent assignment when assigning a new cpuset.");
6491fc42128SKyle Evans }
ATF_TC_BODY(badparent,tc)6501fc42128SKyle Evans ATF_TC_BODY(badparent, tc)
6511fc42128SKyle Evans {
6521fc42128SKyle Evans 	cpuset_t mask;
6531fc42128SKyle Evans 	cpusetid_t finalsetid, origsetid, setid;
6541fc42128SKyle Evans 
6551fc42128SKyle Evans 	/* Need to mask off at least one CPU. */
6561fc42128SKyle Evans 	skip_ltncpu(2, &mask);
6571fc42128SKyle Evans 
6581fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, -1,
6591fc42128SKyle Evans 	    &origsetid));
6601fc42128SKyle Evans 
6611fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset(&setid));
6621fc42128SKyle Evans 
6631fc42128SKyle Evans 	/*
6641fc42128SKyle Evans 	 * Mask off the first CPU, then we'll reparent ourselves to our original
6651fc42128SKyle Evans 	 * set.
6661fc42128SKyle Evans 	 */
6671fc42128SKyle Evans 	CPU_CLR(CPU_FFS(&mask) - 1, &mask);
6681fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
6691fc42128SKyle Evans 	    -1, sizeof(mask), &mask));
6701fc42128SKyle Evans 
6711fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_setid(CPU_WHICH_PID, -1, origsetid));
6721fc42128SKyle Evans 	ATF_REQUIRE_EQ(0, cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, -1,
6731fc42128SKyle Evans 	    &finalsetid));
6741fc42128SKyle Evans 
6751fc42128SKyle Evans 	ATF_REQUIRE_EQ(finalsetid, origsetid);
6761fc42128SKyle Evans }
6771fc42128SKyle Evans 
ATF_TP_ADD_TCS(tp)6781fc42128SKyle Evans ATF_TP_ADD_TCS(tp)
6791fc42128SKyle Evans {
6801fc42128SKyle Evans 
6811fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, newset);
6821fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, transient);
6831fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, deadlk);
6841fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, jail_attach_newbase);
6851fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, jail_attach_newbase_plain);
6861fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, jail_attach_prevbase);
6871fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, jail_attach_plain);
68860c4ec80SKyle Evans 	ATF_TP_ADD_TC(tp, jail_attach_disjoint);
6891fc42128SKyle Evans 	ATF_TP_ADD_TC(tp, badparent);
6901fc42128SKyle Evans 	return (atf_no_error());
6911fc42128SKyle Evans }
692