]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rculist: Consolidate DEBUG_LIST for list_add_rcu()
authorKees Cook <keescook@chromium.org>
Wed, 17 Aug 2016 21:42:09 +0000 (14:42 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 31 Oct 2016 20:01:57 +0000 (13:01 -0700)
This commit consolidates the debug checking for list_add_rcu() into the
new single __list_add_valid() debug function.  Notably, this commit fixes
the sanity check that was added in commit 17a801f4bfeb ("list_debug:
WARN for adding something already in the list"), which wasn't checking
RCU-protected lists.

Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: Rik van Riel <riel@redhat.com>
include/linux/rculist.h
lib/list_debug.c

index 8beb98dcf14f066fc4e9075ed0b94cc29998c9bc..4f7a9561b8c415d069505dab632b922903d87d2e 100644 (file)
@@ -45,19 +45,17 @@ static inline void INIT_LIST_HEAD_RCU(struct list_head *list)
  * This is only for internal list manipulation where we know
  * the prev/next entries already!
  */
-#ifndef CONFIG_DEBUG_LIST
 static inline void __list_add_rcu(struct list_head *new,
                struct list_head *prev, struct list_head *next)
 {
+       if (!__list_add_valid(new, prev, next))
+               return;
+
        new->next = next;
        new->prev = prev;
        rcu_assign_pointer(list_next_rcu(prev), new);
        next->prev = new;
 }
-#else
-void __list_add_rcu(struct list_head *new,
-                   struct list_head *prev, struct list_head *next);
-#endif
 
 /**
  * list_add_rcu - add a new entry to rcu-protected list
index 149dd57b583b7243a632ce9cf315254407fc47c7..d0b89b9d0736190f866073c6f41ca1bd5eb573cb 100644 (file)
@@ -77,22 +77,3 @@ void list_del(struct list_head *entry)
        entry->prev = LIST_POISON2;
 }
 EXPORT_SYMBOL(list_del);
-
-/*
- * RCU variants.
- */
-void __list_add_rcu(struct list_head *new,
-                   struct list_head *prev, struct list_head *next)
-{
-       WARN(next->prev != prev,
-               "list_add_rcu corruption. next->prev should be prev (%p), but was %p. (next=%p).\n",
-               prev, next->prev, next);
-       WARN(prev->next != next,
-               "list_add_rcu corruption. prev->next should be next (%p), but was %p. (prev=%p).\n",
-               next, prev->next, prev);
-       new->next = next;
-       new->prev = prev;
-       rcu_assign_pointer(list_next_rcu(prev), new);
-       next->prev = new;
-}
-EXPORT_SYMBOL(__list_add_rcu);