From: Utz Lehmann <lkml@de.tecosim.com>
To: linux-kernel@vger.kernel.org, arjanv@redhat.com
Subject: [PATCH] flexmmap: optimise mmap_base gap for hard limited stack
Date: Thu, 16 Sep 2004 18:56:13 +0200 [thread overview]
Message-ID: <20040916165613.GA10825@de.tecosim.com> (raw)
Hi
With the flexmmap memory layout there is at least a 128 MB gap between
mmap_base and TASK_SIZE. I think this is for the case that a running process
can expand it's stack soft rlimit.
If there is a hard limit for the stack this minium gap is just a waste of
space. This patch reduce the gap to the hard limit + 1 MB hole. If a process
has a 8192 KB hard limit it have additional 119 MB space available over the
current behavior.
And the current implemention has a problem. If the stack soft limit is
128+ MB there is no hole between the stack and mmap_base. If there is a
mapping at mmap_base stack overflows are not detected. The patch made a
1MB hole between them.
Tested only on x86.
Signed-off-by: Utz Lehmann <lkml@de.tecosim.com>
diff -Nrup linux-2.6.9-rc2/arch/i386/mm/mmap.c linux-2.6.9-rc2-gap/arch/i386/mm/mmap.c
--- linux-2.6.9-rc2/arch/i386/mm/mmap.c 2004-09-16 11:18:15.363366420 +0200
+++ linux-2.6.9-rc2-gap/arch/i386/mm/mmap.c 2004-09-16 16:01:13.197508592 +0200
@@ -30,10 +30,13 @@
/*
* Top of mmap area (just below the process stack).
*
- * Leave an at least ~128 MB hole.
+ * Leave an at least 1 MB hole between stack and mmap_base.
+ * Leave an at least 128 MB gap between TASK_SIZE and mmap_base with a
+ * soft rlimit stack.
*/
-#define MIN_GAP (128*1024*1024)
-#define MAX_GAP (TASK_SIZE/6*5)
+#define MIN_HOLE (1*1024*1024)
+#define MIN_GAP (128*1024*1024 - MIN_HOLE)
+#define MAX_GAP (TASK_SIZE/6*5 - MIN_HOLE)
static inline unsigned long mmap_base(struct mm_struct *mm)
{
@@ -43,8 +46,10 @@ static inline unsigned long mmap_base(st
gap = MIN_GAP;
else if (gap > MAX_GAP)
gap = MAX_GAP;
+ if (gap > current->rlim[RLIMIT_STACK].rlim_max)
+ gap = current->rlim[RLIMIT_STACK].rlim_max;
- return TASK_SIZE - (gap & PAGE_MASK);
+ return TASK_SIZE - ((gap + MIN_HOLE) & PAGE_MASK);
}
/*
diff -Nrup linux-2.6.9-rc2/arch/ppc64/mm/mmap.c linux-2.6.9-rc2-gap/arch/ppc64/mm/mmap.c
--- linux-2.6.9-rc2/arch/ppc64/mm/mmap.c 2004-09-16 11:18:19.760799910 +0200
+++ linux-2.6.9-rc2-gap/arch/ppc64/mm/mmap.c 2004-09-16 16:37:44.995858703 +0200
@@ -30,10 +30,13 @@
/*
* Top of mmap area (just below the process stack).
*
- * Leave an at least ~128 MB hole.
+ * Leave an at least 1 MB hole between stack and mmap_base.
+ * Leave an at least 128 MB gap between TASK_SIZE and mmap_base with a
+ * soft rlimit stack.
*/
-#define MIN_GAP (128*1024*1024)
-#define MAX_GAP (TASK_SIZE/6*5)
+#define MIN_HOLE (1*1024*1024)
+#define MIN_GAP (128*1024*1024 - MIN_HOLE)
+#define MAX_GAP (TASK_SIZE/6*5 - MIN_HOLE)
static inline unsigned long mmap_base(void)
{
@@ -43,8 +46,10 @@ static inline unsigned long mmap_base(vo
gap = MIN_GAP;
else if (gap > MAX_GAP)
gap = MAX_GAP;
+ if (gap > current->rlim[RLIMIT_STACK].rlim_max)
+ gap = current->rlim[RLIMIT_STACK].rlim_max;
- return TASK_SIZE - (gap & PAGE_MASK);
+ return TASK_SIZE - ((gap + MIN_HOLE) & PAGE_MASK);
}
static inline int mmap_is_legacy(void)
diff -Nrup linux-2.6.9-rc2/arch/s390/mm/mmap.c linux-2.6.9-rc2-gap/arch/s390/mm/mmap.c
--- linux-2.6.9-rc2/arch/s390/mm/mmap.c 2004-09-16 11:18:19.855787673 +0200
+++ linux-2.6.9-rc2-gap/arch/s390/mm/mmap.c 2004-09-16 16:37:59.459999725 +0200
@@ -30,10 +30,13 @@
/*
* Top of mmap area (just below the process stack).
*
- * Leave an at least ~128 MB hole.
+ * Leave an at least 1 MB hole between stack and mmap_base.
+ * Leave an at least 128 MB gap between TASK_SIZE and mmap_base with a
+ * soft rlimit stack.
*/
-#define MIN_GAP (128*1024*1024)
-#define MAX_GAP (TASK_SIZE/6*5)
+#define MIN_HOLE (1*1024*1024)
+#define MIN_GAP (128*1024*1024 - MIN_HOLE)
+#define MAX_GAP (TASK_SIZE/6*5 - MIN_HOLE)
static inline unsigned long mmap_base(void)
{
@@ -43,8 +46,10 @@ static inline unsigned long mmap_base(vo
gap = MIN_GAP;
else if (gap > MAX_GAP)
gap = MAX_GAP;
+ if (gap > current->rlim[RLIMIT_STACK].rlim_max)
+ gap = current->rlim[RLIMIT_STACK].rlim_max;
- return TASK_SIZE - (gap & PAGE_MASK);
+ return TASK_SIZE - ((gap + MIN_HOLE) & PAGE_MASK);
}
static inline int mmap_is_legacy(void)
next reply other threads:[~2004-09-16 17:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-16 16:56 Utz Lehmann [this message]
2004-09-16 17:38 ` [PATCH] flexmmap: optimise mmap_base gap for hard limited stack Andrea Arcangeli
2004-09-17 13:24 ` Utz Lehmann
2004-09-16 17:45 ` Arjan van de Ven
2004-09-16 18:21 ` Utz Lehmann
2004-09-16 19:07 ` Ulrich Drepper
2004-09-17 13:18 ` Utz Lehmann
2004-09-17 13:21 ` Arjan van de Ven
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=20040916165613.GA10825@de.tecosim.com \
--to=lkml@de.tecosim.com \
--cc=arjanv@redhat.com \
--cc=linux-kernel@vger.kernel.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 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.