mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 21:23:23 +00:00
Uprobes: Simplify uprobe_register() body
Simplify uprobe_register() function body and let __uprobe_register() handle everything. Also move dependency functions around to avoid build failures. Link: http://lkml.kernel.org/r/20180809041856.1547-2-ravi.bangoria@linux.ibm.com Reviewed-by: Song Liu <songliubraving@fb.com> Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
f8a79d5c7e
commit
38e967ae1e
@ -840,13 +840,8 @@ register_for_each_vma(struct uprobe *uprobe, struct uprobe_consumer *new)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __uprobe_register(struct uprobe *uprobe, struct uprobe_consumer *uc)
|
||||
{
|
||||
consumer_add(uprobe, uc);
|
||||
return register_for_each_vma(uprobe, uc);
|
||||
}
|
||||
|
||||
static void __uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
|
||||
static void
|
||||
__uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -860,24 +855,46 @@ static void __uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *u
|
||||
}
|
||||
|
||||
/*
|
||||
* uprobe_register - register a probe
|
||||
* uprobe_unregister - unregister a already registered probe.
|
||||
* @inode: the file in which the probe has to be removed.
|
||||
* @offset: offset from the start of the file.
|
||||
* @uc: identify which probe if multiple probes are colocated.
|
||||
*/
|
||||
void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
|
||||
{
|
||||
struct uprobe *uprobe;
|
||||
|
||||
uprobe = find_uprobe(inode, offset);
|
||||
if (WARN_ON(!uprobe))
|
||||
return;
|
||||
|
||||
down_write(&uprobe->register_rwsem);
|
||||
__uprobe_unregister(uprobe, uc);
|
||||
up_write(&uprobe->register_rwsem);
|
||||
put_uprobe(uprobe);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uprobe_unregister);
|
||||
|
||||
/*
|
||||
* __uprobe_register - register a probe
|
||||
* @inode: the file in which the probe has to be placed.
|
||||
* @offset: offset from the start of the file.
|
||||
* @uc: information on howto handle the probe..
|
||||
*
|
||||
* Apart from the access refcount, uprobe_register() takes a creation
|
||||
* Apart from the access refcount, __uprobe_register() takes a creation
|
||||
* refcount (thro alloc_uprobe) if and only if this @uprobe is getting
|
||||
* inserted into the rbtree (i.e first consumer for a @inode:@offset
|
||||
* tuple). Creation refcount stops uprobe_unregister from freeing the
|
||||
* @uprobe even before the register operation is complete. Creation
|
||||
* refcount is released when the last @uc for the @uprobe
|
||||
* unregisters. Caller of uprobe_register() is required to keep @inode
|
||||
* unregisters. Caller of __uprobe_register() is required to keep @inode
|
||||
* (and the containing mount) referenced.
|
||||
*
|
||||
* Return errno if it cannot successully install probes
|
||||
* else return 0 (success)
|
||||
*/
|
||||
int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
|
||||
static int __uprobe_register(struct inode *inode, loff_t offset,
|
||||
struct uprobe_consumer *uc)
|
||||
{
|
||||
struct uprobe *uprobe;
|
||||
int ret;
|
||||
@ -904,7 +921,8 @@ int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *
|
||||
down_write(&uprobe->register_rwsem);
|
||||
ret = -EAGAIN;
|
||||
if (likely(uprobe_is_active(uprobe))) {
|
||||
ret = __uprobe_register(uprobe, uc);
|
||||
consumer_add(uprobe, uc);
|
||||
ret = register_for_each_vma(uprobe, uc);
|
||||
if (ret)
|
||||
__uprobe_unregister(uprobe, uc);
|
||||
}
|
||||
@ -915,6 +933,12 @@ int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *
|
||||
goto retry;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int uprobe_register(struct inode *inode, loff_t offset,
|
||||
struct uprobe_consumer *uc)
|
||||
{
|
||||
return __uprobe_register(inode, offset, uc);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uprobe_register);
|
||||
|
||||
/*
|
||||
@ -946,27 +970,6 @@ int uprobe_apply(struct inode *inode, loff_t offset,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* uprobe_unregister - unregister a already registered probe.
|
||||
* @inode: the file in which the probe has to be removed.
|
||||
* @offset: offset from the start of the file.
|
||||
* @uc: identify which probe if multiple probes are colocated.
|
||||
*/
|
||||
void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
|
||||
{
|
||||
struct uprobe *uprobe;
|
||||
|
||||
uprobe = find_uprobe(inode, offset);
|
||||
if (WARN_ON(!uprobe))
|
||||
return;
|
||||
|
||||
down_write(&uprobe->register_rwsem);
|
||||
__uprobe_unregister(uprobe, uc);
|
||||
up_write(&uprobe->register_rwsem);
|
||||
put_uprobe(uprobe);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uprobe_unregister);
|
||||
|
||||
static int unapply_uprobe(struct uprobe *uprobe, struct mm_struct *mm)
|
||||
{
|
||||
struct vm_area_struct *vma;
|
||||
|
Loading…
x
Reference in New Issue
Block a user