Module Name:    src
Committed By:   ozaki-r
Date:           Tue May 16 02:59:22 UTC 2017

Modified Files:
        src/sys/netipsec: key.c key.h

Log Message:
Run key_timehandler in thread context (workqueue)

The handler involves object deallocations so we want to not run
it in softint.


To generate a diff of this commit:
cvs rdiff -u -r1.125 -r1.126 src/sys/netipsec/key.c
cvs rdiff -u -r1.15 -r1.16 src/sys/netipsec/key.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/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.125 src/sys/netipsec/key.c:1.126
--- src/sys/netipsec/key.c:1.125	Mon May 15 09:55:29 2017
+++ src/sys/netipsec/key.c	Tue May 16 02:59:22 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.125 2017/05/15 09:55:29 ozaki-r Exp $	*/
+/*	$NetBSD: key.c,v 1.126 2017/05/16 02:59:22 ozaki-r Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.125 2017/05/15 09:55:29 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.126 2017/05/16 02:59:22 ozaki-r Exp $");
 
 /*
  * This code is referd to RFC 2367
@@ -64,6 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: key.c,v 1.12
 #include <sys/cprng.h>
 #include <sys/psref.h>
 #include <sys/lwp.h>
+#include <sys/workqueue.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -533,7 +534,12 @@ static inline void key_sp_dead (struct s
 static void key_sp_unlink (struct secpolicy *sp);
 
 static struct mbuf *key_alloc_mbuf (int);
-struct callout key_timehandler_ch;
+
+static void key_timehandler(void *);
+static void key_timehandler_work(struct work *, void *);
+static struct callout	key_timehandler_ch;
+static struct workqueue	*key_timehandler_wq;
+static struct work	key_timehandler_wk;
 
 #ifdef IPSEC_REF_DEBUG
 #define REFLOG(label, p, where, tag)					\
@@ -4548,14 +4554,14 @@ key_bbcmp(const void *a1, const void *a2
  * scanning SPD and SAD to check status for each entries,
  * and do to remove or to expire.
  */
-void
-key_timehandler(void* arg)
+static void
+key_timehandler_work(struct work *wk, void *arg)
 {
 	u_int dir;
 	int s;
 	time_t now = time_uptime;
 
-	s = splsoftnet();	/*called from softclock()*/
+	s = splsoftnet();
 	mutex_enter(softnet_lock);
 
 	/* SPD */
@@ -4764,6 +4770,13 @@ key_timehandler(void* arg)
 	return;
 }
 
+static void
+key_timehandler(void *arg)
+{
+
+	workqueue_enqueue(key_timehandler_wq, &key_timehandler_wk, NULL);
+}
+
 u_long
 key_random(void)
 {
@@ -7696,11 +7709,15 @@ key_validate_ext(const struct sadb_ext *
 static int
 key_do_init(void)
 {
-	int i;
+	int i, error;
 
 	pfkeystat_percpu = percpu_alloc(sizeof(uint64_t) * PFKEY_NSTATS);
 
 	callout_init(&key_timehandler_ch, 0);
+	error = workqueue_create(&key_timehandler_wq, "key_timehandler",
+	    key_timehandler_work, NULL, PRI_SOFTNET, IPL_SOFTNET, WQ_MPSAFE);
+	if (error != 0)
+		panic("%s: workqueue_create failed (%d)\n", __func__, error);
 
 	for (i = 0; i < IPSEC_DIR_MAX; i++) {
 		LIST_INIT(&sptree[i]);

Index: src/sys/netipsec/key.h
diff -u src/sys/netipsec/key.h:1.15 src/sys/netipsec/key.h:1.16
--- src/sys/netipsec/key.h:1.15	Mon May 15 09:55:29 2017
+++ src/sys/netipsec/key.h	Tue May 16 02:59:22 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.h,v 1.15 2017/05/15 09:55:29 ozaki-r Exp $	*/
+/*	$NetBSD: key.h,v 1.16 2017/05/16 02:59:22 ozaki-r Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/key.h,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$KAME: key.h,v 1.21 2001/07/27 03:51:30 itojun Exp $	*/
 
@@ -96,7 +96,6 @@ int key_ismyaddr (const struct sockaddr 
 int key_cmpspidx_exactly (const struct secpolicyindex *, const struct secpolicyindex *);
 int key_cmpspidx_withmask (const struct secpolicyindex *, const struct secpolicyindex *);
 int key_spdacquire (const struct secpolicy *);
-void key_timehandler (void*);
 u_long key_random (void);
 void key_randomfill (void *, size_t);
 void key_freereg (struct socket *);

Reply via email to