Module Name: src Committed By: ozaki-r Date: Thu Jan 19 06:58:55 UTC 2017
Modified Files: src/sys/net: route.c rtsock.c Log Message: Disable rt_update mechanism by default This is a workaround for PR kern/51877. Enable again once the issue is fixed. To generate a diff of this commit: cvs rdiff -u -r1.187 -r1.188 src/sys/net/route.c cvs rdiff -u -r1.199 -r1.200 src/sys/net/rtsock.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/route.c diff -u src/sys/net/route.c:1.187 src/sys/net/route.c:1.188 --- src/sys/net/route.c:1.187 Tue Jan 17 07:53:06 2017 +++ src/sys/net/route.c Thu Jan 19 06:58:55 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: route.c,v 1.187 2017/01/17 07:53:06 ozaki-r Exp $ */ +/* $NetBSD: route.c,v 1.188 2017/01/19 06:58:55 ozaki-r Exp $ */ /*- * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.187 2017/01/17 07:53:06 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.188 2017/01/19 06:58:55 ozaki-r Exp $"); #include <sys/param.h> #ifdef RTFLUSH_DEBUG @@ -288,7 +288,9 @@ static int rtcache_setdst_locked(struct static void rtcache_ref(struct rtentry *, struct route *); +#ifdef NET_MPSAFE static void rt_update_wait(void); +#endif static bool rt_wait_ok(void); static void rt_wait_refcnt(const char *, struct rtentry *, int); @@ -561,7 +563,9 @@ rtalloc1_locked(const struct sockaddr *d struct rtentry *rt; int s; +#ifdef NET_MPSAFE retry: +#endif s = splsoftnet(); rtbl = rt_gettable(dst->sa_family); if (rtbl == NULL) @@ -574,6 +578,7 @@ retry: if (!ISSET(rt->rt_flags, RTF_UP)) goto miss; +#ifdef NET_MPSAFE if (ISSET(rt->rt_flags, RTF_UPDATING) && /* XXX updater should be always able to acquire */ curlwp != rt_update_global.lwp) { @@ -596,6 +601,7 @@ retry: RTCACHE_WLOCK(); goto retry; } +#endif /* NET_MPSAFE */ rt_ref(rt); RT_REFCNT_TRACE(rt); @@ -689,7 +695,9 @@ _rt_free(struct rtentry *rt) * Need to avoid a deadlock on rt_wait_refcnt of update * and a conflict on psref_target_destroy of update. */ +#ifdef NET_MPSAFE rt_update_wait(); +#endif RT_REFCNT_TRACE(rt); KASSERTMSG(rt->rt_refcnt >= 0, "refcnt=%d", rt->rt_refcnt); @@ -755,6 +763,7 @@ rt_free(struct rtentry *rt) } } +#ifdef NET_MPSAFE static void rt_update_wait(void) { @@ -767,6 +776,7 @@ rt_update_wait(void) } mutex_exit(&rt_update_global.lock); } +#endif int rt_update_prepare(struct rtentry *rt) @@ -1964,7 +1974,9 @@ rtcache_validate_locked(struct route *ro { struct rtentry *rt = NULL; +#ifdef NET_MPSAFE retry: +#endif rt = ro->_ro_rt; rtcache_invariants(ro); @@ -1975,6 +1987,7 @@ retry: RT_RLOCK(); if (rt != NULL && (rt->rt_flags & RTF_UP) != 0 && rt->rt_ifp != NULL) { +#ifdef NET_MPSAFE if (ISSET(rt->rt_flags, RTF_UPDATING)) { if (rt_wait_ok()) { RT_UNLOCK(); @@ -1987,6 +2000,7 @@ retry: rt = NULL; } } else +#endif rtcache_ref(rt, ro); } else rt = NULL; Index: src/sys/net/rtsock.c diff -u src/sys/net/rtsock.c:1.199 src/sys/net/rtsock.c:1.200 --- src/sys/net/rtsock.c:1.199 Mon Dec 12 03:55:57 2016 +++ src/sys/net/rtsock.c Thu Jan 19 06:58:55 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.199 2016/12/12 03:55:57 ozaki-r Exp $ */ +/* $NetBSD: rtsock.c,v 1.200 2017/01/19 06:58:55 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,13 +61,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.199 2016/12/12 03:55:57 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.200 2017/01/19 06:58:55 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" #include "opt_mpls.h" #include "opt_compat_netbsd.h" #include "opt_sctp.h" +#include "opt_net_mpsafe.h" #endif #include <sys/param.h> @@ -887,11 +888,15 @@ COMPATNAME(route_output)(struct mbuf *m, break; case RTM_CHANGE: +#ifdef NET_MPSAFE error = rt_update_prepare(rt); if (error == 0) { error = route_output_change(rt, &info, rtm); rt_update_finish(rt); } +#else + error = route_output_change(rt, &info, rtm); +#endif if (error != 0) goto flush; /*FALLTHROUGH*/