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__)