From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Arjan van de Ven <arjan@infradead.org>
Cc: linux-scsi <linux-scsi@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH] async: make sure independent async domains can't accidentally entangle.
Date: Sun, 24 May 2009 09:29:31 -0500 [thread overview]
Message-ID: <1243175371.2889.17.camel@localhost.localdomain> (raw)
The problem occurs when async_synchronize_full_domain() is called when
the async_pending list is not empty. This will cause lowest_running()
to return the cookie of the first entry on the async_pending list, which
might be nothing at all to do with the domain being asked for and thus
cause the domain synchronization to wait for an unrelated domain. This
can cause a deadlock if domain synchronization is used from one domain
to wait for another.
Fix by running over the async_pending list to see if any pending items
actually belong to our domain (and return their cookies if they do).
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
---
diff --git a/kernel/async.c b/kernel/async.c
index 968ef94..9b01c61 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -92,19 +92,24 @@ extern int initcall_debug;
static async_cookie_t __lowest_in_progress(struct list_head *running)
{
struct async_entry *entry;
+ unsigned long flags;
+ async_cookie_t ret = next_cookie; /* begin with "infinity" value */
+
if (!list_empty(running)) {
entry = list_first_entry(running,
struct async_entry, list);
- return entry->cookie;
+ ret = entry->cookie;
} else if (!list_empty(&async_pending)) {
- entry = list_first_entry(&async_pending,
- struct async_entry, list);
- return entry->cookie;
- } else {
- /* nothing in progress... next_cookie is "infinity" */
- return next_cookie;
+ spin_lock_irqsave(&async_lock, flags);
+ list_for_each_entry(entry, &async_pending, list)
+ if (entry->running == running) {
+ ret = entry->cookie;
+ break;
+ }
+ spin_unlock_irqrestore(&async_lock, flags);
}
+ return ret;
}
static async_cookie_t lowest_in_progress(struct list_head *running)
next reply other threads:[~2009-05-24 14:29 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-24 14:29 James Bottomley [this message]
2009-05-24 18:50 ` [PATCH] async: make sure independent async domains can't accidentally entangle James Bottomley
2009-05-24 19:40 ` Arjan van de Ven
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=1243175371.2889.17.camel@localhost.localdomain \
--to=james.bottomley@hansenpartnership.com \
--cc=arjan@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
/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