commit 4ed99cf6125d64fa16f8920aa4f8a80c863c3d52 Author: Ryota Ozaki Date: Wed Dec 27 18:50:47 2017 +0900 Add tests for workqueue_wait diff --git a/tests/rump/kernspace/kernspace.h b/tests/rump/kernspace/kernspace.h index 412fb4346de..41b60b612db 100644 --- a/tests/rump/kernspace/kernspace.h +++ b/tests/rump/kernspace/kernspace.h @@ -41,6 +41,7 @@ void rumptest_tsleep(void); void rumptest_alloc(size_t); void rumptest_lockme(enum locktest); void rumptest_workqueue1(void); +void rumptest_workqueue_wait(void); void rumptest_sendsig(char *); void rumptest_localsig(int); diff --git a/tests/rump/kernspace/workqueue.c b/tests/rump/kernspace/workqueue.c index 88b7da08f1f..6e8f9bcb2c7 100644 --- a/tests/rump/kernspace/workqueue.c +++ b/tests/rump/kernspace/workqueue.c @@ -106,6 +106,31 @@ rumptest_workqueue1() KASSERT(sc->counter == ITERATIONS); + destroy_sc(sc); +#undef ITERATIONS +} + +void +rumptest_workqueue_wait(void) +{ + struct test_softc *sc; + struct work dummy; + + sc = create_sc(); + +#define ITERATIONS 12435 + for (size_t i = 0; i < ITERATIONS; ++i) { + KASSERT(sc->counter == i); + workqueue_enqueue(sc->wq, &sc->wk, NULL); + workqueue_wait(sc->wq, &sc->wk); + KASSERT(sc->counter == (i + 1)); + } + + KASSERT(sc->counter == ITERATIONS); + + /* Wait for a work that is not enqueued. Just return immediately. */ + workqueue_wait(sc->wq, &dummy); + destroy_sc(sc); #undef ITERATIONS } diff --git a/tests/rump/rumpkern/t_workqueue.c b/tests/rump/rumpkern/t_workqueue.c index a32f6b12832..760f73f61b0 100644 --- a/tests/rump/rumpkern/t_workqueue.c +++ b/tests/rump/rumpkern/t_workqueue.c @@ -55,9 +55,27 @@ ATF_TC_BODY(workqueue1, tc) rump_unschedule(); } +ATF_TC(workqueue_wait); +ATF_TC_HEAD(workqueue_wait, tc) +{ + + atf_tc_set_md_var(tc, "descr", "Checks workqueue_wait"); +} + +ATF_TC_BODY(workqueue_wait, tc) +{ + + rump_init(); + + rump_schedule(); + rumptest_workqueue_wait(); /* panics if fails */ + rump_unschedule(); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, workqueue1); + ATF_TP_ADD_TC(tp, workqueue_wait); return atf_no_error(); }