Module Name: src Committed By: ozaki-r Date: Tue May 16 03:05:28 UTC 2017
Modified Files: src/sys/netipsec: ipsec.c key.c keysock.c Log Message: Use kmem(9) instead of malloc/free Some of non-sleepable allocations can be replaced with sleepable ones. To make it clear that the replacements are possible, some assertions are addded. To generate a diff of this commit: cvs rdiff -u -r1.89 -r1.90 src/sys/netipsec/ipsec.c cvs rdiff -u -r1.126 -r1.127 src/sys/netipsec/key.c cvs rdiff -u -r1.54 -r1.55 src/sys/netipsec/keysock.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.c diff -u src/sys/netipsec/ipsec.c:1.89 src/sys/netipsec/ipsec.c:1.90 --- src/sys/netipsec/ipsec.c:1.89 Mon May 15 09:55:29 2017 +++ src/sys/netipsec/ipsec.c Tue May 16 03:05:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ipsec.c,v 1.89 2017/05/15 09:55:29 ozaki-r Exp $ */ +/* $NetBSD: ipsec.c,v 1.90 2017/05/16 03:05:28 ozaki-r Exp $ */ /* $FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.c,v 1.2.2.2 2003/07/01 01:38:13 sam Exp $ */ /* $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.89 2017/05/15 09:55:29 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.90 2017/05/16 03:05:28 ozaki-r Exp $"); /* * IPsec controller part. @@ -45,7 +45,6 @@ __KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1. #include <sys/param.h> #include <sys/systm.h> -#include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/domain.h> #include <sys/protosw.h> @@ -58,6 +57,8 @@ __KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1. #include <sys/sysctl.h> #include <sys/proc.h> #include <sys/kauth.h> +#include <sys/cpu.h> +#include <sys/kmem.h> #include <net/if.h> #include <net/route.h> @@ -1263,7 +1264,8 @@ ipsec6_setspidx_ipaddr(struct mbuf *m, s static void ipsec_delpcbpolicy(struct inpcbpolicy *p) { - free(p, M_SECA); + + kmem_free(p, sizeof(*p)); } /* initialize policy in PCB */ @@ -1272,14 +1274,11 @@ ipsec_init_policy(struct socket *so, str { struct inpcbpolicy *new; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); KASSERT(policy != NULL); - new = malloc(sizeof(*new), M_SECA, M_NOWAIT|M_ZERO); - if (new == NULL) { - ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); - return ENOBUFS; - } + new = kmem_zalloc(sizeof(*new), KM_SLEEP); if (IPSEC_PRIVILEGED_SO(so)) new->priv = 1; @@ -1353,7 +1352,7 @@ ipsec_deepcopy_policy(const struct secpo */ q = &newchain; for (p = src->req; p; p = p->next) { - *q = malloc(sizeof(**q), M_SECA, M_NOWAIT|M_ZERO); + *q = kmem_zalloc(sizeof(**q), KM_SLEEP); if (*q == NULL) goto fail; (*q)->next = NULL; @@ -1382,7 +1381,7 @@ ipsec_deepcopy_policy(const struct secpo fail: for (q = &newchain; *q; q = &r) { r = (*q)->next; - free(*q, M_SECA); + kmem_free(*q, sizeof(**q)); } return NULL; } @@ -1401,6 +1400,8 @@ ipsec_set_policy( struct secpolicy *newsp = NULL; int error; + KASSERT(!cpu_softintr_p()); + /* sanity check. */ if (policy == NULL || *policy == NULL || request == NULL) return EINVAL; @@ -1474,6 +1475,8 @@ ipsec4_set_policy(struct inpcb *inp, int const struct sadb_x_policy *xpl; struct secpolicy **policy; + KASSERT(!cpu_softintr_p()); + /* sanity check. */ if (inp == NULL || request == NULL) return EINVAL; @@ -1564,6 +1567,8 @@ ipsec6_set_policy(struct in6pcb *in6p, i const struct sadb_x_policy *xpl; struct secpolicy **policy; + KASSERT(!cpu_softintr_p()); + /* sanity check. */ if (in6p == NULL || request == NULL) return EINVAL; Index: src/sys/netipsec/key.c diff -u src/sys/netipsec/key.c:1.126 src/sys/netipsec/key.c:1.127 --- src/sys/netipsec/key.c:1.126 Tue May 16 02:59:22 2017 +++ src/sys/netipsec/key.c Tue May 16 03:05:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: key.c,v 1.126 2017/05/16 02:59:22 ozaki-r Exp $ */ +/* $NetBSD: key.c,v 1.127 2017/05/16 03:05:28 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.126 2017/05/16 02:59:22 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.127 2017/05/16 03:05:28 ozaki-r Exp $"); /* * This code is referd to RFC 2367 @@ -65,6 +65,8 @@ __KERNEL_RCSID(0, "$NetBSD: key.c,v 1.12 #include <sys/psref.h> #include <sys/lwp.h> #include <sys/workqueue.h> +#include <sys/kmem.h> +#include <sys/cpu.h> #include <net/if.h> #include <net/route.h> @@ -1387,12 +1389,12 @@ key_delsp(struct secpolicy *sp) } nextisr = isr->next; - KFREE(isr); + kmem_intr_free(isr, sizeof(*isr)); isr = nextisr; } } - KFREE(sp); + kmem_intr_free(sp, sizeof(*sp)); splx(s); } @@ -1457,12 +1459,8 @@ key_newsp(const char* where, int tag) { struct secpolicy *newsp = NULL; - newsp = (struct secpolicy *) - malloc(sizeof(struct secpolicy), M_SECA, M_NOWAIT|M_ZERO); - if (newsp) { - newsp->refcnt = 1; - newsp->req = NULL; - } + newsp = kmem_zalloc(sizeof(struct secpolicy), KM_SLEEP); + newsp->refcnt = 1; KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP from %s:%u return SP:%p\n", where, tag, newsp); @@ -1479,6 +1477,7 @@ key_msg2sp(const struct sadb_x_policy *x { struct secpolicy *newsp; + KASSERT(!cpu_softintr_p()); KASSERT(xpl0 != NULL); KASSERT(len >= sizeof(*xpl0)); @@ -1544,13 +1543,7 @@ key_msg2sp(const struct sadb_x_policy *x } /* allocate request buffer */ - KMALLOC(*p_isr, struct ipsecrequest *, sizeof(**p_isr)); - if ((*p_isr) == NULL) { - ipseclog((LOG_DEBUG, - "key_msg2sp: No more memory.\n")); - *error = ENOBUFS; - goto free_exit; - } + *p_isr = kmem_alloc(sizeof(**p_isr), KM_SLEEP); memset(*p_isr, 0, sizeof(**p_isr)); /* set values */ @@ -1862,6 +1855,7 @@ key_spdadd(struct socket *so, struct mbu struct secpolicy *newsp; int error; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); KASSERT(m != NULL); KASSERT(mhp != NULL); @@ -1957,7 +1951,7 @@ key_spdadd(struct socket *so, struct mbu } if ((newsp->id = key_getnewspid()) == 0) { - KFREE(newsp); + kmem_free(newsp, sizeof(*newsp)); return key_senderror(so, m, ENOBUFS); } @@ -1973,12 +1967,12 @@ key_spdadd(struct socket *so, struct mbu /* sanity check on addr pair */ if (((const struct sockaddr *)(src0 + 1))->sa_family != ((const struct sockaddr *)(dst0+ 1))->sa_family) { - KFREE(newsp); + kmem_free(newsp, sizeof(*newsp)); return key_senderror(so, m, EINVAL); } if (((const struct sockaddr *)(src0 + 1))->sa_len != ((const struct sockaddr *)(dst0+ 1))->sa_len) { - KFREE(newsp); + kmem_free(newsp, sizeof(*newsp)); return key_senderror(so, m, EINVAL); } @@ -2876,22 +2870,20 @@ static struct secashead * key_newsah(const struct secasindex *saidx) { struct secashead *newsah; + int i; KASSERT(saidx != NULL); - newsah = (struct secashead *) - malloc(sizeof(struct secashead), M_SECA, M_NOWAIT|M_ZERO); - if (newsah != NULL) { - int i; - for (i = 0; i < sizeof(newsah->savtree)/sizeof(newsah->savtree[0]); i++) - LIST_INIT(&newsah->savtree[i]); - newsah->saidx = *saidx; - - /* add to saidxtree */ - newsah->state = SADB_SASTATE_MATURE; - LIST_INSERT_HEAD(&sahtree, newsah, chain); - } - return(newsah); + newsah = kmem_zalloc(sizeof(struct secashead), KM_SLEEP); + for (i = 0; i < __arraycount(newsah->savtree); i++) + LIST_INIT(&newsah->savtree[i]); + newsah->saidx = *saidx; + + /* add to saidxtree */ + newsah->state = SADB_SASTATE_MATURE; + LIST_INSERT_HEAD(&sahtree, newsah, chain); + + return newsah; } /* @@ -2905,9 +2897,10 @@ key_delsah(struct secashead *sah) int s; int zombie = 0; + KASSERT(!cpu_softintr_p()); KASSERT(sah != NULL); - s = splsoftnet(); /*called from softclock()*/ + s = splsoftnet(); /* searching all SA registerd in the secindex. */ SASTATE_ANY_FOREACH(state) { @@ -2935,7 +2928,7 @@ key_delsah(struct secashead *sah) if (__LIST_CHAINED(sah)) LIST_REMOVE(sah, chain); - KFREE(sah); + kmem_free(sah, sizeof(*sah)); splx(s); return; @@ -2961,17 +2954,13 @@ key_newsav(struct mbuf *m, const struct struct secasvar *newsav; const struct sadb_sa *xsa; + KASSERT(!cpu_softintr_p()); KASSERT(m != NULL); KASSERT(mhp != NULL); KASSERT(mhp->msg != NULL); KASSERT(sah != NULL); - KMALLOC(newsav, struct secasvar *, sizeof(struct secasvar)); - if (newsav == NULL) { - ipseclog((LOG_DEBUG, "key_newsa: No more memory.\n")); - *errp = ENOBUFS; - goto done; - } + newsav = kmem_alloc(sizeof(struct secasvar), KM_SLEEP); memset(newsav, 0, sizeof(struct secasvar)); switch (mhp->msg->sadb_msg_type) { @@ -2991,28 +2980,24 @@ key_newsav(struct mbuf *m, const struct case SADB_ADD: /* sanity check */ if (mhp->ext[SADB_EXT_SA] == NULL) { - KFREE(newsav), newsav = NULL; ipseclog((LOG_DEBUG, "key_newsa: invalid message is passed.\n")); *errp = EINVAL; - goto done; + goto error; } xsa = (const struct sadb_sa *)mhp->ext[SADB_EXT_SA]; newsav->spi = xsa->sadb_sa_spi; newsav->seq = mhp->msg->sadb_msg_seq; break; default: - KFREE(newsav), newsav = NULL; *errp = EINVAL; - goto done; + goto error; } /* copy sav values */ if (mhp->msg->sadb_msg_type != SADB_GETSPI) { *errp = key_setsaval(newsav, m, mhp); - if (*errp) { - KFREE(newsav), newsav = NULL; - goto done; - } + if (*errp) + goto error; } /* reset created */ @@ -3025,11 +3010,16 @@ key_newsav(struct mbuf *m, const struct newsav->state = SADB_SASTATE_LARVAL; LIST_INSERT_TAIL(&sah->savtree[SADB_SASTATE_LARVAL], newsav, secasvar, chain); -done: KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP from %s:%u return SA:%p\n", where, tag, newsav); - return newsav; + +error: + KASSERT(*errp != 0); + kmem_free(newsav, sizeof(*newsav)); + KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, + "DP from %s:%u return SA:NULL\n", where, tag); + return NULL; } /* @@ -3075,7 +3065,7 @@ key_delsav(struct secasvar *sav) sav->replay = NULL; } if (sav->lft_c != NULL) { - KFREE(sav->lft_c); + kmem_intr_free(sav->lft_c, sizeof(*(sav->lft_c))); sav->lft_c = NULL; } if (sav->lft_h != NULL) { @@ -3087,7 +3077,7 @@ key_delsav(struct secasvar *sav) sav->lft_s = NULL; } - KFREE(sav); + kmem_intr_free(sav, sizeof(*sav)); return; } @@ -3190,6 +3180,7 @@ key_setsaval(struct secasvar *sav, struc { int error = 0; + KASSERT(!cpu_softintr_p()); KASSERT(m != NULL); KASSERT(mhp != NULL); KASSERT(mhp->msg != NULL); @@ -3348,13 +3339,7 @@ key_setsaval(struct secasvar *sav, struc sav->created = time_uptime; /* make lifetime for CURRENT */ - KMALLOC(sav->lft_c, struct sadb_lifetime *, - sizeof(struct sadb_lifetime)); - if (sav->lft_c == NULL) { - ipseclog((LOG_DEBUG, "key_setsaval: No more memory.\n")); - error = ENOBUFS; - goto fail; - } + sav->lft_c = kmem_alloc(sizeof(struct sadb_lifetime), KM_SLEEP); sav->lft_c->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); @@ -3418,7 +3403,7 @@ key_setsaval(struct secasvar *sav, struc sav->key_enc = NULL; } if (sav->lft_c != NULL) { - KFREE(sav->lft_c); + kmem_free(sav->lft_c, sizeof(*(sav->lft_c))); sav->lft_c = NULL; } if (sav->lft_h != NULL) { @@ -4743,7 +4728,7 @@ key_timehandler_work(struct work *wk, vo if (now - acq->created > key_blockacq_lifetime && __LIST_CHAINED(acq)) { LIST_REMOVE(acq, chain); - KFREE(acq); + kmem_free(acq, sizeof(*acq)); } } } @@ -4757,7 +4742,7 @@ key_timehandler_work(struct work *wk, vo if (now - acq->created > key_blockacq_lifetime && __LIST_CHAINED(acq)) { LIST_REMOVE(acq, chain); - KFREE(acq); + kmem_free(acq, sizeof(*acq)); } } } @@ -4898,6 +4883,7 @@ key_getspi(struct socket *so, struct mbu u_int16_t reqid; int error; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); KASSERT(m != NULL); KASSERT(mhp != NULL); @@ -5265,6 +5251,7 @@ key_update(struct socket *so, struct mbu u_int16_t reqid; int error; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); KASSERT(m != NULL); KASSERT(mhp != NULL); @@ -6428,7 +6415,7 @@ key_newacq(const struct secasindex *said struct secacq *newacq; /* get new entry */ - KMALLOC(newacq, struct secacq *, sizeof(struct secacq)); + newacq = kmem_intr_alloc(sizeof(struct secacq), KM_NOSLEEP); if (newacq == NULL) { ipseclog((LOG_DEBUG, "key_newacq: No more memory.\n")); return NULL; @@ -6477,7 +6464,7 @@ key_newspacq(const struct secpolicyindex struct secspacq *acq; /* get new entry */ - KMALLOC(acq, struct secspacq *, sizeof(struct secspacq)); + acq = kmem_intr_alloc(sizeof(struct secspacq), KM_NOSLEEP); if (acq == NULL) { ipseclog((LOG_DEBUG, "key_newspacq: No more memory.\n")); return NULL; @@ -6644,6 +6631,7 @@ key_register(struct socket *so, struct m { struct secreg *reg, *newreg = 0; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); KASSERT(m != NULL); KASSERT(mhp != NULL); @@ -6666,11 +6654,7 @@ key_register(struct socket *so, struct m } /* create regnode */ - KMALLOC(newreg, struct secreg *, sizeof(*newreg)); - if (newreg == NULL) { - ipseclog((LOG_DEBUG, "key_register: No more memory.\n")); - return key_senderror(so, m, ENOBUFS); - } + newreg = kmem_alloc(sizeof(*newreg), KM_SLEEP); memset(newreg, 0, sizeof(*newreg)); newreg->so = so; @@ -6794,6 +6778,7 @@ key_freereg(struct socket *so) struct secreg *reg; int i; + KASSERT(!cpu_softintr_p()); KASSERT(so != NULL); /* @@ -6806,7 +6791,7 @@ key_freereg(struct socket *so) if (reg->so == so && __LIST_CHAINED(reg)) { LIST_REMOVE(reg, chain); - KFREE(reg); + kmem_free(reg, sizeof(*reg)); break; } } Index: src/sys/netipsec/keysock.c diff -u src/sys/netipsec/keysock.c:1.54 src/sys/netipsec/keysock.c:1.55 --- src/sys/netipsec/keysock.c:1.54 Thu Apr 27 09:43:52 2017 +++ src/sys/netipsec/keysock.c Tue May 16 03:05:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.54 2017/04/27 09:43:52 ozaki-r Exp $ */ +/* $NetBSD: keysock.c,v 1.55 2017/05/16 03:05:28 ozaki-r Exp $ */ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.54 2017/04/27 09:43:52 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.55 2017/05/16 03:05:28 ozaki-r Exp $"); /* This code has derived from sys/net/rtsock.c on FreeBSD2.2.5 */ @@ -49,6 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: keysock.c,v #include <sys/socketvar.h> #include <sys/sysctl.h> #include <sys/systm.h> +#include <sys/cpu.h> #include <net/raw_cb.h> #include <net/route.h> @@ -459,6 +460,7 @@ key_detach(struct socket *so) struct keycb *kp = (struct keycb *)sotorawcb(so); int s; + KASSERT(!cpu_softintr_p()); KASSERT(solocked(so)); KASSERT(kp != NULL);