net: use helpers to change sk_ack_backlog
authorEric Dumazet <edumazet@google.com>
Tue, 5 Nov 2019 22:11:52 +0000 (14:11 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Nov 2019 00:14:48 +0000 (16:14 -0800)
Writers are holding a lock, but many readers do not.

Following patch will add appropriate barriers in
sk_acceptq_removed() and sk_acceptq_added().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
16 files changed:
net/atm/signaling.c
net/atm/svc.c
net/ax25/af_ax25.c
net/ax25/ax25_in.c
net/bluetooth/af_bluetooth.c
net/decnet/af_decnet.c
net/decnet/dn_nsp_in.c
net/llc/af_llc.c
net/rose/af_rose.c
net/sctp/associola.c
net/sctp/endpointola.c
net/vmw_vsock/af_vsock.c
net/vmw_vsock/hyperv_transport.c
net/vmw_vsock/virtio_transport_common.c
net/vmw_vsock/vmci_transport.c
net/x25/af_x25.c

index 6c11cdf4dd4ce4737dd38bcceccc43dfd272c338..fbd0c5e7b299993bd3a4ae4a6c5f543cb30c5091 100644 (file)
@@ -109,7 +109,7 @@ static int sigd_send(struct atm_vcc *vcc, struct sk_buff *skb)
                        dev_kfree_skb(skb);
                        goto as_indicate_complete;
                }
-               sk->sk_ack_backlog++;
+               sk_acceptq_added(sk);
                skb_queue_tail(&sk->sk_receive_queue, skb);
                pr_debug("waking sk_sleep(sk) 0x%p\n", sk_sleep(sk));
                sk->sk_state_change(sk);
index 908cbb8654f532548b20f166492a2e02de6324d6..ba144d035e3d41e8ba8115b9b4aa54762fca0d01 100644 (file)
@@ -381,7 +381,7 @@ static int svc_accept(struct socket *sock, struct socket *newsock, int flags,
                                    msg->pvc.sap_addr.vpi,
                                    msg->pvc.sap_addr.vci);
                dev_kfree_skb(skb);
-               sk->sk_ack_backlog--;
+               sk_acceptq_removed(sk);
                if (error) {
                        sigd_enq2(NULL, as_reject, old_vcc, NULL, NULL,
                                  &old_vcc->qos, error);
index bb222b882b6776481a17c9a4cc9ed6d97150c986..324306d6fde02cb67e13073986bde1c4ed7eae5f 100644 (file)
@@ -1384,7 +1384,7 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags,
 
        /* Now attach up the new socket */
        kfree_skb(skb);
-       sk->sk_ack_backlog--;
+       sk_acceptq_removed(sk);
        newsock->state = SS_CONNECTED;
 
 out:
index dcdbaeeb2358a45d18ca0987ae5969b8f9a76cad..cd6afe895db9910fb7f8f1abad9016307c660850 100644 (file)
@@ -356,7 +356,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
 
                make->sk_state = TCP_ESTABLISHED;
 
-               sk->sk_ack_backlog++;
+               sk_acceptq_added(sk);
                bh_unlock_sock(sk);
        } else {
                if (!mine)
index 5f508c50649d0abc317ed83cc0768f6b7a64de96..3fd124927d4d176864004aecdd206407a1f6b836 100644 (file)
@@ -173,7 +173,7 @@ void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh)
        else
                release_sock(sk);
 
-       parent->sk_ack_backlog++;
+       sk_acceptq_added(parent);
 }
 EXPORT_SYMBOL(bt_accept_enqueue);
 
@@ -185,7 +185,7 @@ void bt_accept_unlink(struct sock *sk)
        BT_DBG("sk %p state %d", sk, sk->sk_state);
 
        list_del_init(&bt_sk(sk)->accept_q);
-       bt_sk(sk)->parent->sk_ack_backlog--;
+       sk_acceptq_removed(bt_sk(sk)->parent);
        bt_sk(sk)->parent = NULL;
        sock_put(sk);
 }
index 3349ea81f9016fb785ec888fadf86faa4d859ed7..e19a92a62e142611f78d942ba22d2b1908430660 100644 (file)
@@ -1091,7 +1091,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags,
        }
 
        cb = DN_SKB_CB(skb);
-       sk->sk_ack_backlog--;
+       sk_acceptq_removed(sk);
        newsk = dn_alloc_sock(sock_net(sk), newsock, sk->sk_allocation, kern);
        if (newsk == NULL) {
                release_sock(sk);
index e4161e0c86aa1190bdba483f857922ef12ce0bb6..c68503a180259467505bd1346995ea1bc00df755 100644 (file)
@@ -328,7 +328,7 @@ static void dn_nsp_conn_init(struct sock *sk, struct sk_buff *skb)
                return;
        }
 
-       sk->sk_ack_backlog++;
+       sk_acceptq_added(sk);
        skb_queue_tail(&sk->sk_receive_queue, skb);
        sk->sk_state_change(sk);
 }
index c74f44dfaa22a5020880ea218c6607ace8fd5e22..50d2c9749db36da84f0e84c254771ee5e6c9cef9 100644 (file)
@@ -705,7 +705,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags,
 
        /* put original socket back into a clean listen state. */
        sk->sk_state = TCP_LISTEN;
-       sk->sk_ack_backlog--;
+       sk_acceptq_removed(sk);
        dprintk("%s: ok success on %02X, client on %02X\n", __func__,
                llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
 frees:
index 6a0df7c8a939e4976aa2815127885e127dd864fc..46b8ff24020d7bb6788e985686bef12b4fbc83d0 100644 (file)
@@ -906,7 +906,7 @@ static int rose_accept(struct socket *sock, struct socket *newsock, int flags,
        /* Now attach up the new socket */
        skb->sk = NULL;
        kfree_skb(skb);
-       sk->sk_ack_backlog--;
+       sk_acceptq_removed(sk);
 
 out_release:
        release_sock(sk);
@@ -1011,7 +1011,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros
        make_rose->va        = 0;
        make_rose->vr        = 0;
        make_rose->vl        = 0;
-       sk->sk_ack_backlog++;
+       sk_acceptq_added(sk);
 
        rose_insert_socket(make);
 
index 1ba893b85dad79786ec3fd55c2870072c6c4efa9..1b9809ad772528b3596efc9ae96780dbc70f7cc2 100644 (file)
@@ -324,7 +324,7 @@ void sctp_association_free(struct sctp_association *asoc)
                 * socket.
                 */
                if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
-                       sk->sk_ack_backlog--;
+                       sk_acceptq_removed(sk);
        }
 
        /* Mark as dead, so other users can know this structure is
@@ -1073,7 +1073,7 @@ void sctp_assoc_migrate(struct sctp_association *assoc, struct sock *newsk)
 
        /* Decrement the backlog value for a TCP-style socket. */
        if (sctp_style(oldsk, TCP))
-               oldsk->sk_ack_backlog--;
+               sk_acceptq_removed(oldsk);
 
        /* Release references to the old endpoint and the sock.  */
        sctp_endpoint_put(assoc->ep);
index ea53049d1db663e63def7f5e7e22e788c7456d22..9d05b2e7bce24cad0633efd54ca7223b0426de9a 100644 (file)
@@ -164,7 +164,7 @@ void sctp_endpoint_add_asoc(struct sctp_endpoint *ep,
 
        /* Increment the backlog value for a TCP-style listening socket. */
        if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
-               sk->sk_ack_backlog++;
+               sk_acceptq_added(sk);
 }
 
 /* Free the endpoint structure.  Delay cleanup until
index c0856e74f44f4e561e9cc0a1aa490560b6651a5c..1f4fde4711b6177f859efb267c7a9c046d1ba60a 100644 (file)
@@ -439,7 +439,7 @@ static void vsock_pending_work(struct work_struct *work)
        if (vsock_is_pending(sk)) {
                vsock_remove_pending(listener, sk);
 
-               listener->sk_ack_backlog--;
+               sk_acceptq_removed(listener);
        } else if (!vsk->rejected) {
                /* We are not on the pending list and accept() did not reject
                 * us, so we must have been accepted by our user process.  We
@@ -1299,7 +1299,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
                err = -listener->sk_err;
 
        if (connected) {
-               listener->sk_ack_backlog--;
+               sk_acceptq_removed(listener);
 
                lock_sock_nested(connected, SINGLE_DEPTH_NESTING);
                vconnected = vsock_sk(connected);
index bef8772116ec82dc43df0120b3eb6987d111b858..7fa09c5e4625ca801ef3812d8c8cc836f38b08e9 100644 (file)
@@ -428,7 +428,7 @@ static void hvs_open_connection(struct vmbus_channel *chan)
 
        if (conn_from_host) {
                new->sk_state = TCP_ESTABLISHED;
-               sk->sk_ack_backlog++;
+               sk_acceptq_added(sk);
 
                hvs_addr_init(&vnew->local_addr, if_type);
                hvs_remote_addr_init(&vnew->remote_addr, &vnew->local_addr);
index d02c9b41a768e6a9a968e1b685a8ed2f390212e6..193f959e51efee2fb9ae8d8ed0a7c8d3f894a58d 100644 (file)
@@ -1066,7 +1066,7 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt)
                return -ENOMEM;
        }
 
-       sk->sk_ack_backlog++;
+       sk_acceptq_added(sk);
 
        lock_sock_nested(child, SINGLE_DEPTH_NESTING);
 
index 8c9c4ed90fa707b93208742a808253b81f67f489..6ba98a1efe2e08de7a99e92f3ee6a9a39e3f9086 100644 (file)
@@ -1098,7 +1098,7 @@ static int vmci_transport_recv_listen(struct sock *sk,
        }
 
        vsock_add_pending(sk, pending);
-       sk->sk_ack_backlog++;
+       sk_acceptq_added(sk);
 
        pending->sk_state = TCP_SYN_SENT;
        vmci_trans(vpending)->produce_size =
index 6aee9f5e8e7155461eac93074ba975bac3af08c7..c34f7d0776046f2c15b668b66f020be8008ea731 100644 (file)
@@ -891,7 +891,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags,
        /* Now attach up the new socket */
        skb->sk = NULL;
        kfree_skb(skb);
-       sk->sk_ack_backlog--;
+       sk_acceptq_removed(sk);
        newsock->state = SS_CONNECTED;
        rc = 0;
 out2:
@@ -1062,7 +1062,7 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
        skb_copy_from_linear_data(skb, makex25->calluserdata.cuddata, skb->len);
        makex25->calluserdata.cudlength = skb->len;
 
-       sk->sk_ack_backlog++;
+       sk_acceptq_added(sk);
 
        x25_insert_socket(make);