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