From: Tejun Heo <tj@kernel.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-kernel@vger.kernel.org,
Austin Schuh <austin@peloton-tech.com>, xfs <xfs@oss.sgi.com>
Subject: Re: On-stack work item completion race? (was Re: XFS crash?)
Date: Mon, 23 Jun 2014 23:25:21 -0400 [thread overview]
Message-ID: <20140624032521.GA12164@htj.dyndns.org> (raw)
In-Reply-To: <20140624030240.GB9508@dastard>
Hello,
On Tue, Jun 24, 2014 at 01:02:40PM +1000, Dave Chinner wrote:
> start_flush_work() is effectively a special queue_work()
> implementation, so if if it's not safe to call complete() from the
> workqueue as the above patch implies then this code has the same
> problem.
>
> Tejun - is this "do it yourself completion" a known issue w.r.t.
> workqueues? I can't find any documentation that says "don't do
> that" so...?
It's more complex than using flush_work() but there's nothing
fundamentally wrong with it. A work item is completely unlinked
before its execution starts. It's safe to free the work item once its
work function started, whether through kfree() or returning.
One difference between flush_work() and manual completion would be
that if the work item gets requeued, flush_work() would wait for the
queued one to finish but given the work item is one-shot this doesn't
make any difference.
I can see no reason why manual completion would behave differently
from flush_work() in this case.
> As I understand it, what then happens is that the workqueue code
> grabs another kworker thread and runs the next work item in it's
> queue. IOWs, work items can block, but doing that does not prevent
> execution of other work items queued on other work queues or even on
> the same work queue. Tejun, did I get that correct?
Yes, as long as the workqueue is under its @max_active limit and has
access to an existing kworker or can create a new one, it'll start
executing the next work item immediately; however, the guaranteed
level of concurrency is 1 even for WQ_RECLAIM workqueues. IOW, the
work items queued on a workqueue must be able to make forward progress
with single work item if the work items are being depended upon for
memory reclaim.
> Hence the work on the xfs-data queue will block until another
> kworker processes the item on the xfs-alloc-wq which means progress
> is made and the inode gets unlocked. Then the kworker for the work
> on the xfs-data queue will get the lock, complete it's work and
> everything has resolved itself.
As long as a WQ_RECLAIM workqueue dosen't depend upon itself,
forward-progress is guaranteed.
Thanks.
--
tejun
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2014-06-24 3:25 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-05 23:08 XFS crash? Austin Schuh
2014-03-05 23:35 ` Dave Chinner
2014-03-06 0:53 ` Austin Schuh
2014-05-13 1:29 ` Austin Schuh
2014-05-13 3:10 ` Austin Schuh
2014-05-13 3:33 ` Austin Schuh
2014-05-13 3:46 ` Dave Chinner
2014-05-13 4:03 ` Austin Schuh
2014-05-13 6:39 ` Dave Chinner
2014-05-13 7:02 ` Austin Schuh
2014-05-13 9:03 ` Dave Chinner
2014-05-13 17:11 ` Austin Schuh
2014-06-23 20:05 ` Austin Schuh
2014-06-24 3:02 ` On-stack work item completion race? (was Re: XFS crash?) Dave Chinner
2014-06-24 3:25 ` Tejun Heo [this message]
2014-06-25 3:05 ` Austin Schuh
2014-06-25 14:00 ` Tejun Heo
2014-06-25 17:04 ` Austin Schuh
2014-06-25 3:16 ` Austin Schuh
2014-06-25 5:56 ` Dave Chinner
2014-06-25 14:18 ` Tejun Heo
2014-06-25 22:08 ` Dave Chinner
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=20140624032521.GA12164@htj.dyndns.org \
--to=tj@kernel.org \
--cc=austin@peloton-tech.com \
--cc=david@fromorbit.com \
--cc=linux-kernel@vger.kernel.org \
--cc=xfs@oss.sgi.com \
/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