Author: tuexen
Date: Sat Apr  7 14:35:46 2018
New Revision: 332167
URL: https://svnweb.freebsd.org/changeset/base/332167

Log:
  MFC r320650:
  
  Don't hold a refcount on an stcb when it is not needed.
  This improves the consistency with other parts of the code.

Modified:
  stable/11/sys/netinet/sctp_input.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/netinet/sctp_input.c
==============================================================================
--- stable/11/sys/netinet/sctp_input.c  Sat Apr  7 14:17:17 2018        
(r332166)
+++ stable/11/sys/netinet/sctp_input.c  Sat Apr  7 14:35:46 2018        
(r332167)
@@ -2152,23 +2152,23 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, in
                 * cookie was in flight. Only recourse is to abort the
                 * association.
                 */
-               atomic_add_int(&stcb->asoc.refcnt, 1);
                op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, "");
                sctp_abort_association(inp, (struct sctp_tcb *)NULL, m, iphlen,
                    src, dst, sh, op_err,
                    mflowtype, mflowid,
                    vrf_id, port);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+               atomic_add_int(&stcb->asoc.refcnt, 1);
                SCTP_TCB_UNLOCK(stcb);
                SCTP_SOCKET_LOCK(so, 1);
                SCTP_TCB_LOCK(stcb);
+               atomic_subtract_int(&stcb->asoc.refcnt, 1);
 #endif
                (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
                    SCTP_FROM_SCTP_INPUT + SCTP_LOC_18);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
                SCTP_SOCKET_UNLOCK(so, 1);
 #endif
-               atomic_subtract_int(&stcb->asoc.refcnt, 1);
                return (NULL);
        }
        /* process the INIT-ACK info (my info) */
@@ -2189,36 +2189,36 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, in
        else
                retval = 0;
        if (retval < 0) {
-               atomic_add_int(&stcb->asoc.refcnt, 1);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+               atomic_add_int(&stcb->asoc.refcnt, 1);
                SCTP_TCB_UNLOCK(stcb);
                SCTP_SOCKET_LOCK(so, 1);
                SCTP_TCB_LOCK(stcb);
+               atomic_subtract_int(&stcb->asoc.refcnt, 1);
 #endif
                (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
                    SCTP_FROM_SCTP_INPUT + SCTP_LOC_19);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
                SCTP_SOCKET_UNLOCK(so, 1);
 #endif
-               atomic_subtract_int(&stcb->asoc.refcnt, 1);
                return (NULL);
        }
        /* load all addresses */
        if (sctp_load_addresses_from_init(stcb, m,
            init_offset + sizeof(struct sctp_init_chunk), initack_offset,
            src, dst, init_src, port)) {
-               atomic_add_int(&stcb->asoc.refcnt, 1);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+               atomic_add_int(&stcb->asoc.refcnt, 1);
                SCTP_TCB_UNLOCK(stcb);
                SCTP_SOCKET_LOCK(so, 1);
                SCTP_TCB_LOCK(stcb);
+               atomic_subtract_int(&stcb->asoc.refcnt, 1);
 #endif
                (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
                    SCTP_FROM_SCTP_INPUT + SCTP_LOC_20);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
                SCTP_SOCKET_UNLOCK(so, 1);
 #endif
-               atomic_subtract_int(&stcb->asoc.refcnt, 1);
                return (NULL);
        }
        /*
@@ -2237,18 +2237,18 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, in
                        /* auth HMAC failed, dump the assoc and packet */
                        SCTPDBG(SCTP_DEBUG_AUTH1,
                            "COOKIE-ECHO: AUTH failed\n");
-                       atomic_add_int(&stcb->asoc.refcnt, 1);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+                       atomic_add_int(&stcb->asoc.refcnt, 1);
                        SCTP_TCB_UNLOCK(stcb);
                        SCTP_SOCKET_LOCK(so, 1);
                        SCTP_TCB_LOCK(stcb);
+                       atomic_subtract_int(&stcb->asoc.refcnt, 1);
 #endif
                        (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
                            SCTP_FROM_SCTP_INPUT + SCTP_LOC_21);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
                        SCTP_SOCKET_UNLOCK(so, 1);
 #endif
-                       atomic_subtract_int(&stcb->asoc.refcnt, 1);
                        return (NULL);
                } else {
                        /* remaining chunks checked... good to go */
@@ -2298,18 +2298,18 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, in
                break;
 #endif
        default:
-               atomic_add_int(&stcb->asoc.refcnt, 1);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+               atomic_add_int(&stcb->asoc.refcnt, 1);
                SCTP_TCB_UNLOCK(stcb);
                SCTP_SOCKET_LOCK(so, 1);
                SCTP_TCB_LOCK(stcb);
+               atomic_subtract_int(&stcb->asoc.refcnt, 1);
 #endif
                (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
                    SCTP_FROM_SCTP_INPUT + SCTP_LOC_22);
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
                SCTP_SOCKET_UNLOCK(so, 1);
 #endif
-               atomic_subtract_int(&stcb->asoc.refcnt, 1);
                return (NULL);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to