diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 1626c6a7442d..65230e39e4ae 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -95,9 +95,9 @@ * * NOTE: With regard to VNETs the general rule is that callers do not set * curvnet. Exceptions to this rule include soabort(), sodisconnect(), - * sofree() (and with that sorele(), sotryfree()), as well as sonewconn() - * and sorflush(), which are usually called from a pre-set VNET context. - * sopoll() currently does not need a VNET context to be set. + * sofree() (and with that sorele(), sotryfree()), as well as sonewconn(), + * which are usually called from a pre-set VNET context. sopoll() currently + * does not need a VNET context to be set. */ #include @@ -2971,36 +2971,6 @@ soshutdown(struct socket *so, enum shutdown_how how) return (error); } -/* - * Used by several pr_shutdown implementations that use generic socket buffers. - */ -void -sorflush(struct socket *so) -{ - int error; - - VNET_SO_ASSERT(so); - - /* - * Dislodge threads currently blocked in receive and wait to acquire - * a lock against other simultaneous readers before clearing the - * socket buffer. Don't let our acquire be interrupted by a signal - * despite any existing socket disposition on interruptable waiting. - */ - socantrcvmore(so); - - error = SOCK_IO_RECV_LOCK(so, SBL_WAIT | SBL_NOINTR); - if (error != 0) { - KASSERT(SOLISTENING(so), - ("%s: soiolock(%p) failed", __func__, so)); - return; - } - - sbrelease(so, SO_RCV); - SOCK_IO_RECV_UNLOCK(so); - -} - /* * Wrapper for Socket established helper hook. * Parameters: socket, context of the hook point, hook id. diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 94d5e9e4bccc..cb149f176b6d 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -457,10 +457,12 @@ rts_shutdown(struct socket *so, enum shutdown_how how) */ switch (how) { case SHUT_RD: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); break; case SHUT_RDWR: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); /* FALLTHROUGH */ case SHUT_WR: socantsendmore(so); diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index a6bef1c7e275..004aaea01bfa 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -994,10 +994,12 @@ rip_shutdown(struct socket *so, enum shutdown_how how) switch (how) { case SHUT_RD: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); break; case SHUT_RDWR: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); /* FALLTHROUGH */ case SHUT_WR: socantsendmore(so); diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index ec9f211b519b..51c056e052a5 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -868,11 +868,7 @@ sctp_shutdown(struct socket *so, enum shutdown_how how) SCTP_TCB_UNLOCK(stcb); } SCTP_INP_WUNLOCK(inp); - /* - * XXXGL: does SCTP need sorflush()? This is what old - * soshutdown() used to do for all kinds of sockets. - */ - sorflush(so); + socantrcvmore(so); if (how == SHUT_RD) break; /* FALLTHROUGH */ diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index ccd6a6149dae..7c8e3d7e72db 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -824,10 +824,12 @@ tcp_usr_shutdown(struct socket *so, enum shutdown_how how) switch (how) { case SHUT_RD: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); break; case SHUT_RDWR: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); /* FALLTHROUGH */ case SHUT_WR: /* diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index f91a96edeb68..b68ec95a923a 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1696,10 +1696,12 @@ udp_shutdown(struct socket *so, enum shutdown_how how) switch (how) { case SHUT_RD: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); break; case SHUT_RDWR: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); /* FALLTHROUGH */ case SHUT_WR: socantsendmore(so); diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 3264de331817..5b31a84f31eb 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -839,10 +839,12 @@ rip6_shutdown(struct socket *so, enum shutdown_how how) switch (how) { case SHUT_RD: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); break; case SHUT_RDWR: - sorflush(so); + socantrcvmore(so); + sbrelease(so, SO_RCV); /* FALLTHROUGH */ case SHUT_WR: socantsendmore(so); diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 19ca52177d17..5d651b36b1e7 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -501,7 +501,6 @@ int soreceive_generic(struct socket *so, struct sockaddr **paddr, void sorele_locked(struct socket *so); void sodealloc(struct socket *); int soreserve(struct socket *so, u_long sndcc, u_long rcvcc); -void sorflush(struct socket *so); int sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td);