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
next prev 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