Module Name: src Committed By: riastradh Date: Wed Aug 9 08:23:03 UTC 2023
Modified Files: src/tests/rump/kernspace: kernspace.h workqueue.c src/tests/rump/rumpkern: t_workqueue.c Log Message: workqueue(9) tests: Add test for PR kern/57574. XXX pullup-10 XXX pullup-9 XXX pullup-8 To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/tests/rump/kernspace/kernspace.h \ src/tests/rump/kernspace/workqueue.c cvs rdiff -u -r1.2 -r1.3 src/tests/rump/rumpkern/t_workqueue.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/rump/kernspace/kernspace.h diff -u src/tests/rump/kernspace/kernspace.h:1.8 src/tests/rump/kernspace/kernspace.h:1.9 --- src/tests/rump/kernspace/kernspace.h:1.8 Fri Dec 28 19:54:36 2018 +++ src/tests/rump/kernspace/kernspace.h Wed Aug 9 08:23:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: kernspace.h,v 1.8 2018/12/28 19:54:36 thorpej Exp $ */ +/* $NetBSD: kernspace.h,v 1.9 2023/08/09 08:23:02 riastradh Exp $ */ /*- * Copyright (c) 2010, 2018 The NetBSD Foundation, Inc. @@ -42,6 +42,7 @@ void rumptest_alloc(size_t); void rumptest_lockme(enum locktest); void rumptest_workqueue1(void); void rumptest_workqueue_wait(void); +void rumptest_workqueue_wait_pause(void); void rumptest_sendsig(char *); void rumptest_localsig(int); Index: src/tests/rump/kernspace/workqueue.c diff -u src/tests/rump/kernspace/workqueue.c:1.8 src/tests/rump/kernspace/workqueue.c:1.9 --- src/tests/rump/kernspace/workqueue.c:1.8 Wed Aug 9 08:22:53 2023 +++ src/tests/rump/kernspace/workqueue.c Wed Aug 9 08:23:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: workqueue.c,v 1.8 2023/08/09 08:22:53 riastradh Exp $ */ +/* $NetBSD: workqueue.c,v 1.9 2023/08/09 08:23:02 riastradh Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: workqueue.c,v 1.8 2023/08/09 08:22:53 riastradh Exp $"); +__RCSID("$NetBSD: workqueue.c,v 1.9 2023/08/09 08:23:02 riastradh Exp $"); #endif /* !lint */ #include <sys/param.h> @@ -48,6 +48,7 @@ struct test_softc { struct workqueue *wq; struct work wk; int counter; + bool pause; }; static void @@ -57,6 +58,9 @@ rump_work1(struct work *wk, void *arg) memset(wk, 0x5a, sizeof(*wk)); + if (sc->pause) + kpause("tstwk1", /*intr*/false, /*timo*/2, /*lock*/NULL); + mutex_enter(&sc->mtx); ++sc->counter; cv_broadcast(&sc->cv); @@ -139,3 +143,33 @@ rumptest_workqueue_wait(void) destroy_sc(sc); #undef ITERATIONS } + +void +rumptest_workqueue_wait_pause(void) +{ + struct test_softc *sc; + struct work dummy; + + sc = create_sc(); + sc->pause = true; + +#define ITERATIONS 1 + for (size_t i = 0; i < ITERATIONS; ++i) { + struct work wk; + + KASSERT(sc->counter == i); + workqueue_enqueue(sc->wq, &wk, NULL); + workqueue_enqueue(sc->wq, &sc->wk, NULL); + kpause("tstwk2", /*intr*/false, /*timo*/1, /*lock*/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 +} Index: src/tests/rump/rumpkern/t_workqueue.c diff -u src/tests/rump/rumpkern/t_workqueue.c:1.2 src/tests/rump/rumpkern/t_workqueue.c:1.3 --- src/tests/rump/rumpkern/t_workqueue.c:1.2 Thu Dec 28 07:10:26 2017 +++ src/tests/rump/rumpkern/t_workqueue.c Wed Aug 9 08:23:03 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: t_workqueue.c,v 1.2 2017/12/28 07:10:26 ozaki-r Exp $ */ +/* $NetBSD: t_workqueue.c,v 1.3 2023/08/09 08:23:03 riastradh Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -72,10 +72,37 @@ ATF_TC_BODY(workqueue_wait, tc) rump_unschedule(); } +static void +sigsegv(int signo) +{ + atf_tc_fail("SIGSEGV"); +} + +ATF_TC(workqueue_wait_pause); +ATF_TC_HEAD(workqueue_wait_pause, tc) +{ + + atf_tc_set_md_var(tc, "descr", "Checks workqueue_wait with pause"); +} + +ATF_TC_BODY(workqueue_wait_pause, tc) +{ + + atf_tc_expect_fail("PR kern/57574"); + REQUIRE_LIBC(signal(SIGSEGV, &sigsegv), SIG_ERR); + + rump_init(); + + rump_schedule(); + rumptest_workqueue_wait_pause(); /* panics or SIGSEGVs if fails */ + rump_unschedule(); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, workqueue1); ATF_TP_ADD_TC(tp, workqueue_wait); + ATF_TP_ADD_TC(tp, workqueue_wait_pause); return atf_no_error(); }