From ec7ae48015863392c934e6989adccb6e4bfdd66f Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Fri, 4 Aug 2017 19:07:30 +0800 Subject: [PATCH] gif: It should only run in the first netisr_ncpus netisrs --- sys/net/gif/if_gif.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/sys/net/gif/if_gif.c b/sys/net/gif/if_gif.c index f9d0a10a99..7ffa9ccc81 100644 --- a/sys/net/gif/if_gif.c +++ b/sys/net/gif/if_gif.c @@ -55,7 +55,7 @@ #include #include #include -#include +#include #include #include #include @@ -201,33 +201,27 @@ static void gif_clear_cache(struct gif_softc *sc) { struct rtentry *rt; - int origcpu; int n; - for (n = 0; n < ncpus; ++n) { + for (n = 0; n < netisr_ncpus; ++n) { rt = sc->gif_ro[n].ro_rt; - /* - * Routes need to be cleaned up in their CPU so migrate - * to it and return to the original CPU after completion. - */ - origcpu = mycpuid; - if (rt && rt->rt_cpuid != mycpuid) - lwkt_migratecpu(rt->rt_cpuid); - else - origcpu = -1; - - if (sc->gif_ro[n].ro_rt) { - RTFREE(sc->gif_ro[n].ro_rt); + if (rt != NULL) { + KASSERT(rt->rt_cpuid == n, + ("inet rt for cpu%d installed on cpu%d slot", + rt->rt_cpuid, n)); + rtfree_async(rt); sc->gif_ro[n].ro_rt = NULL; } #ifdef INET6 - if (sc->gif_ro6[n].ro_rt) { - RTFREE(sc->gif_ro6[n].ro_rt); + rt = sc->gif_ro6[n].ro_rt; + if (rt != NULL) { + KASSERT(rt->rt_cpuid == n, + ("inet6 rt for cpu%d installed on cpu%d slot", + rt->rt_cpuid, n)); + rtfree_async(rt); sc->gif_ro6[n].ro_rt = NULL; } #endif - if (origcpu >= 0) - lwkt_migratecpu(origcpu); } } @@ -413,6 +407,8 @@ gif_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct ifaltq_subque *ifsq = ifq_get_subq_default(&ifp->if_snd); int error; + ASSERT_NETISR_NCPUS(curthread, mycpuid); + ifsq_serialize_hw(ifsq); error = gif_output_serialized(ifp, m, dst, rt); ifsq_deserialize_hw(ifsq); -- 2.11.4.GIT