UPSTREAM: rculist: Consolidate DEBUG_LIST for list_add_rcu()
(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 17a801f4bf
("list_debug:
WARN for adding something already in the list"), which wasn't checking
RCU-protected lists.
Change-Id: I1f7e169d4dc45bbc9938087a171c5df747344414
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>
This commit is contained in:
parent
68e051d4a7
commit
f0b68d746a
2 changed files with 3 additions and 24 deletions
|
@ -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
|
* This is only for internal list manipulation where we know
|
||||||
* the prev/next entries already!
|
* the prev/next entries already!
|
||||||
*/
|
*/
|
||||||
#ifndef CONFIG_DEBUG_LIST
|
|
||||||
static inline void __list_add_rcu(struct list_head *new,
|
static inline void __list_add_rcu(struct list_head *new,
|
||||||
struct list_head *prev, struct list_head *next)
|
struct list_head *prev, struct list_head *next)
|
||||||
{
|
{
|
||||||
|
if (!__list_add_valid(new, prev, next))
|
||||||
|
return;
|
||||||
|
|
||||||
new->next = next;
|
new->next = next;
|
||||||
new->prev = prev;
|
new->prev = prev;
|
||||||
rcu_assign_pointer(list_next_rcu(prev), new);
|
rcu_assign_pointer(list_next_rcu(prev), new);
|
||||||
next->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
|
* list_add_rcu - add a new entry to rcu-protected list
|
||||||
|
|
|
@ -77,22 +77,3 @@ void list_del(struct list_head *entry)
|
||||||
entry->prev = LIST_POISON2;
|
entry->prev = LIST_POISON2;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(list_del);
|
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);
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue