Module Name: src
Committed By: snj
Date: Tue Jan 2 10:56:58 UTC 2018
Modified Files:
src/sys/netinet [netbsd-8]: in.c ip_output.c
src/sys/netinet6 [netbsd-8]: in6.c in6_pcb.c
src/sys/sys [netbsd-8]: lwp.h
Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #463):
sys/netinet/in.c: revision 1.212
sys/netinet/ip_output.c: revision 1.288
sys/netinet6/in6.c: revision 1.256
sys/netinet6/in6_pcb.c: revision 1.163
sys/sys/lwp.h: revision 1.176
Add missing curlwp_bindx
--
Add missing curlwp_bindx
--
Check LP_BOUND is surely set in curlwp_bindx
This may find an extra call of curlwp_bindx.
--
Fix usage of curlwp_bind in ip_output
curlwp_bindx must be called in LIFO order, i.e., we can't call curlwp_bind
and curlwp_bindx like this:
bound1 = curlwp_bind();
bound2 = curlwp_bind();
curlwp_bindx(bound1);
curlwp_bindx(bound2);
ip_outout did so if NET_MPSAFE. Fix it.
--
Fix wrong usage of psref_held
We can't use it for checking if a caller does NOT hold a given target.
If you want to do it you should have psref_not_held or something.
To generate a diff of this commit:
cvs rdiff -u -r1.203.2.4 -r1.203.2.5 src/sys/netinet/in.c
cvs rdiff -u -r1.279.2.3 -r1.279.2.4 src/sys/netinet/ip_output.c
cvs rdiff -u -r1.245.2.4 -r1.245.2.5 src/sys/netinet6/in6.c
cvs rdiff -u -r1.161.4.1 -r1.161.4.2 src/sys/netinet6/in6_pcb.c
cvs rdiff -u -r1.174 -r1.174.4.1 src/sys/sys/lwp.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.203.2.4 src/sys/netinet/in.c:1.203.2.5
--- src/sys/netinet/in.c:1.203.2.4 Tue Jan 2 10:20:34 2018
+++ src/sys/netinet/in.c Tue Jan 2 10:56:58 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: in.c,v 1.203.2.4 2018/01/02 10:20:34 snj Exp $ */
+/* $NetBSD: in.c,v 1.203.2.5 2018/01/02 10:56:58 snj Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.203.2.4 2018/01/02 10:20:34 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.203.2.5 2018/01/02 10:56:58 snj Exp $");
#include "arp.h"
@@ -845,7 +845,7 @@ in_purgeaddr(struct ifaddr *ifa)
struct in_ifaddr *ia = (void *) ifa;
struct ifnet *ifp = ifa->ifa_ifp;
- KASSERT(!ifa_held(ifa));
+ /* KASSERT(!ifa_held(ifa)); XXX need ifa_not_held (psref_not_held) */
ifa->ifa_flags |= IFA_DESTROYING;
in_scrubaddr(ia);
Index: src/sys/netinet/ip_output.c
diff -u src/sys/netinet/ip_output.c:1.279.2.3 src/sys/netinet/ip_output.c:1.279.2.4
--- src/sys/netinet/ip_output.c:1.279.2.3 Tue Jan 2 10:20:34 2018
+++ src/sys/netinet/ip_output.c Tue Jan 2 10:56:58 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_output.c,v 1.279.2.3 2018/01/02 10:20:34 snj Exp $ */
+/* $NetBSD: ip_output.c,v 1.279.2.4 2018/01/02 10:56:58 snj Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.3 2018/01/02 10:20:34 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.4 2018/01/02 10:56:58 snj Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -303,6 +303,10 @@ ip_output(struct mbuf *m0, struct mbuf *
!in_hosteq(dst->sin_addr, ip->ip_dst)))
rtcache_free(ro);
+ /* XXX must be before rtcache operations */
+ bound = curlwp_bind();
+ bind_need_restore = true;
+
if ((rt = rtcache_validate(ro)) == NULL &&
(rt = rtcache_update(ro, 1)) == NULL) {
dst = &udst.sin;
@@ -311,8 +315,6 @@ ip_output(struct mbuf *m0, struct mbuf *
goto bad;
}
- bound = curlwp_bind();
- bind_need_restore = true;
/*
* If routing to interface only, short circuit routing lookup.
*/
Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.245.2.4 src/sys/netinet6/in6.c:1.245.2.5
--- src/sys/netinet6/in6.c:1.245.2.4 Tue Jan 2 10:20:34 2018
+++ src/sys/netinet6/in6.c Tue Jan 2 10:56:58 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: in6.c,v 1.245.2.4 2018/01/02 10:20:34 snj Exp $ */
+/* $NetBSD: in6.c,v 1.245.2.5 2018/01/02 10:56:58 snj Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.245.2.4 2018/01/02 10:20:34 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.245.2.5 2018/01/02 10:56:58 snj Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1384,7 +1384,7 @@ in6_purgeaddr(struct ifaddr *ifa)
struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
struct in6_multi_mship *imm;
- KASSERT(!ifa_held(ifa));
+ /* KASSERT(!ifa_held(ifa)); XXX need ifa_not_held (psref_not_held) */
KASSERT(IFNET_LOCKED(ifp));
ifa->ifa_flags |= IFA_DESTROYING;
Index: src/sys/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.161.4.1 src/sys/netinet6/in6_pcb.c:1.161.4.2
--- src/sys/netinet6/in6_pcb.c:1.161.4.1 Tue Jan 2 10:20:34 2018
+++ src/sys/netinet6/in6_pcb.c Tue Jan 2 10:56:58 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: in6_pcb.c,v 1.161.4.1 2018/01/02 10:20:34 snj Exp $ */
+/* $NetBSD: in6_pcb.c,v 1.161.4.2 2018/01/02 10:56:58 snj Exp $ */
/* $KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.161.4.1 2018/01/02 10:20:34 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.161.4.2 2018/01/02 10:56:58 snj Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -512,6 +512,7 @@ in6_pcbconnect(void *v, struct sockaddr_
if (ia4 == NULL) {
if (error == 0)
error = EADDRNOTAVAIL;
+ curlwp_bindx(bound);
return (error);
}
memset(&mapped, 0, sizeof(mapped));
@@ -521,6 +522,7 @@ in6_pcbconnect(void *v, struct sockaddr_
ia4_release(ia4, &_psref);
in6a = &mapped;
#else
+ curlwp_bindx(bound);
return EADDRNOTAVAIL;
#endif
} else {
Index: src/sys/sys/lwp.h
diff -u src/sys/sys/lwp.h:1.174 src/sys/sys/lwp.h:1.174.4.1
--- src/sys/sys/lwp.h:1.174 Fri Apr 21 15:10:35 2017
+++ src/sys/sys/lwp.h Tue Jan 2 10:56:58 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: lwp.h,v 1.174 2017/04/21 15:10:35 christos Exp $ */
+/* $NetBSD: lwp.h,v 1.174.4.1 2018/01/02 10:56:58 snj Exp $ */
/*-
* Copyright (c) 2001, 2006, 2007, 2008, 2009, 2010
@@ -542,6 +542,8 @@ curlwp_bind(void)
static inline void
curlwp_bindx(int bound)
{
+
+ KASSERT(curlwp->l_pflag & LP_BOUND);
curlwp->l_pflag ^= bound ^ LP_BOUND;
}