Module Name:    src
Committed By:   ozaki-r
Date:           Fri Mar 23 04:09:41 UTC 2018

Modified Files:
        src/sys/net: route.c

Log Message:
Don't take RT_LOCK in DDB

It definitely causes a diagnostic failure if LOCKDEBUG is enabled.


To generate a diff of this commit:
cvs rdiff -u -r1.206 -r1.207 src/sys/net/route.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/route.c
diff -u src/sys/net/route.c:1.206 src/sys/net/route.c:1.207
--- src/sys/net/route.c:1.206	Tue Jan 30 11:01:04 2018
+++ src/sys/net/route.c	Fri Mar 23 04:09:41 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.206 2018/01/30 11:01:04 ozaki-r Exp $	*/
+/*	$NetBSD: route.c,v 1.207 2018/03/23 04:09:41 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.206 2018/01/30 11:01:04 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.207 2018/03/23 04:09:41 ozaki-r Exp $");
 
 #include <sys/param.h>
 #ifdef RTFLUSH_DEBUG
@@ -2147,13 +2147,21 @@ rt_delete_matched_entries(sa_family_t fa
 	}
 }
 
+static int
+rt_walktree_locked(sa_family_t family, int (*f)(struct rtentry *, void *),
+    void *v)
+{
+
+	return rtbl_walktree(family, f, v);
+}
+
 int
 rt_walktree(sa_family_t family, int (*f)(struct rtentry *, void *), void *v)
 {
 	int error;
 
 	RT_RLOCK();
-	error = rtbl_walktree(family, f, v);
+	error = rt_walktree_locked(family, f, v);
 	RT_UNLOCK();
 
 	return error;
@@ -2246,6 +2254,8 @@ void
 db_show_routes(db_expr_t addr, bool have_addr,
     db_expr_t count, const char *modif)
 {
-	rt_walktree(AF_INET, db_show_rtentry, NULL);
+
+	/* Taking RT_LOCK will fail if LOCKDEBUG is enabled. */
+	rt_walktree_locked(AF_INET, db_show_rtentry, NULL);
 }
 #endif

Reply via email to