lkml.org 
[lkml]   [2016]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/vdso] x86/vdso: Replace calculate_addr in map_vdso() with addr
    Commit-ID:  576ebfefd37bd41e965787f60684c8e4b7f79457
    Gitweb: http://git.kernel.org/tip/576ebfefd37bd41e965787f60684c8e4b7f79457
    Author: Dmitry Safonov <dsafonov@virtuozzo.com>
    AuthorDate: Mon, 5 Sep 2016 16:33:04 +0300
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Wed, 14 Sep 2016 21:28:09 +0200

    x86/vdso: Replace calculate_addr in map_vdso() with addr

    That will allow to specify address where to map vDSO blob.
    For the randomized vDSO mappings introduce map_vdso_randomized()
    which will simplify calls to map_vdso.

    Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
    Acked-by: Andy Lutomirski <luto@kernel.org>
    Cc: 0x7f454c46@gmail.com
    Cc: oleg@redhat.com
    Cc: linux-mm@kvack.org
    Cc: gorcunov@openvz.org
    Cc: xemul@virtuozzo.com
    Link: http://lkml.kernel.org/r/20160905133308.28234-3-dsafonov@virtuozzo.com
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

    ---
    arch/x86/entry/vdso/vma.c | 30 +++++++++++++++++-------------
    1 file changed, 17 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
    index 3bab6ba..5bcb25a 100644
    --- a/arch/x86/entry/vdso/vma.c
    +++ b/arch/x86/entry/vdso/vma.c
    @@ -176,11 +176,16 @@ static int vvar_fault(const struct vm_special_mapping *sm,
    return VM_FAULT_SIGBUS;
    }

    -static int map_vdso(const struct vdso_image *image, bool calculate_addr)
    +/*
    + * Add vdso and vvar mappings to current process.
    + * @image - blob to map
    + * @addr - request a specific address (zero to map at free addr)
    + */
    +static int map_vdso(const struct vdso_image *image, unsigned long addr)
    {
    struct mm_struct *mm = current->mm;
    struct vm_area_struct *vma;
    - unsigned long addr, text_start;
    + unsigned long text_start;
    int ret = 0;

    static const struct vm_special_mapping vdso_mapping = {
    @@ -193,13 +198,6 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
    .fault = vvar_fault,
    };

    - if (calculate_addr) {
    - addr = vdso_addr(current->mm->start_stack,
    - image->size - image->sym_vvar_start);
    - } else {
    - addr = 0;
    - }
    -
    if (down_write_killable(&mm->mmap_sem))
    return -EINTR;

    @@ -251,13 +249,20 @@ up_fail:
    return ret;
    }

    +static int map_vdso_randomized(const struct vdso_image *image)
    +{
    + unsigned long addr = vdso_addr(current->mm->start_stack,
    + image->size - image->sym_vvar_start);
    + return map_vdso(image, addr);
    +}
    +
    #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
    static int load_vdso32(void)
    {
    if (vdso32_enabled != 1) /* Other values all mean "disabled" */
    return 0;

    - return map_vdso(&vdso_image_32, false);
    + return map_vdso(&vdso_image_32, 0);
    }
    #endif

    @@ -267,7 +272,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
    if (!vdso64_enabled)
    return 0;

    - return map_vdso(&vdso_image_64, true);
    + return map_vdso_randomized(&vdso_image_64);
    }

    #ifdef CONFIG_COMPAT
    @@ -278,8 +283,7 @@ int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
    if (test_thread_flag(TIF_X32)) {
    if (!vdso64_enabled)
    return 0;
    -
    - return map_vdso(&vdso_image_x32, true);
    + return map_vdso_randomized(&vdso_image_x32);
    }
    #endif
    #ifdef CONFIG_IA32_EMULATION
    \
     
     \ /
      Last update: 2016-09-17 09:59    [W:2.759 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site