mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Nick Piggin <npiggin@suse.de>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [patch] mm: fix locking, inotify_read's ev_mutex vs do_page_fault's mmap_sem...
Date: Sun, 14 Sep 2008 10:06:31 +0200	[thread overview]
Message-ID: <20080914080631.GA10720@elte.hu> (raw)
In-Reply-To: <20080914004442.4f8e851f.akpm@linux-foundation.org>


* Andrew Morton <akpm@linux-foundation.org> wrote:

> > [ 6460.634452] 
> > [ 6460.634465] =======================================================
> > [ 6460.634494] [ INFO: possible circular locking dependency detected ]
> > [ 6460.634517] 2.6.27-rc6-tip-00290-g8e229c3-dirty #1
> > [ 6460.634535] -------------------------------------------------------
> > [ 6460.634555] gdm-simple-gree/4778 is trying to acquire lock:
> > [ 6460.634574]  (&mm->mmap_sem){----}, at: [<c018fe33>] might_fault+0x36/0x73
> > [ 6460.634639] 
> > [ 6460.634645] but task is already holding lock:
> > [ 6460.634662]  (&dev->ev_mutex){--..}, at: [<c01c7a76>] inotify_read+0xd8/0x16e
> > [ 6460.634715] 
> > [ 6460.634721] which lock already depends on the new lock.
> 
> Yes, there's a thread in my intray called "inotify_read's ev_mutex vs 
> do_page_fault's mmap_sem...".  It's a bit flakey-looking, but there's 
> a patch in there.

ah, thx. I picked up the patch into tip/out-of-tree. (see below for a 
tided up changelog) Please queue it up as v2.6.27 material. (i'll report 
it if anything breaks due to the patch)

	Ingo

--------------->
>From 1eb0a42e4eb3283521ee1de99adbf567874b622f Mon Sep 17 00:00:00 2001
From: Nick Piggin <nickpiggin@yahoo.com.au>
Date: Thu, 11 Sep 2008 06:12:51 +1000
Subject: [PATCH] mm: fix locking, inotify_read's ev_mutex vs do_page_fault's mmap_sem...

Daniel J Blueman wrote:
> I observed this locking violation [1] while gnome-panel was loading;
> this was previously reported at
> http://uwsg.iu.edu/hypermail/linux/kernel/0806.3/2881.html .

Fix inotify lock order reversal with mmap_sem due to holding locks over
copy_to_user.

Reported-by: "Daniel J Blueman" <daniel.blueman@gmail.com>
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 fs/inotify_user.c            |   27 ++++++++++++++++++++-------
 include/asm-x86/uaccess_64.h |    1 +
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/fs/inotify_user.c b/fs/inotify_user.c
index 6024942..d85c7d9 100644
--- a/fs/inotify_user.c
+++ b/fs/inotify_user.c
@@ -323,7 +323,7 @@ out:
 }
 
 /*
- * remove_kevent - cleans up and ultimately frees the given kevent
+ * remove_kevent - cleans up the given kevent
  *
  * Caller must hold dev->ev_mutex.
  */
@@ -334,7 +334,13 @@ static void remove_kevent(struct inotify_device *dev,
 
 	dev->event_count--;
 	dev->queue_size -= sizeof(struct inotify_event) + kevent->event.len;
+}
 
+/*
+ * free_kevent - frees the given kevent.
+ */
+static void free_kevent(struct inotify_kernel_event *kevent)
+{
 	kfree(kevent->name);
 	kmem_cache_free(event_cachep, kevent);
 }
@@ -350,6 +356,7 @@ static void inotify_dev_event_dequeue(struct inotify_device *dev)
 		struct inotify_kernel_event *kevent;
 		kevent = inotify_dev_get_event(dev);
 		remove_kevent(dev, kevent);
+		free_kevent(kevent);
 	}
 }
 
@@ -433,17 +440,15 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
 	dev = file->private_data;
 
 	while (1) {
-		int events;
 
 		prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE);
 
 		mutex_lock(&dev->ev_mutex);
-		events = !list_empty(&dev->events);
-		mutex_unlock(&dev->ev_mutex);
-		if (events) {
+		if (!list_empty(&dev->events)) {
 			ret = 0;
 			break;
 		}
+		mutex_unlock(&dev->ev_mutex);
 
 		if (file->f_flags & O_NONBLOCK) {
 			ret = -EAGAIN;
@@ -462,7 +467,6 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
 	if (ret)
 		return ret;
 
-	mutex_lock(&dev->ev_mutex);
 	while (1) {
 		struct inotify_kernel_event *kevent;
 
@@ -481,6 +485,13 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
 			}
 			break;
 		}
+		remove_kevent(dev, kevent);
+
+		/*
+		 * Must perform the copy_to_user outside the mutex in order
+		 * to avoid a lock order reversal with mmap_sem.
+		 */
+		mutex_unlock(&dev->ev_mutex);
 
 		if (copy_to_user(buf, &kevent->event, event_size)) {
 			ret = -EFAULT;
@@ -498,7 +509,9 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
 			count -= kevent->event.len;
 		}
 
-		remove_kevent(dev, kevent);
+		free_kevent(kevent);
+
+		mutex_lock(&dev->ev_mutex);
 	}
 	mutex_unlock(&dev->ev_mutex);
 
diff --git a/include/asm-x86/uaccess_64.h b/include/asm-x86/uaccess_64.h
index 515d4dc..45806d6 100644
--- a/include/asm-x86/uaccess_64.h
+++ b/include/asm-x86/uaccess_64.h
@@ -7,6 +7,7 @@
 #include <linux/compiler.h>
 #include <linux/errno.h>
 #include <linux/prefetch.h>
+#include <linux/lockdep.h>
 #include <asm/page.h>
 
 /*

  reply	other threads:[~2008-09-14  8:07 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-10 11:37 [patch] x86: some lock annotations for user copy paths Nick Piggin
2008-09-10 11:41 ` Peter Zijlstra
2008-09-10 11:47   ` Ingo Molnar
2008-09-10 11:50     ` Ingo Molnar
2008-09-10 12:12     ` Ingo Molnar
2008-09-10 12:32       ` Ingo Molnar
2008-09-10 15:12         ` Nick Piggin
2008-09-10 14:48       ` Nick Piggin
2008-09-10 15:01         ` Peter Zijlstra
2008-09-10 15:17           ` Nick Piggin
2008-09-10 15:26           ` Nick Piggin
2008-09-11  8:27             ` Ingo Molnar
2008-09-11 10:43               ` Nick Piggin
2008-09-12  9:24                 ` [PATCH] sysfs: fix deadlock Ingo Molnar
2008-09-14 22:02                   ` Nick Piggin
2008-09-15  9:15                     ` Peter Zijlstra
2008-09-14  7:39               ` [lockdep] possible circular locking, between &mm->mmap_sem and &dev->ev_mutex Ingo Molnar
2008-09-14  7:44                 ` Andrew Morton
2008-09-14  8:06                   ` Ingo Molnar [this message]
2008-09-14 22:12                     ` [patch] mm: tiny-shmem fix lor, mmap_sem vs i_mutex Nick Piggin
2008-09-17 20:14                       ` Andrew Morton
2008-09-17 20:46                         ` Matt Mackall
2008-09-18 11:12                         ` Ingo Molnar
2008-09-18 19:29                           ` Jeremy Fitzhardinge
2008-09-18 21:11                             ` Matt Mackall
2008-09-20  2:18                               ` Dave Hansen
2008-09-20 16:12                                 ` Hugh Dickins
2008-09-22 15:14                                   ` Dave Hansen
2008-09-22 14:54                                 ` David Howells
2008-09-23  5:32                                   ` Nick Piggin
2008-09-24 19:29                                     ` Hugh Dickins
2008-09-24 19:47                                       ` Andrew Morton
2008-09-24 18:18                                   ` David Howells
2008-09-24 18:29                                     ` Matt Mackall
2008-09-24 19:41                                       ` Hugh Dickins
2008-09-24 19:59                                       ` David Howells
2008-09-24 23:43                                         ` Hugh Dickins
2008-09-24 18:56                                     ` David Howells
2008-09-24 19:11                                       ` Matt Mackall
2008-09-24 19:26                                       ` David Howells
2008-09-19  8:40                             ` Ingo Molnar
2008-09-14 21:36                   ` [lockdep] possible circular locking, between &mm->mmap_sem and &dev->ev_mutex Nick Piggin
2008-09-10 14:30     ` [patch] x86: some lock annotations for user copy paths Nick Piggin
2008-09-10 14:31 ` Andi Kleen

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=20080914080631.GA10720@elte.hu \
    --to=mingo@elte.hu \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=npiggin@suse.de \
    /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®