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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> Cc: Ben Greear <[EMAIL PROTECTED]> --- 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 - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html