From: Arjan van de Ven <arjan@linux.intel.com>
To: Reuben Farrelly <reuben-lkml@reub.net>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@elte.hu>,
John McCutchan <john@johnmccutchan.com>,
Andrew Morton <akpm@osdl.org>,
rml@novell.com, viro@zeniv.linux.org.uk
Subject: [patch] inotify: fix deadlock found by lockdep
Date: Mon, 24 Jul 2006 19:21:10 +0200 [thread overview]
Message-ID: <1153761671.3043.89.camel@laptopd505.fenrus.org> (raw)
In-Reply-To: <44C2C90B.6090108@reub.net>
Subject: [patch] inotify: fix deadlock found by lockdep
From: Arjan van de Ven <arjan@linux.intel.com>
This is a real deadlock, a nice complex one:
(warning: long explanation follows so that Andrew can have a complete
patch description)
it's an ABCDA deadlock:
A iprune_mutex
B inode->inotify_mutex
C ih->mutex
D dev->ev_mutex
The AB relationship comes straight from invalidate_inodes()
int invalidate_inodes(struct super_block * sb)
{
int busy;
LIST_HEAD(throw_away);
mutex_lock(&iprune_mutex);
spin_lock(&inode_lock);
inotify_unmount_inodes(&sb->s_inodes);
where inotify_umount_inodes() takes the
mutex_lock(&inode->inotify_mutex);
The BC relationship comes directly from inotify_find_update_watch():
s32 inotify_find_update_watch(struct inotify_handle *ih, struct inode *inode,
u32 mask)
{
...
mutex_lock(&inode->inotify_mutex);
mutex_lock(&ih->mutex);
The CD relationship comes from inotify_rm_wd:
inotify_rm_wd does
mutex_lock(&inode->inotify_mutex);
mutex_lock(&ih->mutex)
and then calls inotify_remove_watch_locked() which calls
notify_dev_queue_event() which does
mutex_lock(&dev->ev_mutex);
(this strictly is a BCD relationship)
The DA relationship comes from the most interesting part:
[<ffffffff8022d9f2>] shrink_icache_memory+0x42/0x270
[<ffffffff80240dc4>] shrink_slab+0x11d/0x1c9
[<ffffffff802b5104>] try_to_free_pages+0x187/0x244
[<ffffffff8020efed>] __alloc_pages+0x1cd/0x2e0
[<ffffffff8025e1f8>] cache_alloc_refill+0x3f8/0x821
[<ffffffff8020a5e5>] kmem_cache_alloc+0x85/0xcb
[<ffffffff802db027>] kernel_event+0x2e/0x122
[<ffffffff8021d61c>] inotify_dev_queue_event+0xcc/0x140
inotify_dev_queue_event schedules a kernel_event which does a
kmem_cache_alloc( , GFP_KERNEL) which may try to shrink slabs, including
the inode cache .. which then takes iprune_mutex.
And voila, there is an AB, a BC, a CD relationship (even a direct BCD),
and also now a DA relationship -> a circular type AB-BA deadlock but
involving 4 locks.
The solution is simple: kernel_event() is NOT allowed to use GFP_KERNEL,
but must use GFP_NOFS to not cause recursion into the VFS.
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Index: linux-2.6.18-rc1/fs/inotify_user.c
===================================================================
--- linux-2.6.18-rc1.orig/fs/inotify_user.c
+++ linux-2.6.18-rc1/fs/inotify_user.c
@@ -187,7 +187,7 @@ static struct inotify_kernel_event * ker
{
struct inotify_kernel_event *kevent;
- kevent = kmem_cache_alloc(event_cachep, GFP_KERNEL);
+ kevent = kmem_cache_alloc(event_cachep, GFP_NOFS);
if (unlikely(!kevent))
return NULL;
next prev parent reply other threads:[~2006-07-24 17:22 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-14 5:48 2.6.18-rc1-mm2 Andrew Morton
2006-07-14 6:55 ` 2.6.18-rc1-mm2 Reuben Farrelly
2006-07-14 7:05 ` 2.6.18-rc1-mm2 Andrew Morton
2006-07-15 0:04 ` 2.6.18-rc1-mm2 Herbert Xu
[not found] ` <20060714172010.fcc50c0a.akpm@osdl.org>
[not found] ` <20060715002623.GE9334@gondor.apana.org.au>
[not found] ` <20060714173517.cdd58097.akpm@osdl.org>
2006-07-15 1:06 ` 2.6.18-rc1-mm2 Herbert Xu
2006-07-15 5:40 ` 2.6.18-rc1-mm2 David Miller
2006-07-15 6:04 ` 2.6.18-rc1-mm2 Dave Jones
2006-07-16 1:19 ` 2.6.18-rc1-mm2 David Miller
2006-07-15 10:32 ` 2.6.18-rc1-mm2 Herbert Xu
2006-07-15 10:34 ` 2.6.18-rc1-mm2 Herbert Xu
2006-07-14 7:33 ` 2.6.18-rc1-mm2 David Miller
2006-07-14 7:00 ` 2.6.18-rc1-mm2 Reuben Farrelly
2006-07-14 8:39 ` [patch -mm] s390: kprobes compile fix Heiko Carstens
2006-07-14 11:30 ` 2.6.18-rc1-mm2 Reuben Farrelly
2006-07-14 15:00 ` 2.6.18-rc1-mm2 Andrew Morton
2006-07-14 11:36 ` 2.6.18-rc1-mm2 Rafael J. Wysocki
2006-07-14 18:00 ` 2.6.18-rc1-mm2 Andrew Morton
2006-07-14 18:36 ` 2.6.18-rc1-mm2 Michal Piotrowski
2006-07-14 20:27 ` 2.6.18-rc1-mm2 Rafael J. Wysocki
2006-07-14 12:23 ` 2.6.18-rc1-mm2 Michal Piotrowski
2006-07-14 12:36 ` 2.6.18-rc1-mm2 Lexington Luthor
2006-07-14 16:30 ` [PATCH] fixed add_bind_files() definition Yoichi Yuasa
2006-07-14 15:48 ` 2.6.18-rc1-mm2 Dave Hansen
2006-07-18 21:49 ` 2.6.18-rc1-mm2 Haavard Skinnemoen
2006-07-14 16:30 ` 2.6.18-rc1-mm2 (bttv: NULL pointer derefernce) Dominik Karall
2006-08-02 16:00 ` 2.6.18-rc1-mm2 and 2.6.18-rc3 " Dominik Karall
2006-08-02 16:49 ` Andrew Morton
2006-08-02 16:57 ` Linus Torvalds
2006-08-02 18:02 ` Mauro Carvalho Chehab
2006-08-02 17:08 ` Bret Towe
2006-07-14 17:57 ` 2.6.18-rc1-mm2 Cédric Augonnet
2006-07-14 18:18 ` 2.6.18-rc1-mm2 Andrew Morton
2006-07-14 18:50 ` 2.6.18-rc1-mm2 Cédric Augonnet
2006-07-14 18:48 ` 2.6.18-rc1-mm2: drivers/char/*synclink* compile errors Adrian Bunk
2006-07-14 21:31 ` David Miller
2006-07-14 19:08 ` 2.6.18-rc1-mm2: drivers/scsi/NCR53C9x.c compile error Adrian Bunk
2006-07-20 10:17 ` 2.6.18-rc1-mm2: drivers/fc4/fc.c " Adrian Bunk
2006-07-15 0:35 ` [-mm patch] remove net/core/skbuff.c:skb_queue_lock_key Adrian Bunk
2006-07-15 5:35 ` Arjan van de Ven
2006-07-15 0:35 ` [-mm patch] drivers/char/pc8736x_gpio.c: unexport a static struct Adrian Bunk
2006-07-15 14:50 ` Chris Boot
2006-07-15 0:35 ` [RFC: -mm patch] drivers/char/scx200_gpio.c: make code static Adrian Bunk
2006-07-15 14:49 ` Chris Boot
2006-07-15 15:37 ` Adrian Bunk
2006-07-15 17:10 ` Chris Boot
2006-07-15 23:49 ` Jim Cromie
2006-07-15 0:35 ` [-mm patch] drivers/crypto/padlock-sha.c: make 2 functions static Adrian Bunk
2006-07-15 0:39 ` Herbert Xu
2006-07-15 0:35 ` [RFC: -mm patch] drivers/usb/core/driver.c: " Adrian Bunk
2006-07-15 12:50 ` [linux-usb-devel] " Alan Stern
2006-07-15 0:36 ` [RFC: -mm patch] fs/dlm/lock.c: unexport dlm_lvb_operations Adrian Bunk
2006-07-19 23:27 ` Steven Whitehouse
2006-07-15 0:37 ` [-mm patch] drivers/char/pc8736x_gpio.c: remove unused static functions Adrian Bunk
2006-07-18 16:07 ` Jim Cromie
2006-07-30 16:49 ` Jim Cromie
2006-07-22 9:49 ` [patch] mdacon: fix __init section warnings Frederik Deweerdt
2006-07-23 0:55 ` 2.6.18-rc1-mm2 Reuben Farrelly
2006-07-24 17:21 ` Arjan van de Ven [this message]
2006-07-24 19:14 ` [patch] inotify: fix deadlock found by lockdep Ingo Molnar
2006-07-24 22:08 ` Robert Love
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=1153761671.3043.89.camel@laptopd505.fenrus.org \
--to=arjan@linux.intel.com \
--cc=akpm@osdl.org \
--cc=john@johnmccutchan.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=reuben-lkml@reub.net \
--cc=rml@novell.com \
--cc=viro@zeniv.linux.org.uk \
/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®