All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@osdl.org>
To: Joe Korty <joe.korty@ccur.com>
Cc: linux-kernel@vger.kernel.org, riel@redhat.com, andrea@suse.de
Subject: Re: mlockall and mmap of IO devices don't mix
Date: Fri, 3 Oct 2003 15:23:49 -0700	[thread overview]
Message-ID: <20031003152349.7194b73d.akpm@osdl.org> (raw)
In-Reply-To: <20031003214411.GA25802@rudolph.ccur.com>

Joe Korty <joe.korty@ccur.com> wrote:
>
> 2.6.0-test6: the use of mlockall(2) in a process that has mmap(2)ed
> the registers of an IO device will hang that process uninterruptibly.
> The task runs in an infinite loop in get_user_pages(), invoking
> follow_page() forever.

whoops.

I think the right fix is in get_user_pages(): if the region is VM_IO then
don't call follow_page() at all.

Something like this?

 25-akpm/mm/memory.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff -puN mm/memory.c~get_user_pages-handle-VM_IO mm/memory.c
--- 25/mm/memory.c~get_user_pages-handle-VM_IO	Fri Oct  3 15:22:18 2003
+++ 25-akpm/mm/memory.c	Fri Oct  3 15:22:18 2003
@@ -683,6 +683,7 @@ int get_user_pages(struct task_struct *t
 		struct page **pages, struct vm_area_struct **vmas)
 {
 	int i;
+	int vm_io;
 	unsigned int flags;
 
 	/* 
@@ -739,8 +740,8 @@ int get_user_pages(struct task_struct *t
 		}
 #endif
 
-		if (!vma || (pages && (vma->vm_flags & VM_IO))
-				|| !(flags & vma->vm_flags))
+		vm_io = vma->vm_flags & VM_IO;
+		if (!vma || (pages && vm_io) || !(flags & vma->vm_flags))
 			return i ? : -EFAULT;
 
 		if (is_vm_hugetlb_page(vma)) {
@@ -750,8 +751,14 @@ int get_user_pages(struct task_struct *t
 		}
 		spin_lock(&mm->page_table_lock);
 		do {
-			struct page *map;
-			while (!(map = follow_page(mm, start, write))) {
+			struct page *map = NULL;
+
+			/*
+			 * We don't follow pagetables for VM_IO regions - they
+			 * have no pageframes.  And the caller passed NULL
+			 * for `pages' anyway.
+			 */
+			while (!vm_io && !(map = follow_page(mm,start,write))) {
 				spin_unlock(&mm->page_table_lock);
 				switch (handle_mm_fault(mm,vma,start,write)) {
 				case VM_FAULT_MINOR:

_


  reply	other threads:[~2003-10-03 22:23 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-03 21:44 mlockall and mmap of IO devices don't mix Joe Korty
2003-10-03 22:23 ` Andrew Morton [this message]
2003-10-03 22:55   ` Joe Korty
2003-10-03 23:06     ` Andrew Morton
2003-10-03 23:28       ` Joe Korty
2003-10-03 23:15     ` Andrew Morton
2003-10-03 23:54       ` Joe Korty
2003-10-04  0:27         ` Andrew Morton
2003-10-04  5:47           ` David S. Miller
2003-10-04  9:29             ` Ingo Oeser
2004-05-21 11:34 ` Mark Hounschell
2004-05-22  2:13   ` Andrew Morton
2004-05-22 10:47     ` Mark Hounschell
2004-05-23 12:58       ` Mark Hounschell
2004-05-25 14:27     ` Joe Korty
2004-05-25 19:47       ` Andrew Morton
2004-05-25 21:31         ` Joe Korty
2004-07-16 21:01         ` Mark Hounschell
     [not found] <CFYv.787.23@gated-at.bofh.it>
2003-10-04  7:02 ` Andi Kleen
2003-10-04  7:42   ` Andrew Morton
2003-10-04  8:29     ` Andi Kleen
2003-10-04  8:47   ` Ingo Oeser
2003-10-04  9:17     ` Andi Kleen
2003-10-04  9:22       ` Russell King
2003-10-04 10:02         ` Ingo Oeser
2003-10-04 10:13           ` Russell King
2003-10-04 14:19             ` Ingo Oeser
2003-10-04 14:19               ` Ingo Oeser
2003-10-04 14:32           ` Martin J. Bligh

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=20031003152349.7194b73d.akpm@osdl.org \
    --to=akpm@osdl.org \
    --cc=andrea@suse.de \
    --cc=joe.korty@ccur.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=riel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.