From: Matthew Wilcox <matthew@wil.cx>
To: Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Dave Jones <davej@redhat.com>
Subject: [PATCH] Extend list debugging to cover hlists
Date: Fri, 2 May 2008 12:27:46 -0600 [thread overview]
Message-ID: <20080502182745.GL14976@parisc-linux.org> (raw)
We've seen a couple of recent reports which point to corrupt hlists.
The DEBUG_LIST config option only checks regular lists, but it's not hard
to cover hlists too.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
diff --git a/include/linux/list.h b/include/linux/list.h
index 08cf4f6..a325d9f 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -714,10 +714,17 @@ static inline int hlist_empty(const struct hlist_head *h)
return !h->first;
}
+#ifdef CONFIG_DEBUG_LIST
+extern void hlist_check(struct hlist_node *n);
+#else
+#define hlist_check(n) do { } while (0)
+#endif
+
static inline void __hlist_del(struct hlist_node *n)
{
struct hlist_node *next = n->next;
struct hlist_node **pprev = n->pprev;
+ hlist_check(n);
*pprev = next;
if (next)
next->pprev = pprev;
@@ -775,6 +782,7 @@ static inline void hlist_replace_rcu(struct hlist_node *old,
{
struct hlist_node *next = old->next;
+ hlist_check(old);
new->next = next;
new->pprev = old->pprev;
smp_wmb();
@@ -830,6 +838,7 @@ static inline void hlist_add_head_rcu(struct hlist_node *n,
static inline void hlist_add_before(struct hlist_node *n,
struct hlist_node *next)
{
+ hlist_check(next);
n->pprev = next->pprev;
n->next = next;
next->pprev = &n->next;
@@ -839,6 +848,7 @@ static inline void hlist_add_before(struct hlist_node *n,
static inline void hlist_add_after(struct hlist_node *n,
struct hlist_node *next)
{
+ hlist_check(next);
next->next = n->next;
n->next = next;
next->pprev = &n->next;
@@ -868,6 +878,7 @@ static inline void hlist_add_after(struct hlist_node *n,
static inline void hlist_add_before_rcu(struct hlist_node *n,
struct hlist_node *next)
{
+ hlist_check(next);
n->pprev = next->pprev;
n->next = next;
smp_wmb();
@@ -896,6 +907,7 @@ static inline void hlist_add_before_rcu(struct hlist_node *n,
static inline void hlist_add_after_rcu(struct hlist_node *prev,
struct hlist_node *n)
{
+ hlist_check(prev);
n->next = prev->next;
n->pprev = &prev->next;
smp_wmb();
diff --git a/lib/list_debug.c b/lib/list_debug.c
index 4350ba9..00b56bf 100644
--- a/lib/list_debug.c
+++ b/lib/list_debug.c
@@ -1,5 +1,8 @@
/*
* Copyright 2006, Red Hat, Inc., Dave Jones
+ * Copyright 2008 Intel Corporation
+ * Author: Matthew Wilcox <willy@linux.intel.com>
+ *
* Released under the General Public License (GPL).
*
* This file contains the linked list implementations for
@@ -76,3 +79,18 @@ void list_del(struct list_head *entry)
entry->prev = LIST_POISON2;
}
EXPORT_SYMBOL(list_del);
+
+void hlist_check(struct hlist_node *n)
+{
+ if (unlikely(*n->pprev != n)) {
+ printk(KERN_ERR "hlist corruption. *pprev should be %p, "
+ "but was %p\n", n, *n->pprev);
+ BUG();
+ }
+ if (unlikely(n->next != NULL && n->next->pprev != &n->next)) {
+ printk(KERN_ERR "hlist corruption. n->next->pprev should be"
+ "%p, but was %p\n", &n->next, n->next->pprev);
+ BUG();
+ }
+}
+EXPORT_SYMBOL(hlist_check);
--
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours. We can't possibly take such
a retrograde step."
next reply other threads:[~2008-05-02 18:28 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-02 18:27 Matthew Wilcox [this message]
2008-05-01 20:32 ` [PATCH] Extend list debugging to cover hlists Arjan van de Ven
2008-05-02 18:49 ` Matthew Wilcox
2008-05-02 19:05 ` Dave Jones
2008-05-20 3:24 ` [PATCH] Make Dave Jones
2008-05-20 14:14 ` Arjan van de Ven
2008-05-20 14:27 ` Dave Jones
2008-05-20 14:54 ` Linus Torvalds
2008-05-20 15:20 ` Dave Jones
2008-05-20 16:15 ` Arjan van de Ven
2008-05-20 15:00 ` Alexey Dobriyan
2008-05-20 15:12 ` Linus Torvalds
2008-05-20 15:22 ` Dave Jones
2008-05-20 21:52 ` [PATCH] Make (LIST_DEBUG WARN not BUG) Alexey Dobriyan
2008-05-02 23:14 ` [PATCH] Extend list debugging to cover hlists Andrew Morton
2008-05-02 23:17 ` Matthew Wilcox
2008-05-02 23:39 ` Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080502182745.GL14976@parisc-linux.org \
--to=matthew@wil.cx \
--cc=akpm@osdl.org \
--cc=davej@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox