From: Jarek Poplawski <jarkao2@o2.pl>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Maciej W\. Rozycki" <macro@linux-mips.org>,
Andy Fleming <afleming@freescale.com>,
Andrew Morton <akpm@linux-foundation.org>,
Jeff Garzik <jgarzik@pobox.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH] flush_work_sync vs. flush_scheduled_work Re: [PATCH] PHYLIB: IRQ event workqueue handling fixes
Date: Thu, 18 Oct 2007 09:05:31 +0200 [thread overview]
Message-ID: <20071018070531.GA2065@ff.dom.local> (raw)
In-Reply-To: <20071018063157.GA1694@ff.dom.local>
After reading this and earlier threads about phylib's way of using
workqueue I think such a lighter and safer wrt. locking alternative
for flush_scheduled_work should be useful, but maybe it's only my
imagination.
So, let's ask Oleg Nesterov, whose solutions are here only
copy-cut-pasted & possibly abused by myslef.
--------->
Subject: flush_work_sync as an alternative for flush_scheduled_work
Similar to cancel_work_sync() but will only busy wait & block
(without cancel).
Signed-off-by: Jarek Poplawski <jarkao2@o2.pl>
---
include/linux/workqueue.h | 1 +
kernel/workqueue.c | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+)
diff -Nurp 2.6.23-mm1-/include/linux/workqueue.h 2.6.23-mm1/include/linux/workqueue.h
--- 2.6.23-mm1-/include/linux/workqueue.h 2007-10-12 23:45:24.000000000 +0200
+++ 2.6.23-mm1/include/linux/workqueue.h 2007-10-17 20:55:26.000000000 +0200
@@ -192,6 +192,7 @@ extern void init_workqueues(void);
int execute_in_process_context(work_func_t fn, struct execute_work *);
extern int cancel_work_sync(struct work_struct *work);
+extern void flush_work_sync(struct work_struct *work);
/*
* Kill off a pending schedule_delayed_work(). Note that the work callback
diff -Nurp 2.6.23-mm1-/kernel/workqueue.c 2.6.23-mm1/kernel/workqueue.c
--- 2.6.23-mm1-/kernel/workqueue.c 2007-10-12 23:45:25.000000000 +0200
+++ 2.6.23-mm1/kernel/workqueue.c 2007-10-17 20:54:03.000000000 +0200
@@ -539,6 +539,30 @@ int cancel_delayed_work_sync(struct dela
}
EXPORT_SYMBOL(cancel_delayed_work_sync);
+/**
+ * flush_work_sync - block until a work_struct's callback has terminated
+ * @work: the work which is to be flushed
+ *
+ * Similar to cancel_work_sync() but will only busy wait (without cancel)
+ * if the work is queued. If the work's callback appears to be running,
+ * flush_work_sync() will block until it has completed (but doesn't block
+ * while other callbacks are running, like flush_scheduled_work() does).
+ *
+ * It is not allowed to use this function if the work re-queues itself.
+ */
+void flush_work_sync(struct work_struct *work)
+{
+ int ret;
+
+ do {
+ ret = work_pending(work);
+ wait_on_work(work);
+ if (ret)
+ cpu_relax();
+ } while (ret);
+}
+EXPORT_SYMBOL(flush_work_sync);
+
static struct workqueue_struct *keventd_wq __read_mostly;
/**
next prev parent reply other threads:[~2007-10-18 7:02 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-19 14:38 [PATCH] PHYLIB: IRQ event workqueue handling fixes Maciej W. Rozycki
2007-09-20 23:53 ` Andrew Morton
2007-09-21 12:51 ` Maciej W. Rozycki
2007-09-21 18:42 ` Andrew Morton
2007-10-15 12:53 ` Jarek Poplawski
2007-10-15 17:03 ` Maciej W. Rozycki
2007-10-16 6:21 ` Jarek Poplawski
2007-10-16 17:19 ` Maciej W. Rozycki
2007-10-17 8:58 ` Jarek Poplawski
2007-10-17 9:08 ` Benjamin Herrenschmidt
2007-10-17 9:09 ` Jarek Poplawski
2007-10-18 6:31 ` Jarek Poplawski
2007-10-18 7:05 ` Jarek Poplawski [this message]
2007-10-18 15:48 ` [PATCH] flush_work_sync vs. flush_scheduled_work " Oleg Nesterov
2007-10-18 15:58 ` Maciej W. Rozycki
2007-10-19 7:50 ` Jarek Poplawski
2007-10-19 8:01 ` Jarek Poplawski
2007-10-22 6:11 ` Jarek Poplawski
2007-10-22 18:02 ` Oleg Nesterov
2007-10-23 6:59 ` Jarek Poplawski
2007-10-23 9:21 ` Jarek Poplawski
2007-10-19 8:00 ` Johannes Berg
2007-10-18 11:37 ` Maciej W. Rozycki
2007-10-18 11:30 ` Maciej W. Rozycki
2007-10-18 14:37 ` Jarek Poplawski
2007-10-18 15:31 ` Maciej W. Rozycki
2007-10-19 8:17 ` Jarek Poplawski
2007-10-19 12:57 ` Maciej W. Rozycki
2007-10-19 11:38 ` Maciej W. Rozycki
2007-10-19 14:39 ` Jarek Poplawski
2007-10-19 17:58 ` Maciej W. Rozycki
2007-10-19 21:46 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071018070531.GA2065@ff.dom.local \
--to=jarkao2@o2.pl \
--cc=afleming@freescale.com \
--cc=akpm@linux-foundation.org \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=macro@linux-mips.org \
--cc=netdev@vger.kernel.org \
--cc=oleg@tv-sign.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).