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();
}