Module Name:    src
Committed By:   christos
Date:           Tue Jan  9 19:52:29 UTC 2018

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

Log Message:
Use a queue of deferred entries to delete routes instead of a fixed stack
of 10. Otherwise we can overflow in route deletions from the rexmit timer.
XXX: pullup-8


To generate a diff of this commit:
cvs rdiff -u -r1.202 -r1.203 src/sys/net/route.c
cvs rdiff -u -r1.116 -r1.117 src/sys/net/route.h
cvs rdiff -u -r1.556 -r1.557 src/sys/sys/param.h

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.202 src/sys/net/route.c:1.203
--- src/sys/net/route.c:1.202	Thu Jan  4 20:53:15 2018
+++ src/sys/net/route.c	Tue Jan  9 14:52:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.202 2018/01/05 01:53:15 christos Exp $	*/
+/*	$NetBSD: route.c,v 1.203 2018/01/09 19:52:29 christos 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.202 2018/01/05 01:53:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.203 2018/01/09 19:52:29 christos Exp $");
 
 #include <sys/param.h>
 #ifdef RTFLUSH_DEBUG
@@ -255,7 +255,7 @@ static struct {
 	struct workqueue	*wq;
 	struct work		wk;
 	kmutex_t		lock;
-	struct rtentry		*queue[10];
+	SLIST_HEAD(, rtentry)	queue;
 } rt_free_global __cacheline_aligned;
 
 /* psref for rtentry */
@@ -458,6 +458,8 @@ rt_init(void)
 #endif
 
 	mutex_init(&rt_free_global.lock, MUTEX_DEFAULT, IPL_SOFTNET);
+	SLIST_INIT(&rt_free_global.queue);
+
 	rt_psref_class = psref_class_create("rtentry", IPL_SOFTNET);
 
 	error = workqueue_create(&rt_free_global.wq, "rt_free",
@@ -687,20 +689,19 @@ static void
 rt_free_work(struct work *wk, void *arg)
 {
 
-restart:
-	mutex_enter(&rt_free_global.lock);
-	for (size_t i = 0; i < __arraycount(rt_free_global.queue); i++) {
-		if (rt_free_global.queue[i] == NULL)
-			continue;
-		struct rtentry *rt = rt_free_global.queue[i];
-		rt_free_global.queue[i] = NULL;
-		mutex_exit(&rt_free_global.lock);
+	for (;;) {
+		struct rtentry *rt;
 
+		mutex_enter(&rt_free_global.lock);
+		if ((rt = SLIST_FIRST(&rt_free_global.queue)) == NULL) {
+			mutex_exit(&rt_free_global.lock);
+			return;
+		}
+		SLIST_REMOVE_HEAD(&rt_free_global.queue, rt_free);
+		mutex_exit(&rt_free_global.lock);
 		atomic_dec_uint(&rt->rt_refcnt);
 		_rt_free(rt);
-		goto restart;
 	}
-	mutex_exit(&rt_free_global.lock);
 }
 
 void
@@ -714,16 +715,9 @@ rt_free(struct rtentry *rt)
 		return;
 	}
 
-	size_t i;
 	mutex_enter(&rt_free_global.lock);
-	for (i = 0; i < __arraycount(rt_free_global.queue); i++) {
-		if (rt_free_global.queue[i] == NULL)
-			break;
-	}
-
-	KASSERT(i < __arraycount(rt_free_global.queue));
-	rt_free_global.queue[i] = rt;
 	rt_ref(rt);
+	SLIST_INSERT_HEAD(&rt_free_global.queue, rt, rt_free);
 	mutex_exit(&rt_free_global.lock);
 	workqueue_enqueue(rt_free_global.wq, &rt_free_global.wk, NULL);
 }

Index: src/sys/net/route.h
diff -u src/sys/net/route.h:1.116 src/sys/net/route.h:1.117
--- src/sys/net/route.h:1.116	Sun Dec 17 23:11:13 2017
+++ src/sys/net/route.h	Tue Jan  9 14:52:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.h,v 1.116 2017/12/18 04:11:13 ozaki-r Exp $	*/
+/*	$NetBSD: route.h,v 1.117 2018/01/09 19:52:29 christos Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -124,7 +124,8 @@ struct rtentry {
 	struct	sockaddr *rt_tag;	/* route tagging info */
 #ifdef _KERNEL
 	kcondvar_t rt_cv;
-	struct psref_target	rt_psref;
+	struct psref_target rt_psref;
+	SLIST_ENTRY(rtentry) rt_free;	/* queue of deferred frees */
 #endif
 };
 

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.556 src/sys/sys/param.h:1.557
--- src/sys/sys/param.h:1.556	Wed Jan  3 20:42:25 2018
+++ src/sys/sys/param.h	Tue Jan  9 14:52:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.556 2018/01/04 01:42:25 christos Exp $	*/
+/*	$NetBSD: param.h,v 1.557 2018/01/09 19:52:29 christos Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -67,7 +67,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	899001100	/* NetBSD 8.99.11 */
+#define	__NetBSD_Version__	899001200	/* NetBSD 8.99.12 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Reply via email to