On Tue, Jul 07, 2015 at 03:22:39AM +0200, Oleg Nesterov wrote: > 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. > > Signed-off-by: Oleg Nesterov <o...@redhat.com> > Acked-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> Acked-by: Anton Arapov <ara...@gmail.com>
> --- > kernel/events/uprobes.c | 27 +++++++++++++-------------- > 1 files 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) > -- > 1.5.5.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/