[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] linux-user: Use RLIMIT_STACK for default stack
From: |
Aurelien Jarno |
Subject: |
Re: [Qemu-devel] [PATCH] linux-user: Use RLIMIT_STACK for default stack size. |
Date: |
Sat, 27 Mar 2010 14:22:22 +0100 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
On Fri, Mar 19, 2010 at 02:21:13PM -0700, Richard Henderson wrote:
> The current default stack limit of 512kB is far too small; a fair
> number of gcc testsuite failures (for all guests) are directly
> attributable to this. Using the -s option in every invocation of
> the emulator is annoying to say the least.
>
> A reasonable compromise seems to be to honor the system rlimit.
> At least on two Linux distributions, this is set to 8MB and 10MB
> respectively. If the system does not limit the stack, then we're
> no worse off than before.
>
> At the same time, rename the variable from x86_stack_size and
> change the ultimate fallback size from 512kB to 8MB.
Thanks, applied.
> Signed-off-by: Richard Henderson <address@hidden>
> ---
> linux-user/elfload.c | 2 +-
> linux-user/main.c | 23 +++++++++++++++++------
> linux-user/qemu.h | 2 +-
> 3 files changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index 91eea62..b721b10 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -1004,7 +1004,7 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct
> linux_binprm *bprm,
> /* Create enough stack to hold everything. If we don't use
> * it for args, we'll use it for something else...
> */
> - size = x86_stack_size;
> + size = guest_stack_size;
> if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
> size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
> error = target_mmap(0,
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 4614e3c..e5ff8a9 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -24,6 +24,7 @@
> #include <unistd.h>
> #include <sys/mman.h>
> #include <sys/syscall.h>
> +#include <sys/resource.h>
>
> #include "qemu.h"
> #include "qemu-common.h"
> @@ -51,7 +52,7 @@ const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
> /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
> we allocate a bigger stack. Need a better solution, for example
> by remapping the process stack directly at the right place */
> -unsigned long x86_stack_size = 512 * 1024;
> +unsigned long guest_stack_size = 8 * 1024 * 1024UL;
>
> void gemu_log(const char *fmt, ...)
> {
> @@ -2560,7 +2561,7 @@ static void usage(void)
> ,
> TARGET_ARCH,
> interp_prefix,
> - x86_stack_size,
> + guest_stack_size,
> DEBUG_LOGFILE);
> exit(1);
> }
> @@ -2639,6 +2640,16 @@ int main(int argc, char **argv, char **envp)
> (void) envlist_setenv(envlist, *wrk);
> }
>
> + /* Read the stack limit from the kernel. If it's "unlimited",
> + then we can do little else besides use the default. */
> + {
> + struct rlimit lim;
> + if (getrlimit(RLIMIT_STACK, &lim) == 0
> + && lim.rlim_cur != RLIM_INFINITY) {
> + guest_stack_size = lim.rlim_cur;
> + }
> + }
> +
> cpu_model = NULL;
> #if defined(cpudef_setup)
> cpudef_setup(); /* parse cpu definitions in target config file (TBD) */
> @@ -2687,13 +2698,13 @@ int main(int argc, char **argv, char **envp)
> if (optind >= argc)
> break;
> r = argv[optind++];
> - x86_stack_size = strtol(r, (char **)&r, 0);
> - if (x86_stack_size <= 0)
> + guest_stack_size = strtoul(r, (char **)&r, 0);
> + if (guest_stack_size == 0)
> usage();
> if (*r == 'M')
> - x86_stack_size *= 1024 * 1024;
> + guest_stack_size *= 1024 * 1024;
> else if (*r == 'k' || *r == 'K')
> - x86_stack_size *= 1024;
> + guest_stack_size *= 1024;
> } else if (!strcmp(r, "L")) {
> interp_prefix = argv[optind++];
> } else if (!strcmp(r, "p")) {
> diff --git a/linux-user/qemu.h b/linux-user/qemu.h
> index 6ab9517..47fc686 100644
> --- a/linux-user/qemu.h
> +++ b/linux-user/qemu.h
> @@ -246,7 +246,7 @@ void mmap_fork_end(int child);
> #endif
>
> /* main.c */
> -extern unsigned long x86_stack_size;
> +extern unsigned long guest_stack_size;
>
> /* user access */
>
> --
> 1.6.6.1
>
>
>
>
--
Aurelien Jarno GPG: 1024D/F1BCDB73
address@hidden http://www.aurel32.net