All of lore.kernel.org
 help / color / mirror / Atom feed
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;
 
 /**

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.