lkml.org 
[lkml]   [2008]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 1 of 3] list_del_init_rcu
    Date
    From
    From: Andrea Arcangeli <andrea@qumranet.com>

    Introduces list_del_init_rcu and documents it (fixes a comment for
    list_del_rcu too).

    Signed-off-by: Andrea Arcangeli <andrea@qumranet.com>
    Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
    ---

    diff -r 98f755616212 -r 5e8c41d283cc include/linux/list.h
    --- a/include/linux/list.h Tue Jun 24 11:23:35 2008 -0700
    +++ b/include/linux/list.h Wed Jun 25 03:34:11 2008 +0200
    @@ -747,7 +747,7 @@ static inline void hlist_del(struct hlis
    * or hlist_del_rcu(), running on this same list.
    * However, it is perfectly legal to run concurrently with
    * the _rcu list-traversal primitives, such as
    - * hlist_for_each_entry().
    + * hlist_for_each_entry_rcu().
    */
    static inline void hlist_del_rcu(struct hlist_node *n)
    {
    @@ -760,6 +760,34 @@ static inline void hlist_del_init(struct
    if (!hlist_unhashed(n)) {
    __hlist_del(n);
    INIT_HLIST_NODE(n);
    + }
    +}
    +
    +/**
    + * hlist_del_init_rcu - deletes entry from hash list with re-initialization
    + * @n: the element to delete from the hash list.
    + *
    + * Note: list_unhashed() on the node return true after this. It is
    + * useful for RCU based read lockfree traversal if the writer side
    + * must know if the list entry is still hashed or already unhashed.
    + *
    + * In particular, it means that we can not poison the forward pointers
    + * that may still be used for walking the hash list and we can only
    + * zero the pprev pointer so list_unhashed() will return true after
    + * this.
    + *
    + * The caller must take whatever precautions are necessary (such as
    + * holding appropriate locks) to avoid racing with another
    + * list-mutation primitive, such as hlist_add_head_rcu() or
    + * hlist_del_rcu(), running on this same list. However, it is
    + * perfectly legal to run concurrently with the _rcu list-traversal
    + * primitives, such as hlist_for_each_entry_rcu().
    + */
    +static inline void hlist_del_init_rcu(struct hlist_node *n)
    +{
    + if (!hlist_unhashed(n)) {
    + __hlist_del(n);
    + n->pprev = NULL;
    }
    }


    \
     
     \ /
      Last update: 2008-06-26 02:49    [W:0.020 / U:30.676 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site