Skip to content

Commit 12026d2

Browse files
oleg-nesterovPeter Zijlstra
authored andcommitted
uprobes: shift put_uprobe() from delete_uprobe() to uprobe_unregister()
Kill the extra get_uprobe() + put_uprobe() in uprobe_unregister() and move the possibly final put_uprobe() from delete_uprobe() to its only caller, uprobe_unregister(). Signed-off-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: "Masami Hiramatsu (Google)" <mhiramat@kernel.org> Link: https://lore.kernel.org/r/20240801132749.GA8817@redhat.com
1 parent 70408be commit 12026d2

1 file changed

Lines changed: 9 additions & 5 deletions

File tree

kernel/events/uprobes.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,6 @@ static void delete_uprobe(struct uprobe *uprobe)
939939
rb_erase(&uprobe->rb_node, &uprobes_tree);
940940
write_unlock(&uprobes_treelock);
941941
RB_CLEAR_NODE(&uprobe->rb_node); /* for uprobe_is_active() */
942-
put_uprobe(uprobe);
943942
}
944943

945944
struct map_info {
@@ -1094,18 +1093,23 @@ void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
10941093
{
10951094
int err;
10961095

1097-
get_uprobe(uprobe);
10981096
down_write(&uprobe->register_rwsem);
10991097
if (WARN_ON(!consumer_del(uprobe, uc)))
11001098
err = -ENOENT;
11011099
else
11021100
err = register_for_each_vma(uprobe, NULL);
11031101

11041102
/* TODO : cant unregister? schedule a worker thread */
1105-
if (!err && !uprobe->consumers)
1106-
delete_uprobe(uprobe);
1103+
if (!err) {
1104+
if (!uprobe->consumers)
1105+
delete_uprobe(uprobe);
1106+
else
1107+
err = -EBUSY;
1108+
}
11071109
up_write(&uprobe->register_rwsem);
1108-
put_uprobe(uprobe);
1110+
1111+
if (!err)
1112+
put_uprobe(uprobe);
11091113
}
11101114
EXPORT_SYMBOL_GPL(uprobe_unregister);
11111115

0 commit comments

Comments
 (0)