Module Name:    src
Committed By:   ozaki-r
Date:           Wed Jul 26 09:18:15 UTC 2017

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

Log Message:
Use pslist(9) for sptree


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/netipsec/ipsec.h
cvs rdiff -u -r1.193 -r1.194 src/sys/netipsec/key.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/netipsec/ipsec.h
diff -u src/sys/netipsec/ipsec.h:1.56 src/sys/netipsec/ipsec.h:1.57
--- src/sys/netipsec/ipsec.h:1.56	Fri Jul 21 04:55:36 2017
+++ src/sys/netipsec/ipsec.h	Wed Jul 26 09:18:15 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.h,v 1.56 2017/07/21 04:55:36 ozaki-r Exp $	*/
+/*	$NetBSD: ipsec.h,v 1.57 2017/07/26 09:18:15 ozaki-r Exp $	*/
 /*	$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.h,v 1.2.4.2 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: ipsec.h,v 1.53 2001/11/20 08:32:38 itojun Exp $	*/
 
@@ -74,7 +74,7 @@ struct secpolicyindex {
 
 /* Security Policy Data Base */
 struct secpolicy {
-	LIST_ENTRY(secpolicy) chain;
+	struct pslist_entry pslist_entry;
 
 	u_int refcnt;			/* reference count */
 	struct secpolicyindex spidx;	/* selector */

Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.193 src/sys/netipsec/key.c:1.194
--- src/sys/netipsec/key.c:1.193	Wed Jul 26 03:59:59 2017
+++ src/sys/netipsec/key.c	Wed Jul 26 09:18:15 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.193 2017/07/26 03:59:59 ozaki-r Exp $	*/
+/*	$NetBSD: key.c,v 1.194 2017/07/26 09:18:15 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.193 2017/07/26 03:59:59 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.194 2017/07/26 09:18:15 ozaki-r Exp $");
 
 /*
  * This code is referd to RFC 2367
@@ -66,6 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: key.c,v 1.19
 #include <sys/kmem.h>
 #include <sys/cpu.h>
 #include <sys/atomic.h>
+#include <sys/pslist.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -142,7 +143,7 @@ static int key_prefered_oldsa = 0;	/* pr
 
 static u_int32_t acq_seq = 0;
 
-static LIST_HEAD(_sptree, secpolicy) sptree[IPSEC_DIR_MAX];	/* SPD */
+static struct pslist_head sptree[IPSEC_DIR_MAX];		/* SPD */
 static LIST_HEAD(_sahtree, secashead) sahtree;			/* SAD */
 static LIST_HEAD(_regtree, secreg) regtree[SADB_SATYPE_MAX + 1];
 							/* registed list */
@@ -153,6 +154,46 @@ static LIST_HEAD(_acqtree, secacq) acqtr
 static LIST_HEAD(_spacqtree, secspacq) spacqtree;	/* SP acquiring list */
 #endif
 
+#define SPLIST_ENTRY_INIT(sp)						\
+	PSLIST_ENTRY_INIT((sp), pslist_entry)
+#define SPLIST_ENTRY_DESTROY(sp)					\
+	PSLIST_ENTRY_DESTROY((sp), pslist_entry)
+#define SPLIST_WRITER_REMOVE(sp)					\
+	PSLIST_WRITER_REMOVE((sp), pslist_entry)
+#define SPLIST_READER_EMPTY(dir)					\
+	(PSLIST_READER_FIRST(&sptree[(dir)], struct secpolicy,		\
+	                     pslist_entry) == NULL)
+#define SPLIST_READER_FOREACH(sp, dir)					\
+	PSLIST_READER_FOREACH((sp), &sptree[(dir)], struct secpolicy,	\
+	                      pslist_entry)
+#define SPLIST_WRITER_FOREACH(sp, dir)					\
+	PSLIST_WRITER_FOREACH((sp), &sptree[(dir)], struct secpolicy,	\
+	                      pslist_entry)
+#define SPLIST_WRITER_INSERT_AFTER(sp, new)				\
+	PSLIST_WRITER_INSERT_AFTER((sp), (new), pslist_entry)
+#define SPLIST_WRITER_EMPTY(dir)					\
+	(PSLIST_WRITER_FIRST(&sptree[(dir)], struct secpolicy,		\
+	                     pslist_entry) == NULL)
+#define SPLIST_WRITER_INSERT_HEAD(dir, sp)				\
+	PSLIST_WRITER_INSERT_HEAD(&sptree[(dir)], (sp), pslist_entry)
+#define SPLIST_WRITER_NEXT(sp)						\
+	PSLIST_WRITER_NEXT((sp), struct secpolicy, pslist_entry)
+#define SPLIST_WRITER_INSERT_TAIL(dir, new)				\
+	do {								\
+		if (SPLIST_WRITER_EMPTY((dir))) {			\
+			SPLIST_WRITER_INSERT_HEAD((dir), (new));	\
+		} else {						\
+			struct secpolicy *__sp;				\
+			SPLIST_WRITER_FOREACH(__sp, (dir)) {		\
+				if (SPLIST_WRITER_NEXT(__sp) == NULL) {	\
+					SPLIST_WRITER_INSERT_AFTER(__sp,\
+					    (new));			\
+					break;				\
+				}					\
+			}						\
+		}							\
+	} while (0)
+
 /*
  * Protect regtree, acqtree and items stored in the lists.
  */
@@ -625,8 +666,7 @@ key_sp_unlink(struct secpolicy *sp)
 {
 
 	/* remove from SP index */
-	KASSERT(__LIST_CHAINED(sp));
-	LIST_REMOVE(sp, chain);
+	SPLIST_WRITER_REMOVE(sp);
 	/* Release refcount held just for being on chain */
 	KEY_FREESP(&sp);
 }
@@ -641,7 +681,7 @@ int
 key_havesp(u_int dir)
 {
 	return (dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND ?
-		!LIST_EMPTY(&sptree[dir]) : 1);
+		!SPLIST_READER_EMPTY(dir) : 1);
 }
 
 /* %%% IPsec policy management */
@@ -670,7 +710,7 @@ key_lookup_sp_byspidx(const struct secpo
 		kdebug_secpolicyindex(spidx);
 	}
 
-	LIST_FOREACH(sp, &sptree[dir], chain) {
+	SPLIST_READER_FOREACH(sp, dir) {
 		if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DATA)) {
 			printf("*** in SPD\n");
 			kdebug_secpolicyindex(&sp->spidx);
@@ -726,7 +766,7 @@ key_gettunnel(const struct sockaddr *osr
 	}
 
 	s = splsoftnet();	/*called from softclock()*/
-	LIST_FOREACH(sp, &sptree[dir], chain) {
+	SPLIST_READER_FOREACH(sp, dir) {
 		if (sp->state == IPSEC_SPSTATE_DEAD)
 			continue;
 
@@ -1292,6 +1332,7 @@ key_delsp(struct secpolicy *sp)
 	}
     }
 
+	SPLIST_ENTRY_DESTROY(sp);
 	kmem_intr_free(sp, sizeof(*sp));
 
 	splx(s);
@@ -1309,7 +1350,7 @@ key_getsp(const struct secpolicyindex *s
 
 	KASSERT(spidx != NULL);
 
-	LIST_FOREACH(sp, &sptree[spidx->dir], chain) {
+	SPLIST_READER_FOREACH(sp, spidx->dir) {
 		if (sp->state == IPSEC_SPSTATE_DEAD)
 			continue;
 		if (key_spidx_match_exactly(spidx, &sp->spidx)) {
@@ -1331,7 +1372,7 @@ key_getspbyid(u_int32_t id)
 {
 	struct secpolicy *sp;
 
-	LIST_FOREACH(sp, &sptree[IPSEC_DIR_INBOUND], chain) {
+	SPLIST_READER_FOREACH(sp, IPSEC_DIR_INBOUND) {
 		if (sp->state == IPSEC_SPSTATE_DEAD)
 			continue;
 		if (sp->id == id) {
@@ -1340,7 +1381,7 @@ key_getspbyid(u_int32_t id)
 		}
 	}
 
-	LIST_FOREACH(sp, &sptree[IPSEC_DIR_OUTBOUND], chain) {
+	SPLIST_READER_FOREACH(sp, IPSEC_DIR_OUTBOUND) {
 		if (sp->state == IPSEC_SPSTATE_DEAD)
 			continue;
 		if (sp->id == id) {
@@ -1854,7 +1895,8 @@ key_api_spdadd(struct socket *so, struct
 	newsp->state = IPSEC_SPSTATE_ALIVE;
 	if (newsp->policy == IPSEC_POLICY_IPSEC)
 		KASSERT(newsp->req != NULL);
-	LIST_INSERT_TAIL(&sptree[newsp->spidx.dir], newsp, secpolicy, chain);
+	SPLIST_ENTRY_INIT(newsp);
+	SPLIST_WRITER_INSERT_TAIL(newsp->spidx.dir, newsp);
 
 #ifdef notyet
 	/* delete the entry in spacqtree */
@@ -2274,14 +2316,13 @@ key_api_spdflush(struct socket *so, stru
 		return key_senderror(so, m, EINVAL);
 
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		struct secpolicy * nextsp;
-		LIST_FOREACH_SAFE(sp, &sptree[dir], chain, nextsp) {
+	    retry:
+		SPLIST_WRITER_FOREACH(sp, dir) {
 			if (sp->state == IPSEC_SPSTATE_DEAD)
 				continue;
 			key_sp_dead(sp);
 			key_sp_unlink(sp);
-			/* 'sp' dead; continue transfers to 'sp = nextsp' */
-			continue;
+			goto retry;
 		}
 	}
 
@@ -2325,7 +2366,7 @@ key_setspddump_chain(int *errorp, int *l
 	/* search SPD entry and get buffer size. */
 	cnt = 0;
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		LIST_FOREACH(sp, &sptree[dir], chain) {
+		SPLIST_READER_FOREACH(sp, dir) {
 			cnt++;
 		}
 	}
@@ -2339,7 +2380,7 @@ key_setspddump_chain(int *errorp, int *l
 	prev = m;
 	totlen = 0;
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		LIST_FOREACH(sp, &sptree[dir], chain) {
+		SPLIST_READER_FOREACH(sp, dir) {
 			--cnt;
 			n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt, pid);
 
@@ -4296,17 +4337,14 @@ static void
 key_timehandler_spd(time_t now)
 {
 	u_int dir;
-	struct secpolicy *sp, *nextsp;
+	struct secpolicy *sp;
 
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		LIST_FOREACH_SAFE(sp, &sptree[dir], chain, nextsp) {
+	    retry:
+		SPLIST_WRITER_FOREACH(sp, dir) {
 			if (sp->state == IPSEC_SPSTATE_DEAD) {
 				key_sp_unlink(sp);	/*XXX*/
-
-				/* 'sp' dead; continue transfers to
-				 * 'sp = nextsp'
-				 */
-				continue;
+				goto retry;
 			}
 
 			if (sp->lifetime == 0 && sp->validtime == 0)
@@ -4317,7 +4355,7 @@ key_timehandler_spd(time_t now)
 			    (sp->validtime && now - sp->lastused > sp->validtime)) {
 			  	key_sp_dead(sp);
 				key_spdexpire(sp);
-				continue;
+				goto retry;
 			}
 		}
 	}
@@ -7511,7 +7549,7 @@ key_do_init(void)
 		panic("%s: workqueue_create failed (%d)\n", __func__, error);
 
 	for (i = 0; i < IPSEC_DIR_MAX; i++) {
-		LIST_INIT(&sptree[i]);
+		PSLIST_INIT(&sptree[i]);
 	}
 
 	LIST_INIT(&sahtree);
@@ -7874,7 +7912,7 @@ key_setspddump(int *errorp, pid_t pid)
 	/* search SPD entry and get buffer size. */
 	cnt = 0;
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		LIST_FOREACH(sp, &sptree[dir], chain) {
+		SPLIST_READER_FOREACH(sp, dir) {
 			cnt++;
 		}
 	}
@@ -7886,7 +7924,7 @@ key_setspddump(int *errorp, pid_t pid)
 
 	m = NULL;
 	for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
-		LIST_FOREACH(sp, &sptree[dir], chain) {
+		SPLIST_READER_FOREACH(sp, dir) {
 			--cnt;
 			n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt, pid);
 
@@ -7910,8 +7948,8 @@ key_setspddump(int *errorp, pid_t pid)
 
 int
 key_get_used(void) {
-	return !LIST_EMPTY(&sptree[IPSEC_DIR_INBOUND]) ||
-	    !LIST_EMPTY(&sptree[IPSEC_DIR_OUTBOUND]);
+	return !SPLIST_READER_EMPTY(IPSEC_DIR_INBOUND) ||
+	    !SPLIST_READER_EMPTY(IPSEC_DIR_OUTBOUND);
 }
 
 void

Reply via email to