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

Reply via email to