aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-08-31 11:43:27 +0000
committerMark Johnston <markj@FreeBSD.org>2021-09-07 13:36:19 +0000
commit96ec1edc4a2aebc6876e685a82ebccc4f6db6a12 (patch)
treef08292d776ae2fb3d314203fac4d4688d89df05a /sys/netinet
parent8dbe4fadcaf6fe98e7b70616d11ff3e1530231f2 (diff)
downloadsrc-96ec1edc4a2aebc6876e685a82ebccc4f6db6a12.tar.gz
src-96ec1edc4a2aebc6876e685a82ebccc4f6db6a12.zip
sctp: Avoid unnecessary refcount bumps in sctp_inpcb_bind()
We only drop the inp lock when binding to a specific port. So, only acquire an extra reference when required. This simplifies error handling a bit. Reviewed by: tuexen Sponsored by: The FreeBSD Foundation (cherry picked from commit 93908fce7280b1146bbc5135b78829e8f8ff1b74)
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_pcb.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index f583862eae14..f55c3d4891a6 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -2918,9 +2918,10 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
/* Setup a vrf_id to be the default for the non-bind-all case. */
vrf_id = inp->def_vrf_id;
- /* increase our count due to the unlock we do */
- SCTP_INP_INCR_REF(inp);
if (lport) {
+ /* increase our count due to the unlock we do */
+ SCTP_INP_INCR_REF(inp);
+
/*
* Did the caller specify a port? if so we must see if an ep
* already has this one bound.
@@ -2991,6 +2992,7 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
}
continue_anyway:
SCTP_INP_WLOCK(inp);
+ SCTP_INP_DECR_REF(inp);
if (bindall) {
/* verify that no lport is not used by a singleton */
if ((port_reuse_active == 0) &&
@@ -3000,7 +3002,6 @@ continue_anyway:
(sctp_is_feature_on(inp_tmp, SCTP_PCB_FLAGS_PORTREUSE))) {
port_reuse_active = 1;
} else {
- SCTP_INP_DECR_REF(inp);
SCTP_INP_WUNLOCK(inp);
SCTP_INP_INFO_WUNLOCK();
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE);
@@ -3018,7 +3019,6 @@ continue_anyway:
last = MODULE_GLOBAL(ipport_hilastauto);
} else if (ip_inp->inp_flags & INP_LOWPORT) {
if ((error = priv_check(td, PRIV_NETINET_RESERVEDPORT)) != 0) {
- SCTP_INP_DECR_REF(inp);
SCTP_INP_WUNLOCK(inp);
SCTP_INP_INFO_WUNLOCK();
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error);
@@ -3047,7 +3047,6 @@ continue_anyway:
}
if (!done) {
if (--count == 0) {
- SCTP_INP_DECR_REF(inp);
SCTP_INP_WUNLOCK(inp);
SCTP_INP_INFO_WUNLOCK();
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE);
@@ -3061,7 +3060,6 @@ continue_anyway:
}
lport = htons(candidate);
}
- SCTP_INP_DECR_REF(inp);
if (inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE |
SCTP_PCB_FLAGS_SOCKET_ALLGONE)) {
/*