]> www.infradead.org Git - users/hch/misc.git/commitdiff
rxrpc: Fix locking issues with the peer record hash
authorDavid Howells <dhowells@redhat.com>
Tue, 18 Feb 2025 19:22:46 +0000 (19:22 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 21 Feb 2025 23:06:29 +0000 (15:06 -0800)
rxrpc_new_incoming_peer() can't use spin_lock_bh() whilst its caller has
interrupts disabled.

    WARNING: CPU: 0 PID: 1550 at kernel/softirq.c:369 __local_bh_enable_ip+0x46/0xd0
    ...
    Call Trace:
     rxrpc_alloc_incoming_call+0x1b0/0x400
     rxrpc_new_incoming_call+0x1dd/0x5e0
     rxrpc_input_packet+0x84a/0x920
     rxrpc_io_thread+0x40d/0xb40
     kthread+0x2ec/0x300
     ret_from_fork+0x24/0x40
     ret_from_fork_asm+0x1a/0x30
     </TASK>
    irq event stamp: 1811
    hardirqs last  enabled at (1809): _raw_spin_unlock_irq+0x24/0x50
    hardirqs last disabled at (1810): _raw_read_lock_irq+0x17/0x70
    softirqs last  enabled at (1182): handle_softirqs+0x3ee/0x430
    softirqs last disabled at (1811): rxrpc_new_incoming_peer+0x56/0x120

Fix this by using a plain spin_lock() instead.  IRQs are held, so softirqs
can't happen.

Fixes: a2ea9a907260 ("rxrpc: Use irq-disabling spinlocks between app and I/O thread")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
Link: https://patch.msgid.link/20250218192250.296870-4-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/rxrpc/peer_object.c

index 2ddc8ed68742924dc83dc3cce89af95896a42b74..56e09d161a97f538964f1a0c0003f2b3a1bc4c98 100644 (file)
@@ -324,10 +324,10 @@ void rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer)
        hash_key = rxrpc_peer_hash_key(local, &peer->srx);
        rxrpc_init_peer(local, peer, hash_key);
 
-       spin_lock_bh(&rxnet->peer_hash_lock);
+       spin_lock(&rxnet->peer_hash_lock);
        hash_add_rcu(rxnet->peer_hash, &peer->hash_link, hash_key);
        list_add_tail(&peer->keepalive_link, &rxnet->peer_keepalive_new);
-       spin_unlock_bh(&rxnet->peer_hash_lock);
+       spin_unlock(&rxnet->peer_hash_lock);
 }
 
 /*