Commit 04aab9b2 authored by Oleg Nesterov's avatar Oleg Nesterov

uprobes: _unregister() should always do register_for_each_vma(false)

uprobe_unregister() removes the breakpoints only if the last consumer
goes away. To support the filtering it should do this every time, we
want to remove the breakpoints which nobody else want to keep.

Note: given that filter_chain() is not actually implemented, this patch
itself doesn't change the behaviour yet, register_for_each_vma(false)
is a heavy "nop" unless there are no more consumers.
Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Acked-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
parent 63633cbf
...@@ -825,12 +825,20 @@ static int __uprobe_register(struct uprobe *uprobe) ...@@ -825,12 +825,20 @@ static int __uprobe_register(struct uprobe *uprobe)
return register_for_each_vma(uprobe, true); return register_for_each_vma(uprobe, true);
} }
static void __uprobe_unregister(struct uprobe *uprobe) static void __uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
{ {
if (!register_for_each_vma(uprobe, false)) int err;
delete_uprobe(uprobe);
if (!consumer_del(uprobe, uc)) /* WARN? */
return;
/* TODO : cant unregister? schedule a worker thread */ err = register_for_each_vma(uprobe, false);
if (!uprobe->consumers) {
clear_bit(UPROBE_RUN_HANDLER, &uprobe->flags);
/* TODO : cant unregister? schedule a worker thread */
if (!err)
delete_uprobe(uprobe);
}
} }
/* /*
...@@ -868,8 +876,7 @@ int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer * ...@@ -868,8 +876,7 @@ int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *
} else if (!consumer_add(uprobe, uc)) { } else if (!consumer_add(uprobe, uc)) {
ret = __uprobe_register(uprobe); ret = __uprobe_register(uprobe);
if (ret) { if (ret) {
uprobe->consumers = NULL; __uprobe_unregister(uprobe, uc);
__uprobe_unregister(uprobe);
} else { } else {
set_bit(UPROBE_RUN_HANDLER, &uprobe->flags); set_bit(UPROBE_RUN_HANDLER, &uprobe->flags);
} }
...@@ -897,14 +904,7 @@ void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consume ...@@ -897,14 +904,7 @@ void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consume
return; return;
mutex_lock(uprobes_hash(inode)); mutex_lock(uprobes_hash(inode));
__uprobe_unregister(uprobe, uc);
if (consumer_del(uprobe, uc)) {
if (!uprobe->consumers) {
__uprobe_unregister(uprobe);
clear_bit(UPROBE_RUN_HANDLER, &uprobe->flags);
}
}
mutex_unlock(uprobes_hash(inode)); mutex_unlock(uprobes_hash(inode));
put_uprobe(uprobe); put_uprobe(uprobe);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment