rxrpc: Convert call->recvmsg_lock to a spinlock
authorDavid Howells <dhowells@redhat.com>
Wed, 12 Oct 2022 21:06:52 +0000 (22:06 +0100)
committerDavid Howells <dhowells@redhat.com>
Tue, 31 Jan 2023 16:38:07 +0000 (16:38 +0000)
Convert call->recvmsg_lock to a spinlock as it's only ever write-locked.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org

net/rxrpc/af_rxrpc.c
net/rxrpc/ar-internal.h
net/rxrpc/call_object.c
net/rxrpc/recvmsg.c

index ebbd4a1..102f5cb 100644 (file)
@@ -786,7 +786,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
        INIT_LIST_HEAD(&rx->sock_calls);
        INIT_LIST_HEAD(&rx->to_be_accepted);
        INIT_LIST_HEAD(&rx->recvmsg_q);
-       rwlock_init(&rx->recvmsg_lock);
+       spin_lock_init(&rx->recvmsg_lock);
        rwlock_init(&rx->call_lock);
        memset(&rx->srx, 0, sizeof(rx->srx));
 
index 433060c..808c08c 100644 (file)
@@ -149,7 +149,7 @@ struct rxrpc_sock {
        struct list_head        sock_calls;     /* List of calls owned by this socket */
        struct list_head        to_be_accepted; /* calls awaiting acceptance */
        struct list_head        recvmsg_q;      /* Calls awaiting recvmsg's attention  */
-       rwlock_t                recvmsg_lock;   /* Lock for recvmsg_q */
+       spinlock_t              recvmsg_lock;   /* Lock for recvmsg_q */
        struct key              *key;           /* security for this socket */
        struct key              *securities;    /* list of server security descriptors */
        struct rb_root          calls;          /* User ID -> call mapping */
index f3c9f02..0012589 100644 (file)
@@ -560,7 +560,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
        rxrpc_put_call_slot(call);
 
        /* Make sure we don't get any more notifications */
-       write_lock(&rx->recvmsg_lock);
+       spin_lock(&rx->recvmsg_lock);
 
        if (!list_empty(&call->recvmsg_link)) {
                _debug("unlinking once-pending call %p { e=%lx f=%lx }",
@@ -573,7 +573,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
        call->recvmsg_link.next = NULL;
        call->recvmsg_link.prev = NULL;
 
-       write_unlock(&rx->recvmsg_lock);
+       spin_unlock(&rx->recvmsg_lock);
        if (put)
                rxrpc_put_call(call, rxrpc_call_put_unnotify);
 
index dd54cee..b7545fd 100644 (file)
@@ -40,12 +40,12 @@ void rxrpc_notify_socket(struct rxrpc_call *call)
                        call->notify_rx(sk, call, call->user_call_ID);
                        spin_unlock(&call->notify_lock);
                } else {
-                       write_lock(&rx->recvmsg_lock);
+                       spin_lock(&rx->recvmsg_lock);
                        if (list_empty(&call->recvmsg_link)) {
                                rxrpc_get_call(call, rxrpc_call_get_notify_socket);
                                list_add_tail(&call->recvmsg_link, &rx->recvmsg_q);
                        }
-                       write_unlock(&rx->recvmsg_lock);
+                       spin_unlock(&rx->recvmsg_lock);
 
                        if (!sock_flag(sk, SOCK_DEAD)) {
                                _debug("call %ps", sk->sk_data_ready);
@@ -335,14 +335,14 @@ try_again:
        /* Find the next call and dequeue it if we're not just peeking.  If we
         * do dequeue it, that comes with a ref that we will need to release.
         */
-       write_lock(&rx->recvmsg_lock);
+       spin_lock(&rx->recvmsg_lock);
        l = rx->recvmsg_q.next;
        call = list_entry(l, struct rxrpc_call, recvmsg_link);
        if (!(flags & MSG_PEEK))
                list_del_init(&call->recvmsg_link);
        else
                rxrpc_get_call(call, rxrpc_call_get_recvmsg);
-       write_unlock(&rx->recvmsg_lock);
+       spin_unlock(&rx->recvmsg_lock);
 
        call_debug_id = call->debug_id;
        trace_rxrpc_recvmsg(call_debug_id, rxrpc_recvmsg_dequeue, 0);
@@ -431,9 +431,9 @@ error_unlock_call:
 
 error_requeue_call:
        if (!(flags & MSG_PEEK)) {
-               write_lock(&rx->recvmsg_lock);
+               spin_lock(&rx->recvmsg_lock);
                list_add(&call->recvmsg_link, &rx->recvmsg_q);
-               write_unlock(&rx->recvmsg_lock);
+               spin_unlock(&rx->recvmsg_lock);
                trace_rxrpc_recvmsg(call_debug_id, rxrpc_recvmsg_requeue, 0);
        } else {
                rxrpc_put_call(call, rxrpc_call_put_recvmsg);