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