Skip to content

Commit

Permalink
UPSTREAM: rculist: Consolidate DEBUG_LIST for list_add_rcu()
Browse files Browse the repository at this point in the history
(cherry-picked from 54acd4397d7e7a725c94101180cd9f38ef701acc)

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 17a801f ("list_debug:
WARN for adding something already in the list"), which wasn't checking
RCU-protected lists.

Change-Id: I92ddbbfd01455c2422e45abb8b83c05fe624ea06
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>
Signed-off-by: Satya Tangirala <satyat@google.com>
Signed-off-by: khusika <khusikadhamar@gmail.com>
  • Loading branch information
kees authored and khusika committed Oct 26, 2018
1 parent 174280d commit 41e0b21
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 24 deletions.
8 changes: 3 additions & 5 deletions include/linux/rculist.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 0 additions & 19 deletions lib/list_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit 41e0b21

Please sign in to comment.