public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linux-kernel@vger.kernel.org, akpm@osdl.org, torvalds@osdl.org
Subject: Re: [BUG] get_unmapped_area() change -> non booting machine
Date: Thu, 12 Feb 2004 00:23:38 +0100	[thread overview]
Message-ID: <20040212002338.2a82302d.ak@suse.de> (raw)
In-Reply-To: <1076384799.893.5.camel@gaston>

On Tue, 10 Feb 2004 14:47:09 +1100
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
> Just reverting the patch fixes it. Though, the patch do make sense in
> some cases, paulus suggested to modify the code so that for a non
> MAP_FIXED map, it still search from the passed-in address, but avoids
> the spare between the current mm->brk and TASK_UNMAPPED_BASE, thus the
> algorithm would still work for things outside of these areas.
> 
> Commment ?

Can you test this patch please?  It essentially implements Paulus' suggestion.

It also fixes another issue (don't use free_area_cache when the user gave an
address hint).

--- linux-2.6.3rc1-amd64/mm/mmap.c-o	2004-01-28 17:12:37.000000000 +0100
+++ linux-2.6.3rc1-amd64/mm/mmap.c	2004-02-12 00:16:35.000000000 +0100
@@ -727,18 +727,20 @@
  */
 #ifndef HAVE_ARCH_UNMAPPED_AREA
 static inline unsigned long
-arch_get_unmapped_area(struct file *filp, unsigned long addr,
+arch_get_unmapped_area(struct file *filp, unsigned long uaddr,
 		unsigned long len, unsigned long pgoff, unsigned long flags)
 {
 	struct mm_struct *mm = current->mm;
 	struct vm_area_struct *vma;
 	unsigned long start_addr;
+	unsigned long unmapped_base;
+	unsigned long addr;
 
 	if (len > TASK_SIZE)
 		return -ENOMEM;
 
-	if (addr) {
-		addr = PAGE_ALIGN(addr);
+	if (uaddr) {
+		addr = PAGE_ALIGN(uaddr);
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
 		    (!vma || addr + len <= vma->vm_start))
@@ -747,28 +749,40 @@
 		addr = mm->free_area_cache;
 	start_addr = addr;
 
+	unmapped_base = TASK_UNMAPPED_BASE;
 full_search:
-	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
+	for (vma = find_vma(mm, addr); ; ) {
 		/* At this point:  (!vma || addr < vma->vm_end). */
 		if (TASK_SIZE - len < addr) {
 			/*
 			 * Start a new search - just in case we missed
 			 * some holes.
 			 */
-			if (start_addr != TASK_UNMAPPED_BASE) {
-				start_addr = addr = TASK_UNMAPPED_BASE;
+			if (start_addr > unmapped_base) {
+				start_addr = addr = unmapped_base;
 				goto full_search;
 			}
 			return -ENOMEM;
 		}
+		/* On the first pass always skip the brk gap to not
+		   confuse glibc malloc.  This can happen with user
+		   address hints < TASK_UNMAPPED_BASE. */
+		if (addr >= mm->brk && addr < unmapped_base) { 
+			vma = find_vma(mm, unmapped_base); 
+			addr = unmapped_base;
+			continue;
+		}
 		if (!vma || addr + len <= vma->vm_start) {
 			/*
-			 * Remember the place where we stopped the search:
+			 * Remember the place where we stopped the search,
+			 * but only if the user didn't give hints.
 			 */
-			mm->free_area_cache = addr + len;
+			if (uaddr == 0) 
+				mm->free_area_cache = addr + len;
 			return addr;
 		}
 		addr = vma->vm_end;
+		vma = vma->vm_next;
 	}
 }
 #else

  parent reply	other threads:[~2004-02-10  7:17 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-02-10  3:47 [BUG] get_unmapped_area() change -> non booting machine Benjamin Herrenschmidt
2004-02-10 16:25 ` Linus Torvalds
2004-02-10 17:37   ` Jamie Lokier
2004-02-10 22:25     ` Benjamin Herrenschmidt
2004-02-12 23:23     ` Andi Kleen
2004-02-12 10:04       ` Ingo Molnar
2004-02-12 16:36         ` Linus Torvalds
2004-02-12 17:02           ` Dave McCracken
2004-02-12 17:17             ` Linus Torvalds
2004-02-12 17:31               ` Dave McCracken
2004-02-12 18:19                 ` Linus Torvalds
2004-02-12 18:25                   ` Dave McCracken
2004-02-12 20:49           ` Benjamin Herrenschmidt
2004-02-13  3:26           ` Jamie Lokier
2004-02-15  5:25             ` Andi Kleen
2004-02-13 18:33               ` Martin J. Bligh
2004-02-13  1:52                 ` Andi Kleen
2004-02-13  6:26           ` H. Peter Anvin
2004-02-10 22:17   ` Benjamin Herrenschmidt
2004-02-14  8:34     ` Andi Kleen
2004-02-11 23:23 ` Andi Kleen [this message]
2004-02-10  7:48   ` Benjamin Herrenschmidt

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=20040212002338.2a82302d.ak@suse.de \
    --to=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=benh@kernel.crashing.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.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