lkml.org 
[lkml]   [2018]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 02/10] Uprobes: Simplify uprobe_register() body
    Date
    Simplify uprobe_register() function body and let __uprobe_register()
    handle everything. Also move dependency functions around to fix build
    failures.

    Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
    ---
    kernel/events/uprobes.c | 69 ++++++++++++++++++++++++++-----------------------
    1 file changed, 36 insertions(+), 33 deletions(-)

    diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
    index e6e812304b22..26c2d95c55fa 100644
    --- a/kernel/events/uprobes.c
    +++ b/kernel/events/uprobes.c
    @@ -816,13 +816,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;

    @@ -836,24 +831,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;
    @@ -880,7 +897,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);
    }
    @@ -891,6 +909,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);

    /*
    @@ -922,27 +946,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;
    --
    2.14.4
    \
     
     \ /
      Last update: 2018-06-28 07:25    [W:2.210 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site