All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Ebbert <cebbert@redhat.com>
To: John Reiser <jreiser@BitWagon.com>
Cc: linux-kernel@vger.kernel.org, Andi Kleen <andi@firstfloor.org>,
	Ingo Molnar <mingo@elte.hu>
Subject: Re: fully honor vdso_enabled [i386, sh; x86_64?]
Date: Wed, 28 Feb 2007 10:13:42 -0500	[thread overview]
Message-ID: <45E59C26.7060808@redhat.com> (raw)
In-Reply-To: <45DDFD98.4080300@BitWagon.com>

[adding Andi and Ingo]

John Reiser wrote:
> Architectures such as i386, sh, x86_64 have a flag /proc/sys/vm/vdso_enabled
> to choose whether the kernel should setup a process to use vdso after execve().
> Informing the user code via AT_SYSINFO* is controlled by macro ARCH_DLINFO in
> fs/binfmt_elf.c and include/asm-$ARCH/elf.h, but the vdso page is established
> always via arch_setup_additonal_pages() called from load_elf_binary().
> If vdso_enabled is off, then current code wastes kernel time during execve()
> and fragments the address space unnecessarily.
> 
> This patch changes arch_setup_additonal_pages() to honor vdso_enabled.
> For i386 it also allows the option of a fixed addresss to avoid
> fragmenting the address space.  Compiles and runs on i386.
> x86_64 [IA32 support] and sh maintainers also please comment.
> 
> For some related history, including interaction with exec-shield, see:
> http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=229304
> and also 207020 and 162797.
> 
> 
> Signed-off-by: John Reiser <jreiser@BitWagon.com>
> 
> diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c
> index 13ca54a..f8c4d76 100644
> --- a/arch/i386/kernel/sysenter.c
> +++ b/arch/i386/kernel/sysenter.c
> @@ -22,6 +22,8 @@
>  #include <asm/msr.h>
>  #include <asm/pgtable.h>
>  #include <asm/unistd.h>
> +#include <asm/a.out.h>
> +#include <asm/mman.h>
> 
>  /*
>   * Should the kernel map a VDSO page into processes and pass its
> @@ -105,10 +107,25 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
>  {
>  	struct mm_struct *mm = current->mm;
>  	unsigned long addr;
> +	unsigned long flags;
>  	int ret;
> 
> +	switch (vdso_enabled) {
> +	case 0:  /* none */
> +		return 0;
> +	default:
> +	case 1:  /* vdso in random available page */
> +		addr = 0ul;
> +		flags = 0ul;
> +		break;
> +	case 2:  /* out of user's way */
> +		addr = STACK_TOP;
> +		flags = MAP_FIXED;
> +		break;
> +	}
> +
>  	down_write(&mm->mmap_sem);
> -	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
> +	addr = get_unmapped_area(NULL, addr, PAGE_SIZE, 0, flags);
>  	if (IS_ERR_VALUE(addr)) {
>  		ret = addr;
>  		goto up_fail;
> diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c
> index 7b0f66f..2b789fb 100644
> --- a/arch/sh/kernel/vsyscall/vsyscall.c
> +++ b/arch/sh/kernel/vsyscall/vsyscall.c
> @@ -64,6 +64,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
>  	unsigned long addr;
>  	int ret;
> 
> +	if (!vdso_enabled)
> +		return 0;
> +
>  	down_write(&mm->mmap_sem);
>  	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
>  	if (IS_ERR_VALUE(addr)) {
> diff --git a/include/asm-i386/a.out.h b/include/asm-i386/a.out.h
> index ab17bb8..9894f73 100644
> --- a/include/asm-i386/a.out.h
> +++ b/include/asm-i386/a.out.h
> @@ -19,7 +19,7 @@ struct exec
> 
>  #ifdef __KERNEL__
> 
> -#define STACK_TOP	TASK_SIZE
> +#define STACK_TOP	(TASK_SIZE - PAGE_SIZE)  /* 1 page optional for vdso */
> 
>  #endif
> 


      parent reply	other threads:[~2007-02-28 15:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-22 20:31 fully honor vdso_enabled [i386, sh; x86_64?] John Reiser
2007-02-28  9:11 ` Paul Mundt
2007-02-28 21:40   ` Andrew Morton
2007-02-28 15:13 ` Chuck Ebbert [this message]

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=45E59C26.7060808@redhat.com \
    --to=cebbert@redhat.com \
    --cc=andi@firstfloor.org \
    --cc=jreiser@BitWagon.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /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.