mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-24 07:40:52 +00:00
sockets: retire sorflush()
With removal of dom_dispose method the function boils down to two meaningful function calls: socantrcvmore() and sbrelease(). The latter is only relevant for protocols that use generic socket buffers. The socket I/O sx(9) lock acquisition in sorflush() is not relevant for shutdown(2) operation as it doesn't do any I/O that may interleave with read(2) or write(2). The socket buffer mutex acquisition inside sbrelease() is what guarantees thread safety. This sx(9) acquisition in soshutdown() can be tracked down to 4.4BSD times, where it used to be sblock(), and it was carried over through the years evolving together with sockets with no reconsideration of why do we carry it over. I can't tell if that sblock() made sense back then, but it doesn't make any today. Reviewed by: tuexen Differential Revision: https://reviews.freebsd.org/D43415
This commit is contained in:
parent
289bee16be
commit
507f87a799
@ -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 <sys/cdefs.h>
|
||||
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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:
|
||||
/*
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user