Module Name: src Committed By: riastradh Date: Sun Dec 19 01:03:57 UTC 2021
Modified Files: src/sys/external/bsd/common/include/linux: workqueue.h src/sys/external/bsd/common/linux: linux_work.c Log Message: Implement return value of flush_work, flush_delayed_work. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 \ src/sys/external/bsd/common/include/linux/workqueue.h cvs rdiff -u -r1.47 -r1.48 src/sys/external/bsd/common/linux/linux_work.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/external/bsd/common/include/linux/workqueue.h diff -u src/sys/external/bsd/common/include/linux/workqueue.h:1.15 src/sys/external/bsd/common/include/linux/workqueue.h:1.16 --- src/sys/external/bsd/common/include/linux/workqueue.h:1.15 Sun Dec 19 01:03:50 2021 +++ src/sys/external/bsd/common/include/linux/workqueue.h Sun Dec 19 01:03:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: workqueue.h,v 1.15 2021/12/19 01:03:50 riastradh Exp $ */ +/* $NetBSD: workqueue.h,v 1.16 2021/12/19 01:03:57 riastradh Exp $ */ /*- * Copyright (c) 2013, 2018 The NetBSD Foundation, Inc. @@ -110,7 +110,7 @@ bool schedule_work(struct work_struct *) bool queue_work(struct workqueue_struct *, struct work_struct *); bool cancel_work(struct work_struct *); bool cancel_work_sync(struct work_struct *); -void flush_work(struct work_struct *); +bool flush_work(struct work_struct *); void INIT_DELAYED_WORK(struct delayed_work *, void (*)(struct work_struct *)); @@ -121,7 +121,7 @@ bool mod_delayed_work(struct workqueue_s unsigned long ticks); bool cancel_delayed_work(struct delayed_work *); bool cancel_delayed_work_sync(struct delayed_work *); -void flush_delayed_work(struct delayed_work *); +bool flush_delayed_work(struct delayed_work *); struct work_struct * current_work(void); Index: src/sys/external/bsd/common/linux/linux_work.c diff -u src/sys/external/bsd/common/linux/linux_work.c:1.47 src/sys/external/bsd/common/linux/linux_work.c:1.48 --- src/sys/external/bsd/common/linux/linux_work.c:1.47 Sun Dec 19 00:49:00 2021 +++ src/sys/external/bsd/common/linux/linux_work.c Sun Dec 19 01:03:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_work.c,v 1.47 2021/12/19 00:49:00 riastradh Exp $ */ +/* $NetBSD: linux_work.c,v 1.48 2021/12/19 01:03:57 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.47 2021/12/19 00:49:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.48 2021/12/19 01:03:57 riastradh Exp $"); #include <sys/types.h> #include <sys/atomic.h> @@ -1430,17 +1430,21 @@ flush_workqueue(struct workqueue_struct * * If work is queued or currently executing, wait for it to * complete. + * + * Return true if we waited to flush it, false if it was already + * idle. */ -void +bool flush_work(struct work_struct *work) { struct workqueue_struct *wq; /* If there's no workqueue, nothing to flush. */ if ((wq = work_queue(work)) == NULL) - return; + return false; flush_workqueue(wq); + return true; } /* @@ -1450,14 +1454,15 @@ flush_work(struct work_struct *work) * instead. Then, if dw is queued or currently executing, wait * for it to complete. */ -void +bool flush_delayed_work(struct delayed_work *dw) { struct workqueue_struct *wq; + bool waited = false; /* If there's no workqueue, nothing to flush. */ if ((wq = work_queue(&dw->work)) == NULL) - return; + return false; mutex_enter(&wq->wq_lock); if (__predict_false(work_queue(&dw->work) != wq)) { @@ -1466,6 +1471,7 @@ flush_delayed_work(struct delayed_work * * queue, though that would be ill-advised), so it must * have completed, and we have nothing more to do. */ + waited = false; } else { switch (dw->dw_state) { case DELAYED_WORK_IDLE: @@ -1514,6 +1520,9 @@ flush_delayed_work(struct delayed_work * * but doesn't hurt. */ flush_workqueue_locked(wq); + waited = true; } mutex_exit(&wq->wq_lock); + + return waited; }