lkml.org 
[lkml]   [2016]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 019/118] mm: introduce get_task_exe_file
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mateusz Guzik <mguzik@redhat.com>

    commit cd81a9170e69e018bbaba547c1fd85a585f5697a upstream.

    For more convenient access if one has a pointer to the task.

    As a minor nit take advantage of the fact that only task lock + rcu are
    needed to safely grab ->exe_file. This saves mm refcount dance.

    Use the helper in proc_exe_link.

    Signed-off-by: Mateusz Guzik <mguzik@redhat.com>
    Acked-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Acked-by: Richard Guy Briggs <rgb@redhat.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/proc/base.c | 7 +------
    include/linux/mm.h | 1 +
    kernel/fork.c | 23 +++++++++++++++++++++++
    3 files changed, 25 insertions(+), 6 deletions(-)

    --- a/fs/proc/base.c
    +++ b/fs/proc/base.c
    @@ -1545,18 +1545,13 @@ static const struct file_operations proc
    static int proc_exe_link(struct dentry *dentry, struct path *exe_path)
    {
    struct task_struct *task;
    - struct mm_struct *mm;
    struct file *exe_file;

    task = get_proc_task(d_inode(dentry));
    if (!task)
    return -ENOENT;
    - mm = get_task_mm(task);
    + exe_file = get_task_exe_file(task);
    put_task_struct(task);
    - if (!mm)
    - return -ENOENT;
    - exe_file = get_mm_exe_file(mm);
    - mmput(mm);
    if (exe_file) {
    *exe_path = exe_file->f_path;
    path_get(&exe_file->f_path);
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -1898,6 +1898,7 @@ extern void mm_drop_all_locks(struct mm_

    extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file);
    extern struct file *get_mm_exe_file(struct mm_struct *mm);
    +extern struct file *get_task_exe_file(struct task_struct *task);

    extern int may_expand_vm(struct mm_struct *mm, unsigned long npages);
    extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm,
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -764,6 +764,29 @@ struct file *get_mm_exe_file(struct mm_s
    EXPORT_SYMBOL(get_mm_exe_file);

    /**
    + * get_task_exe_file - acquire a reference to the task's executable file
    + *
    + * Returns %NULL if task's mm (if any) has no associated executable file or
    + * this is a kernel thread with borrowed mm (see the comment above get_task_mm).
    + * User must release file via fput().
    + */
    +struct file *get_task_exe_file(struct task_struct *task)
    +{
    + struct file *exe_file = NULL;
    + struct mm_struct *mm;
    +
    + task_lock(task);
    + mm = task->mm;
    + if (mm) {
    + if (!(task->flags & PF_KTHREAD))
    + exe_file = get_mm_exe_file(mm);
    + }
    + task_unlock(task);
    + return exe_file;
    +}
    +EXPORT_SYMBOL(get_task_exe_file);
    +
    +/**
    * get_task_mm - acquire a reference to the task's mm
    *
    * Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning

    \
     
     \ /
      Last update: 2016-09-23 00:03    [W:2.832 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site