lkml.org 
[lkml]   [2018]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 02/26] ida: Lock the IDA in ida_destroy
    Date
    The user has no need to handle locking between ida_simple_get() and
    ida_simple_remove(). They shouldn't be forced to think about whether
    ida_destroy() might be called at the same time as any of their other
    IDA manipulation calls. Improve the documnetation while I'm in here.

    Signed-off-by: Matthew Wilcox <willy@infradead.org>
    ---
    lib/idr.c | 17 +++++++++++------
    1 file changed, 11 insertions(+), 6 deletions(-)

    diff --git a/lib/idr.c b/lib/idr.c
    index ed9c169c12bd..352c6160e2e0 100644
    --- a/lib/idr.c
    +++ b/lib/idr.c
    @@ -523,25 +523,30 @@ void ida_remove(struct ida *ida, int id)
    EXPORT_SYMBOL(ida_remove);

    /**
    - * ida_destroy - Free the contents of an ida
    - * @ida: ida handle
    + * ida_destroy() - Free all IDs.
    + * @ida: IDA handle.
    + *
    + * Calling this function frees all IDs and releases all resources used
    + * by an IDA. When this call returns, the IDA is empty and can be reused
    + * or freed. If the IDA is already empty, there is no need to call this
    + * function.
    *
    - * Calling this function releases all resources associated with an IDA. When
    - * this call returns, the IDA is empty and can be reused or freed. The caller
    - * should not allow ida_remove() or ida_get_new_above() to be called at the
    - * same time.
    + * Context: Any context.
    */
    void ida_destroy(struct ida *ida)
    {
    + unsigned long flags;
    struct radix_tree_iter iter;
    void __rcu **slot;

    + xa_lock_irqsave(&ida->ida_rt, flags);
    radix_tree_for_each_slot(slot, &ida->ida_rt, &iter, 0) {
    struct ida_bitmap *bitmap = rcu_dereference_raw(*slot);
    if (!radix_tree_exception(bitmap))
    kfree(bitmap);
    radix_tree_iter_delete(&ida->ida_rt, &iter, slot);
    }
    + xa_unlock_irqrestore(&ida->ida_rt, flags);
    }
    EXPORT_SYMBOL(ida_destroy);

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-06-21 23:37    [W:4.274 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site