From: Jarek Poplawski <jarkao2@o2.pl>
To: Ben Greear <greearb@candelatech.com>
Cc: Stephen Hemminger <shemminger@linux-foundation.org>,
Francois Romieu <romieu@fr.zoreil.com>,
netdev@vger.kernel.org, Kyle Lucke <klucke@us.ibm.com>,
Raghavendra Koushik <raghavendra.koushik@neterion.com>,
Al Viro <viro@ftp.linux.org.uk>
Subject: [PATCH v.2] RTNL and flush_scheduled_work deadlocks
Date: Mon, 5 Mar 2007 09:36:11 +0100 [thread overview]
Message-ID: <20070305083611.GA2124@ff.dom.local> (raw)
In-Reply-To: <45D94347.8060405@candelatech.com>
On Sun, Feb 18, 2007 at 10:27:19PM -0800, Ben Greear wrote:
> Jarek Poplawski wrote:
> >On Fri, Feb 16, 2007 at 11:04:02AM -0800, Ben Greear wrote:
...
> >>>On Thu, 15 Feb 2007 23:40:32 -0800
> >>>Ben Greear <greearb@candelatech.com> wrote:
> >>>
> >>>>Maybe there should be something like an ASSERT_NOT_RTNL() in the
> >>>>flush_scheduled_work()
> >>>>method? If it's performance criticial, #ifdef it out if we're not
> >>>>debugging locks?
...
> For performance reasons, I'd leave the rtnl_owner inside the
> #if debugging locking code....
>
> You are also changing the semantics of ASSERT_RTNL (assert *this thread*
> has rtnl, from the
> old behaviour: assert *some thread* has rtnl). It may be better this
> way, but it could break code that assumes the old behaviour.
>
> Ben
Hi,
I'm not sure anybody is interested yet, but I think it's
a good idea so here is a reworked proposal.
Jarek P.
===
[NET] DEBUG_ASSERT_RTNL and DEBUG_ASSERT_NOT_RTNL macros
Debug RTNL macros usable with CONFIG_DEBUG_MUTEXES on.
Based on suggestions of Ben Greear (to help debugging
flush_schedule_work).
Signed-off-by: Jarek Poplawski <jarkao2@o2.pl>
Cc: Ben Greear <greearb@candelatech.com>
---
include/linux/rtnetlink.h | 27 +++++++++++++++++++++++++++
net/core/rtnetlink.c | 10 ++++++++++
2 files changed, 37 insertions(+)
diff -Nurp linux-2.6.21-rc2-git2-/include/linux/rtnetlink.h linux-2.6.21-rc2-git2/include/linux/rtnetlink.h
--- linux-2.6.21-rc2-git2-/include/linux/rtnetlink.h 2007-02-04 19:44:54.000000000 +0100
+++ linux-2.6.21-rc2-git2/include/linux/rtnetlink.h 2007-03-04 14:47:00.000000000 +0100
@@ -728,6 +728,33 @@ rtattr_failure:
return table;
}
+#ifdef CONFIG_DEBUG_MUTEXES
+extern int debug_rtnl_assert(void);
+
+#define DEBUG_ASSERT_RTNL() do { \
+ if (unlikely(!debug_rtnl_assert())) { \
+ printk(KERN_ERR "DEBUG RTNL:" \
+ " assertion failed at %s (%d)\n", \
+ __FILE__, __LINE__); \
+ dump_stack(); \
+ } \
+} while(0)
+
+#define DEBUG_ASSERT_NOT_RTNL() do { \
+ if (unlikely(debug_rtnl_assert())) { \
+ printk(KERN_ERR "DEBUG NOT RTNL:" \
+ " assertion failed at %s (%d)\n", \
+ __FILE__, __LINE__); \
+ dump_stack(); \
+ } \
+} while(0)
+
+#else
+/* debug_rtnl_assert() invalid here */
+#define DEBUG_ASSERT_RTNL()
+#define DEBUG_ASSERT_NOT_RTNL()
+#endif /* CONFIG_DEBUG_MUTEXES */
+
#endif /* __KERNEL__ */
diff -Nurp linux-2.6.21-rc2-git2-/net/core/rtnetlink.c linux-2.6.21-rc2-git2/net/core/rtnetlink.c
--- linux-2.6.21-rc2-git2-/net/core/rtnetlink.c 2007-02-21 19:46:47.000000000 +0100
+++ linux-2.6.21-rc2-git2/net/core/rtnetlink.c 2007-03-04 15:23:34.000000000 +0100
@@ -82,6 +82,13 @@ int rtnl_trylock(void)
return mutex_trylock(&rtnl_mutex);
}
+#ifdef CONFIG_DEBUG_MUTEXES
+int debug_rtnl_assert(void)
+{
+ return (rtnl_mutex.owner == current_thread_info());
+}
+#endif
+
int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len)
{
memset(tb, 0, sizeof(struct rtattr*)*maxattr);
@@ -893,3 +900,6 @@ EXPORT_SYMBOL(rtnl_unlock);
EXPORT_SYMBOL(rtnl_unicast);
EXPORT_SYMBOL(rtnl_notify);
EXPORT_SYMBOL(rtnl_set_sk_err);
+#ifdef CONFIG_DEBUG_MUTEXES
+EXPORT_SYMBOL(debug_rtnl_assert);
+#endif
next prev parent reply other threads:[~2007-03-05 8:32 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-14 21:27 [BUG] RTNL and flush_scheduled_work deadlocks Stephen Hemminger
2007-02-14 21:44 ` Ben Greear
2007-02-14 23:54 ` Francois Romieu
2007-02-15 18:58 ` Ben Greear
2007-02-15 22:37 ` [PATCH 1/4] r8169: RTNL and flush_scheduled_work deadlock Francois Romieu
2007-02-20 16:18 ` Jeff Garzik
2007-02-15 22:37 ` [PATCH 2/4] sis190: " Francois Romieu
2007-02-15 22:37 ` [PATCH 3/4] 8139too: " Francois Romieu
2007-02-16 7:59 ` Jarek Poplawski
2007-02-16 20:20 ` Francois Romieu
2007-02-16 20:36 ` Stephen Hemminger
2007-02-17 20:54 ` Francois Romieu
2007-02-19 12:05 ` Jarek Poplawski
2007-02-19 21:08 ` Francois Romieu
2007-04-04 23:38 ` Ben Greear
2007-04-05 11:17 ` Francois Romieu
2007-02-15 22:37 ` [PATCH 4/4] s2io: " Francois Romieu
2007-02-16 7:29 ` [BUG] RTNL and flush_scheduled_work deadlocks Jarek Poplawski
2007-02-16 7:40 ` Ben Greear
2007-02-16 8:10 ` Jarek Poplawski
2007-02-16 8:23 ` Ben Greear
2007-02-16 9:04 ` Jarek Poplawski
2007-02-16 12:12 ` Jarek Poplawski
2007-02-16 16:06 ` Ben Greear
2007-02-20 8:23 ` Jarek Poplawski
2007-02-16 18:31 ` Stephen Hemminger
2007-02-16 19:04 ` Ben Greear
2007-02-19 6:13 ` [PATCH 1/2] " Jarek Poplawski
2007-02-19 6:27 ` Ben Greear
2007-02-19 7:11 ` Jarek Poplawski
2007-02-19 7:40 ` Jarek Poplawski
2007-03-05 8:36 ` Jarek Poplawski [this message]
2007-02-19 6:55 ` [PATCH 2/2] " Jarek Poplawski
2007-02-19 7:18 ` Jarek Poplawski
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=20070305083611.GA2124@ff.dom.local \
--to=jarkao2@o2.pl \
--cc=greearb@candelatech.com \
--cc=klucke@us.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=raghavendra.koushik@neterion.com \
--cc=romieu@fr.zoreil.com \
--cc=shemminger@linux-foundation.org \
--cc=viro@ftp.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.