mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>,
	LKML <linux-kernel@vger.kernel.org>,
	linux-cifs@vger.kernel.org, Steve French <sfrench@samba.org>,
	Clark Williams <williams@redhat.com>,
	"Luis Claudio R. Goncalves" <lclaudio@uudg.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	uobergfe@redhat.com
Subject: Re: [RFC PATCH] cifs: Fix possible deadlock with cifs and work queues
Date: Wed, 19 Mar 2014 16:28:39 -0400	[thread overview]
Message-ID: <20140319202839.GA3656@mtj.dyndns.org> (raw)
In-Reply-To: <20140319193407.GA11257@laptop.programming.kicks-ass.net>

Hello, Steven, Peter.

On Wed, Mar 19, 2014 at 08:34:07PM +0100, Peter Zijlstra wrote:
> The way I understand workqueues is that we cannot guarantee concurrency
> like this. It tries, but there's no guarantee.

So, the guarantee is that if a workqueue has WQ_MEM_RECLAIM, it'll
always have at least one worker thread working on it, so workqueues
which may be depended upon during memory reclaim should have the flag
set and must not require more than single level of concurrency to make
forward progress.  Workqueues w/o memory reclaim set depend on the
fact that eventually memory will be reclaimed and enough number of
workers necessary to make forward progress will be made available.

> WQ_MAX_ACTIVE seems to be a hard upper limit of concurrent workers. So
> given 511 other blocked works, the described problem will always happen.

That actually is per-workqueue limit and workqueue core will try to
create as many workers as possible to satisfy the demanded
concurrency.  ie. having two workqueues with the same max_active means
that the total number of workers may reach 2 * max_active; however,
this is no guarantee.  If the system is under memory pressure and the
workqueues don't have MEM_RECLAIM set, they may not get any
concurrency until more memory is made available.

> Creating another workqueue doesn't actually create more threads.

It looks like the issue Steven is describing is caused by having a
dependency chain longer than 1 through rwsem in a MEM_RECLAIM
workqueue.  Moving the write work items to a separate workqueue breaks
the r-w-r chain and ensures that forward progress can be made with
single level of concurrency on both workqueues, so, yeah, it looks
like the correct fix to me.  It it scarily subtle tho and quite likely
to present in other code paths too. :(

Thanks.

-- 
tejun

  parent reply	other threads:[~2014-03-19 20:28 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-19 19:12 Steven Rostedt
2014-03-19 19:34 ` Peter Zijlstra
2014-03-19 19:43   ` Steven Rostedt
2014-03-19 19:46     ` Steven Rostedt
2014-03-19 19:47     ` Peter Zijlstra
2014-03-19 20:28   ` Tejun Heo [this message]
2014-03-20 19:28 ` Jeffrey Layton
2014-03-20 20:57   ` Steven Rostedt
2014-03-20 21:02     ` Jeff Layton
2014-03-21  2:23       ` Steven Rostedt
2014-03-21  8:32         ` Pavel Shilovsky
2014-03-21 11:59           ` Jeff Layton
2014-03-21 12:17           ` Steven Rostedt
2014-03-21 12:41             ` Jeff Layton
2014-03-21 12:54               ` Steven Rostedt
2014-03-21 15:07               ` [PATCH v2] " Steven Rostedt
2014-03-23  5:57                 ` Shirish Pargaonkar
2014-03-20 23:53 ` [RFC PATCH] " Jeff Layton
2014-03-21  2:19   ` Steven Rostedt

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=20140319202839.GA3656@mtj.dyndns.org \
    --to=tj@kernel.org \
    --cc=lclaudio@uudg.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sfrench@samba.org \
    --cc=tglx@linutronix.de \
    --cc=uobergfe@redhat.com \
    --cc=williams@redhat.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

all inboxes | Powered by JetHome®