Module Name: src Committed By: knakahara Date: Mon Jul 4 04:40:13 UTC 2016
Modified Files: src/sys/net: if_gif.c src/sys/netinet: ip_encap.c Log Message: make gif(4) and ip_encap MP-ify To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.118 src/sys/net/if_gif.c cvs rdiff -u -r1.60 -r1.61 src/sys/netinet/ip_encap.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/net/if_gif.c diff -u src/sys/net/if_gif.c:1.117 src/sys/net/if_gif.c:1.118 --- src/sys/net/if_gif.c:1.117 Mon Jul 4 04:35:09 2016 +++ src/sys/net/if_gif.c Mon Jul 4 04:40:13 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gif.c,v 1.117 2016/07/04 04:35:09 knakahara Exp $ */ +/* $NetBSD: if_gif.c,v 1.118 2016/07/04 04:40:13 knakahara Exp $ */ /* $KAME: if_gif.c,v 1.76 2001/08/20 02:01:02 kjc Exp $ */ /* @@ -31,10 +31,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.117 2016/07/04 04:35:09 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.118 2016/07/04 04:40:13 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" +#include "opt_net_mpsafe.h" #endif #include <sys/param.h> @@ -86,6 +87,10 @@ __KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1 #include "ioconf.h" +#ifdef NET_MPSAFE +#define GIF_MPSAFE 1 +#endif + /* * gif global variable definitions */ @@ -322,7 +327,9 @@ gif_output(struct ifnet *ifp, struct mbu { struct gif_softc *sc = ifp->if_softc; int error = 0; +#ifndef GIF_MPSAFE int s; +#endif IFQ_CLASSIFY(&ifp->if_snd, m, dst->sa_family); @@ -353,13 +360,19 @@ gif_output(struct ifnet *ifp, struct mbu m->m_pkthdr.csum_flags = 0; m->m_pkthdr.csum_data = 0; +#ifndef GIF_MPSAFE s = splnet(); +#endif IFQ_ENQUEUE(&ifp->if_snd, m, error); if (error) { +#ifndef GIF_MPSAFE splx(s); +#endif goto end; } +#ifndef GIF_MPSAFE splx(s); +#endif gif_start(ifp); @@ -378,16 +391,22 @@ gif_start(struct ifnet *ifp) struct mbuf *m; int family; int len; +#ifndef GIF_MPSAFE int s; +#endif int error; sc = ifp->if_softc; /* output processing */ while (1) { +#ifndef GIF_MPSAFE s = splnet(); +#endif IFQ_DEQUEUE(&sc->gif_if.if_snd, m); +#ifndef GIF_MPSAFE splx(s); +#endif if (m == NULL) break; @@ -446,7 +465,9 @@ gif_input(struct mbuf *m, int af, struct { pktqueue_t *pktq; size_t pktlen; +#ifndef GIF_MPSAFE int s; +#endif if (ifp == NULL) { /* just in case */ @@ -481,14 +502,18 @@ gif_input(struct mbuf *m, int af, struct return; } +#ifndef GIF_MPSAFE s = splnet(); +#endif if (__predict_true(pktq_enqueue(pktq, m, 0))) { ifp->if_ibytes += pktlen; ifp->if_ipackets++; } else { m_freem(m); } +#ifndef GIF_MPSAFE splx(s); +#endif } /* XXX how should we handle IPv6 scope on SIOC[GS]IFPHYADDR? */ @@ -825,13 +850,17 @@ gif_set_tunnel(struct ifnet *ifp, struct struct gif_softc *sc2; struct sockaddr *osrc, *odst; struct sockaddr *nsrc, *ndst; - int s; int error; +#ifndef GIF_MPSAFE + int s; s = splsoftnet(); +#endif error = encap_lock_enter(); if (error) { +#ifndef GIF_MPSAFE splx(s); +#endif return error; } @@ -844,24 +873,21 @@ gif_set_tunnel(struct ifnet *ifp, struct if (sockaddr_cmp(sc2->gif_pdst, dst) == 0 && sockaddr_cmp(sc2->gif_psrc, src) == 0) { /* continue to use the old configureation. */ - encap_lock_exit(); - splx(s); - return EADDRNOTAVAIL; + error = EADDRNOTAVAIL; + goto out; } /* XXX both end must be valid? (I mean, not 0.0.0.0) */ } if ((nsrc = sockaddr_dup(src, M_WAITOK)) == NULL) { - encap_lock_exit(); - splx(s); - return ENOMEM; + error = ENOMEM; + goto out; } if ((ndst = sockaddr_dup(dst, M_WAITOK)) == NULL) { sockaddr_free(nsrc); - encap_lock_exit(); - splx(s); - return ENOMEM; + error = ENOMEM; + goto out; } gif_encap_pause(sc); @@ -910,8 +936,11 @@ gif_set_tunnel(struct ifnet *ifp, struct else ifp->if_flags &= ~IFF_RUNNING; + out: encap_lock_exit(); +#ifndef GIF_MPSAFE splx(s); +#endif return error; } @@ -919,13 +948,17 @@ static void gif_delete_tunnel(struct ifnet *ifp) { struct gif_softc *sc = ifp->if_softc; - int s; int error; +#ifndef GIF_MPSAFE + int s; s = splsoftnet(); +#endif error = encap_lock_enter(); if (error) { +#ifndef GIF_MPSAFE splx(s); +#endif return; } @@ -952,5 +985,7 @@ gif_delete_tunnel(struct ifnet *ifp) ifp->if_flags &= ~IFF_RUNNING; encap_lock_exit(); +#ifndef GIF_MPSAFE splx(s); +#endif } Index: src/sys/netinet/ip_encap.c diff -u src/sys/netinet/ip_encap.c:1.60 src/sys/netinet/ip_encap.c:1.61 --- src/sys/netinet/ip_encap.c:1.60 Mon Jul 4 04:38:14 2016 +++ src/sys/netinet/ip_encap.c Mon Jul 4 04:40:13 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_encap.c,v 1.60 2016/07/04 04:38:14 knakahara Exp $ */ +/* $NetBSD: ip_encap.c,v 1.61 2016/07/04 04:40:13 knakahara Exp $ */ /* $KAME: ip_encap.c,v 1.73 2001/10/02 08:30:58 itojun Exp $ */ /* @@ -68,11 +68,12 @@ #define USE_RADIX #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.60 2016/07/04 04:38:14 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.61 2016/07/04 04:40:13 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_mrouting.h" #include "opt_inet.h" +#include "opt_net_mpsafe.h" #endif #include <sys/param.h> @@ -110,6 +111,10 @@ __KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v #include <net/net_osdep.h> +#ifdef NET_MPSAFE +#define ENCAP_MPSAFE 1 +#endif + enum direction { INBOUND, OUTBOUND }; #ifdef INET @@ -648,14 +653,17 @@ encap_attach(int af, int proto, { struct encaptab *ep; int error; - int s, pss; + int pss; size_t l; struct ip_pack4 *pack4; #ifdef INET6 struct ip_pack6 *pack6; #endif +#ifndef ENCAP_MPSAFE + int s; s = splsoftnet(); +#endif /* sanity check on args */ error = encap_afcheck(af, sp, dp); if (error) @@ -761,7 +769,9 @@ encap_attach(int af, int proto, goto gc; error = 0; +#ifndef ENCAP_MPSAFE splx(s); +#endif return ep; gc: @@ -772,7 +782,9 @@ gc: if (ep) kmem_free(ep, sizeof(*ep)); fail: +#ifndef ENCAP_MPSAFE splx(s); +#endif return NULL; } @@ -783,9 +795,11 @@ encap_attach_func(int af, int proto, { struct encaptab *ep; int error; +#ifndef ENCAP_MPSAFE int s; s = splsoftnet(); +#endif /* sanity check on args */ if (!func) { error = EINVAL; @@ -815,11 +829,15 @@ encap_attach_func(int af, int proto, goto fail; error = 0; +#ifndef ENCAP_MPSAFE splx(s); +#endif return ep; fail: +#ifndef ENCAP_MPSAFE splx(s); +#endif return NULL; }