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 *);