tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: mtr on 8.0_RC1



Hi Havard

On 06/06/2018 08:25, Havard Eidnes wrote:
it appears that "something" changed between 8.0_BETA of March 14
2018 and 8.0_RC1 of June 5 2018.  "mtr" when tracing towards an
IPv6 destination now all too often (and pretty quickly) exits
with

mtr: Unexpected mtr-packet error

Ktracing this reveals:

   1557      1 mtr-packet CALL  sendto(5,0x7f7fff2ac6d0,0x18,0,0x759ea6b050d8,0x1c)
   1557      1 mtr-packet MISC  msghdr: [name=0x759ea6b050d8, namelen=28, iov=0xffff80013a5daf50, iovlen=1, control=0x0, controllen=2168972952, flags=0]
   1557      1 mtr-packet MISC  mbsoname: [2001:700:xxxx:xxxx:xx:xx:xx:xx]
   1557      1 mtr-packet RET   sendto -1 errno 55 No buffer space available
   1557      1 mtr-packet CALL  write(1,0x759ea6b01000,0x20)
   1557      1 mtr-packet GIO   fd 1 wrote 32 bytes
        "33008 unexpected-error errno 55\n"
   1557      1 mtr-packet RET   write 32/0x20

Is this somehow related to the addition of ENOBUFS as a new error
on certain receive operations?

"Please make it stop, at least by default!"

Can you test the attached patch please?
It seperates receive errors from general socket errors so should fix this.

Roy
Index: sys/sys/socketvar.h
===================================================================
RCS file: /cvsroot/src/sys/sys/socketvar.h,v
retrieving revision 1.155
diff -u -p -r1.155 socketvar.h
--- sys/sys/socketvar.h	4 May 2018 08:35:07 -0000	1.155
+++ sys/sys/socketvar.h	6 Jun 2018 08:38:27 -0000
@@ -160,6 +160,7 @@ struct socket {
 	short		so_qlimit;	/* max number queued connections */
 	short		so_timeo;	/* connection timeout */
 	u_short		so_error;	/* error affecting connection */
+	u_short		so_rerror;	/* error affecting receiving */
 	u_short		so_aborting;	/* references from soabort() */
 	pid_t		so_pgid;	/* pgid for signals */
 	u_long		so_oobmark;	/* chars to oob mark */
Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvsroot/src/sys/kern/uipc_socket.c,v
retrieving revision 1.263
diff -u -p -r1.263 uipc_socket.c
--- sys/kern/uipc_socket.c	26 Apr 2018 19:50:09 -0000	1.263
+++ sys/kern/uipc_socket.c	6 Jun 2018 08:38:27 -0000
@@ -1240,11 +1240,16 @@ soreceive(struct socket *so, struct mbuf
 		if (m == NULL && so->so_rcv.sb_cc)
 			panic("receive 1");
 #endif
-		if (so->so_error) {
+		if (so->so_error || so->so_rerror) {
 			if (m != NULL)
 				goto dontblock;
-			error = so->so_error;
-			so->so_error = 0;
+			if (so->so_error) {
+				error = so->so_error;
+				so->so_error = 0;
+			} else {
+				error = so->so_rerror;
+				so->so_rerror = 0;
+			}
 			goto release;
 		}
 		if (so->so_state & SS_CANTRCVMORE) {
@@ -1564,7 +1569,8 @@ soreceive(struct socket *so, struct mbuf
 		 */
 		while (flags & MSG_WAITALL && m == NULL && uio->uio_resid > 0 &&
 		    !sosendallatonce(so) && !nextrecord) {
-			if (so->so_error || so->so_state & SS_CANTRCVMORE)
+			if (so->so_error || so->so_rerror ||
+			    so->so_state & SS_CANTRCVMORE)
 				break;
 			/*
 			 * If we are peeking and the socket receive buffer is
@@ -2250,7 +2256,7 @@ filt_soread(struct knote *kn, long hint)
 		kn->kn_flags |= EV_EOF;
 		kn->kn_fflags = so->so_error;
 		rv = 1;
-	} else if (so->so_error)
+	} else if (so->so_error || so->so_rerror)
 		rv = 1;
 	else if (kn->kn_sfflags & NOTE_LOWAT)
 		rv = (kn->kn_data >= kn->kn_sdata);
Index: sys/kern/uipc_socket2.c
===================================================================
RCS file: /cvsroot/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.129
diff -u -p -r1.129 uipc_socket2.c
--- sys/kern/uipc_socket2.c	29 Apr 2018 07:13:10 -0000	1.129
+++ sys/kern/uipc_socket2.c	6 Jun 2018 08:38:27 -0000
@@ -504,7 +504,7 @@ soroverflow(struct socket *so)
 	KASSERT(solocked(so));
 
 	so->so_rcv.sb_overflowed++;
-	so->so_error = ENOBUFS;
+	so->so_rerror = ENOBUFS;
 	sorwakeup(so);
 }
 


Home | Main Index | Thread Index | Old Index