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