Commit 12026d20 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Peter Zijlstra
Browse files

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: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatar"Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Link: https://lore.kernel.org/r/20240801132749.GA8817@redhat.com
parent 70408beb
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -939,7 +939,6 @@ static void delete_uprobe(struct uprobe *uprobe)
	rb_erase(&uprobe->rb_node, &uprobes_tree);
	write_unlock(&uprobes_treelock);
	RB_CLEAR_NODE(&uprobe->rb_node); /* for uprobe_is_active() */
	put_uprobe(uprobe);
}

struct map_info {
@@ -1094,7 +1093,6 @@ void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
{
	int err;

	get_uprobe(uprobe);
	down_write(&uprobe->register_rwsem);
	if (WARN_ON(!consumer_del(uprobe, uc)))
		err = -ENOENT;
@@ -1102,9 +1100,15 @@ void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
		err = register_for_each_vma(uprobe, NULL);

	/* TODO : cant unregister? schedule a worker thread */
	if (!err && !uprobe->consumers)
	if (!err) {
		if (!uprobe->consumers)
			delete_uprobe(uprobe);
		else
			err = -EBUSY;
	}
	up_write(&uprobe->register_rwsem);

	if (!err)
		put_uprobe(uprobe);
}
EXPORT_SYMBOL_GPL(uprobe_unregister);