xref: /netbsd-src/tests/rump/rumpkern/t_threadpool.c (revision 032c1d01a187d067263e16b259557bfdc0d313d3)
1*032c1d01Sthorpej /*	$NetBSD: t_threadpool.c,v 1.2 2018/12/28 19:54:36 thorpej Exp $	*/
277118773Sthorpej 
377118773Sthorpej /*-
477118773Sthorpej  * Copyright (c) 2018 The NetBSD Foundation, Inc.
577118773Sthorpej  * All rights reserved.
677118773Sthorpej  *
777118773Sthorpej  * Redistribution and use in source and binary forms, with or without
877118773Sthorpej  * modification, are permitted provided that the following conditions
977118773Sthorpej  * are met:
1077118773Sthorpej  * 1. Redistributions of source code must retain the above copyright
1177118773Sthorpej  *    notice, this list of conditions and the following disclaimer.
1277118773Sthorpej  * 2. Redistributions in binary form must reproduce the above copyright
1377118773Sthorpej  *    notice, this list of conditions and the following disclaimer in the
1477118773Sthorpej  *    documentation and/or other materials provided with the distribution.
1577118773Sthorpej  *
1677118773Sthorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
1777118773Sthorpej  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
1877118773Sthorpej  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1977118773Sthorpej  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2077118773Sthorpej  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
2177118773Sthorpej  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2277118773Sthorpej  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2377118773Sthorpej  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2477118773Sthorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2577118773Sthorpej  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2677118773Sthorpej  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2777118773Sthorpej  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2877118773Sthorpej  */
2977118773Sthorpej 
3077118773Sthorpej #include <sys/types.h>
3177118773Sthorpej #include <sys/mount.h>
3277118773Sthorpej #include <sys/sysctl.h>
3377118773Sthorpej 
3477118773Sthorpej #include <rump/rump.h>
3577118773Sthorpej 
3677118773Sthorpej #include <atf-c.h>
3777118773Sthorpej 
3877118773Sthorpej #include "h_macros.h"
3977118773Sthorpej #include "../kernspace/kernspace.h"
4077118773Sthorpej 
4177118773Sthorpej ATF_TC(threadpool_unbound_lifecycle);
ATF_TC_HEAD(threadpool_unbound_lifecycle,tc)4277118773Sthorpej ATF_TC_HEAD(threadpool_unbound_lifecycle, tc)
4377118773Sthorpej {
4477118773Sthorpej 
4577118773Sthorpej 	atf_tc_set_md_var(tc, "descr", "Tests unbound threadpool lifecycle");
4677118773Sthorpej }
4777118773Sthorpej 
ATF_TC_BODY(threadpool_unbound_lifecycle,tc)4877118773Sthorpej ATF_TC_BODY(threadpool_unbound_lifecycle, tc)
4977118773Sthorpej {
5077118773Sthorpej 
5177118773Sthorpej 	rump_init();
5277118773Sthorpej 
5377118773Sthorpej 	rump_schedule();
5477118773Sthorpej 	rumptest_threadpool_unbound_lifecycle(); /* panics if fails */
5577118773Sthorpej 	rump_unschedule();
5677118773Sthorpej }
5777118773Sthorpej 
5877118773Sthorpej ATF_TC(threadpool_percpu_lifecycle);
ATF_TC_HEAD(threadpool_percpu_lifecycle,tc)5977118773Sthorpej ATF_TC_HEAD(threadpool_percpu_lifecycle, tc)
6077118773Sthorpej {
6177118773Sthorpej 
6277118773Sthorpej 	atf_tc_set_md_var(tc, "descr", "Tests percpu threadpool lifecycle");
6377118773Sthorpej }
6477118773Sthorpej 
ATF_TC_BODY(threadpool_percpu_lifecycle,tc)6577118773Sthorpej ATF_TC_BODY(threadpool_percpu_lifecycle, tc)
6677118773Sthorpej {
6777118773Sthorpej 
6877118773Sthorpej 	rump_init();
6977118773Sthorpej 
7077118773Sthorpej 	rump_schedule();
7177118773Sthorpej 	rumptest_threadpool_percpu_lifecycle(); /* panics if fails */
7277118773Sthorpej 	rump_unschedule();
7377118773Sthorpej }
7477118773Sthorpej 
7577118773Sthorpej ATF_TC(threadpool_unbound_schedule);
ATF_TC_HEAD(threadpool_unbound_schedule,tc)7677118773Sthorpej ATF_TC_HEAD(threadpool_unbound_schedule, tc)
7777118773Sthorpej {
7877118773Sthorpej 
7977118773Sthorpej 	atf_tc_set_md_var(tc, "descr",
8077118773Sthorpej 	    "Tests scheduling on unbound threadpools");
8177118773Sthorpej }
8277118773Sthorpej 
ATF_TC_BODY(threadpool_unbound_schedule,tc)8377118773Sthorpej ATF_TC_BODY(threadpool_unbound_schedule, tc)
8477118773Sthorpej {
8577118773Sthorpej 
8677118773Sthorpej 	rump_init();
8777118773Sthorpej 
8877118773Sthorpej 	rump_schedule();
8977118773Sthorpej 	rumptest_threadpool_unbound_schedule(); /* panics if fails */
9077118773Sthorpej 	rump_unschedule();
9177118773Sthorpej }
9277118773Sthorpej 
9377118773Sthorpej ATF_TC(threadpool_percpu_schedule);
ATF_TC_HEAD(threadpool_percpu_schedule,tc)9477118773Sthorpej ATF_TC_HEAD(threadpool_percpu_schedule, tc)
9577118773Sthorpej {
9677118773Sthorpej 
9777118773Sthorpej 	atf_tc_set_md_var(tc, "descr",
9877118773Sthorpej 	    "Tests scheduling on percpu threadpools");
9977118773Sthorpej }
10077118773Sthorpej 
ATF_TC_BODY(threadpool_percpu_schedule,tc)10177118773Sthorpej ATF_TC_BODY(threadpool_percpu_schedule, tc)
10277118773Sthorpej {
10377118773Sthorpej 
10477118773Sthorpej 	rump_init();
10577118773Sthorpej 
10677118773Sthorpej 	rump_schedule();
10777118773Sthorpej 	rumptest_threadpool_percpu_schedule(); /* panics if fails */
10877118773Sthorpej 	rump_unschedule();
10977118773Sthorpej }
11077118773Sthorpej 
11177118773Sthorpej ATF_TC(threadpool_job_cancel);
ATF_TC_HEAD(threadpool_job_cancel,tc)11277118773Sthorpej ATF_TC_HEAD(threadpool_job_cancel, tc)
11377118773Sthorpej {
11477118773Sthorpej 
11577118773Sthorpej 	atf_tc_set_md_var(tc, "descr",
11677118773Sthorpej 	    "Tests synchronizing with job cancellation");
11777118773Sthorpej }
11877118773Sthorpej 
ATF_TC_BODY(threadpool_job_cancel,tc)11977118773Sthorpej ATF_TC_BODY(threadpool_job_cancel, tc)
12077118773Sthorpej {
12177118773Sthorpej 
12277118773Sthorpej 	rump_init();
12377118773Sthorpej 
12477118773Sthorpej 	rump_schedule();
12577118773Sthorpej 	rumptest_threadpool_job_cancel(); /* panics if fails */
12677118773Sthorpej 	rump_unschedule();
12777118773Sthorpej }
12877118773Sthorpej 
129*032c1d01Sthorpej ATF_TC(threadpool_job_cancelthrash);
ATF_TC_HEAD(threadpool_job_cancelthrash,tc)130*032c1d01Sthorpej ATF_TC_HEAD(threadpool_job_cancelthrash, tc)
131*032c1d01Sthorpej {
132*032c1d01Sthorpej 
133*032c1d01Sthorpej 	atf_tc_set_md_var(tc, "descr",
134*032c1d01Sthorpej 	    "Tests thrashing job scheduling / cancellation");
135*032c1d01Sthorpej }
136*032c1d01Sthorpej 
ATF_TC_BODY(threadpool_job_cancelthrash,tc)137*032c1d01Sthorpej ATF_TC_BODY(threadpool_job_cancelthrash, tc)
138*032c1d01Sthorpej {
139*032c1d01Sthorpej 
140*032c1d01Sthorpej 	rump_init();
141*032c1d01Sthorpej 
142*032c1d01Sthorpej 	rump_schedule();
143*032c1d01Sthorpej 	rumptest_threadpool_job_cancelthrash(); /* panics if fails */
144*032c1d01Sthorpej 	rump_unschedule();
145*032c1d01Sthorpej }
146*032c1d01Sthorpej 
ATF_TP_ADD_TCS(tp)14777118773Sthorpej ATF_TP_ADD_TCS(tp)
14877118773Sthorpej {
14977118773Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_unbound_lifecycle);
15077118773Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_percpu_lifecycle);
15177118773Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_unbound_schedule);
15277118773Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_percpu_schedule);
15377118773Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_job_cancel);
154*032c1d01Sthorpej 	ATF_TP_ADD_TC(tp, threadpool_job_cancelthrash);
15577118773Sthorpej 
15677118773Sthorpej 	return atf_no_error();
15777118773Sthorpej }
158