Module Name: src
Committed By: riastradh
Date: Wed Aug 9 08:23:25 UTC 2023
Modified Files:
src/sys/kern: subr_workqueue.c
Log Message:
workqueue(9): Sprinkle dtrace probes for workqueue_wait edge cases.
Let's make it easy to find out whether these are hit.
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/kern/subr_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/sys/kern/subr_workqueue.c
diff -u src/sys/kern/subr_workqueue.c:1.42 src/sys/kern/subr_workqueue.c:1.43
--- src/sys/kern/subr_workqueue.c:1.42 Wed Aug 9 08:23:13 2023
+++ src/sys/kern/subr_workqueue.c Wed Aug 9 08:23:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_workqueue.c,v 1.42 2023/08/09 08:23:13 riastradh Exp $ */
+/* $NetBSD: subr_workqueue.c,v 1.43 2023/08/09 08:23:25 riastradh Exp $ */
/*-
* Copyright (c)2002, 2005, 2006, 2007 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.42 2023/08/09 08:23:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.43 2023/08/09 08:23:25 riastradh Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -98,6 +98,12 @@ SDT_PROBE_DEFINE4(sdt, kernel, workqueue
SDT_PROBE_DEFINE2(sdt, kernel, workqueue, wait__start,
"struct workqueue *"/*wq*/,
"struct work *"/*wk*/);
+SDT_PROBE_DEFINE2(sdt, kernel, workqueue, wait__self,
+ "struct workqueue *"/*wq*/,
+ "struct work *"/*wk*/);
+SDT_PROBE_DEFINE2(sdt, kernel, workqueue, wait__hit,
+ "struct workqueue *"/*wq*/,
+ "struct work *"/*wk*/);
SDT_PROBE_DEFINE2(sdt, kernel, workqueue, wait__done,
"struct workqueue *"/*wq*/,
"struct work *"/*wk*/);
@@ -334,7 +340,8 @@ workqueue_create(struct workqueue **wqp,
}
static bool
-workqueue_q_wait(struct workqueue_queue *q, work_impl_t *wk_target)
+workqueue_q_wait(struct workqueue *wq, struct workqueue_queue *q,
+ work_impl_t *wk_target)
{
work_impl_t *wk;
bool found = false;
@@ -349,8 +356,10 @@ workqueue_q_wait(struct workqueue_queue
*
* XXX Are there use-cases that require this semantics?
*/
- if (q->q_worker == curlwp)
+ if (q->q_worker == curlwp) {
+ SDT_PROBE2(sdt, kernel, workqueue, wait__self, wq, wk_target);
goto out;
+ }
/*
* Wait until the target is no longer pending. If we find it
@@ -362,6 +371,7 @@ workqueue_q_wait(struct workqueue_queue
again:
SIMPLEQ_FOREACH(wk, &q->q_queue_pending, wk_entry) {
if (wk == wk_target) {
+ SDT_PROBE2(sdt, kernel, workqueue, wait__hit, wq, wk);
found = true;
cv_wait(&q->q_cv, &q->q_mutex);
goto again;
@@ -406,13 +416,13 @@ workqueue_wait(struct workqueue *wq, str
CPU_INFO_ITERATOR cii;
for (CPU_INFO_FOREACH(cii, ci)) {
q = workqueue_queue_lookup(wq, ci);
- found = workqueue_q_wait(q, (work_impl_t *)wk);
+ found = workqueue_q_wait(wq, q, (work_impl_t *)wk);
if (found)
break;
}
} else {
q = workqueue_queue_lookup(wq, NULL);
- (void) workqueue_q_wait(q, (work_impl_t *)wk);
+ (void)workqueue_q_wait(wq, q, (work_impl_t *)wk);
}
SDT_PROBE2(sdt, kernel, workqueue, wait__done, wq, wk);
}