lkml.org 
[lkml]   [2015]   [Jul]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] uprobes: Introduce free_ret_instance()
    Commit-ID:  2bb5e840e873f8778a41801141771f54f547fa65
    Gitweb: http://git.kernel.org/tip/2bb5e840e873f8778a41801141771f54f547fa65
    Author: Oleg Nesterov <oleg@redhat.com>
    AuthorDate: Tue, 21 Jul 2015 15:40:06 +0200
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Fri, 31 Jul 2015 10:38:03 +0200

    uprobes: Introduce free_ret_instance()

    We can simplify uprobe_free_utask() and handle_uretprobe_chain()
    if we add a simple helper which does put_uprobe/kfree and
    returns the ->next return_instance.

    Tested-by: Pratyush Anand <panand@redhat.com>
    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Acked-by: Anton Arapov <arapov@gmail.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/20150721134006.GA4740@redhat.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    kernel/events/uprobes.c | 27 +++++++++++++--------------
    1 file changed, 13 insertions(+), 14 deletions(-)

    diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
    index a9847b4..d8c702f 100644
    --- a/kernel/events/uprobes.c
    +++ b/kernel/events/uprobes.c
    @@ -1378,6 +1378,14 @@ unsigned long uprobe_get_trap_addr(struct pt_regs *regs)
    return instruction_pointer(regs);
    }

    +static struct return_instance *free_ret_instance(struct return_instance *ri)
    +{
    + struct return_instance *next = ri->next;
    + put_uprobe(ri->uprobe);
    + kfree(ri);
    + return next;
    +}
    +
    /*
    * Called with no locks held.
    * Called in context of a exiting or a exec-ing thread.
    @@ -1385,7 +1393,7 @@ unsigned long uprobe_get_trap_addr(struct pt_regs *regs)
    void uprobe_free_utask(struct task_struct *t)
    {
    struct uprobe_task *utask = t->utask;
    - struct return_instance *ri, *tmp;
    + struct return_instance *ri;

    if (!utask)
    return;
    @@ -1394,13 +1402,8 @@ void uprobe_free_utask(struct task_struct *t)
    put_uprobe(utask->active_uprobe);

    ri = utask->return_instances;
    - while (ri) {
    - tmp = ri;
    - ri = ri->next;
    -
    - put_uprobe(tmp->uprobe);
    - kfree(tmp);
    - }
    + while (ri)
    + ri = free_ret_instance(ri);

    xol_free_insn_slot(t);
    kfree(utask);
    @@ -1770,7 +1773,7 @@ handle_uretprobe_chain(struct return_instance *ri, struct pt_regs *regs)
    static bool handle_trampoline(struct pt_regs *regs)
    {
    struct uprobe_task *utask;
    - struct return_instance *ri, *tmp;
    + struct return_instance *ri;
    bool chained;

    utask = current->utask;
    @@ -1792,11 +1795,7 @@ static bool handle_trampoline(struct pt_regs *regs)
    handle_uretprobe_chain(ri, regs);

    chained = ri->chained;
    - put_uprobe(ri->uprobe);
    -
    - tmp = ri;
    - ri = ri->next;
    - kfree(tmp);
    + ri = free_ret_instance(ri);
    utask->depth--;

    if (!chained)

    \
     
     \ /
      Last update: 2015-07-31 16:21    [W:4.247 / U:1.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site