]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: make use of smbdirect_socket.recv_io.free.{list,lock}
authorStefan Metzmacher <metze@samba.org>
Wed, 6 Aug 2025 17:36:00 +0000 (19:36 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:51 +0000 (18:29 -0500)
This is already used by the client and will allow us to
add common helper functions soon.

Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/transport_rdma.c

index c4e786f2e7e7c706a7515dd1858dcbd247402e81..8eec651e2f9eaae9e868251b80ab190d37bd15cb 100644 (file)
@@ -110,9 +110,6 @@ struct smb_direct_transport {
        int                     count_avail_recvmsg;
        int                     recv_credit_target;
 
-       spinlock_t              recvmsg_queue_lock;
-       struct list_head        recvmsg_queue;
-
        atomic_t                send_credits;
        spinlock_t              lock_new_recv_credits;
        int                     new_recv_credits;
@@ -222,16 +219,17 @@ static inline bool is_receive_credit_post_required(int receive_credits,
 static struct
 smbdirect_recv_io *get_free_recvmsg(struct smb_direct_transport *t)
 {
+       struct smbdirect_socket *sc = &t->socket;
        struct smbdirect_recv_io *recvmsg = NULL;
 
-       spin_lock(&t->recvmsg_queue_lock);
-       if (!list_empty(&t->recvmsg_queue)) {
-               recvmsg = list_first_entry(&t->recvmsg_queue,
+       spin_lock(&sc->recv_io.free.lock);
+       if (!list_empty(&sc->recv_io.free.list)) {
+               recvmsg = list_first_entry(&sc->recv_io.free.list,
                                           struct smbdirect_recv_io,
                                           list);
                list_del(&recvmsg->list);
        }
-       spin_unlock(&t->recvmsg_queue_lock);
+       spin_unlock(&sc->recv_io.free.lock);
        return recvmsg;
 }
 
@@ -248,9 +246,9 @@ static void put_recvmsg(struct smb_direct_transport *t,
                recvmsg->sge.length = 0;
        }
 
-       spin_lock(&t->recvmsg_queue_lock);
-       list_add(&recvmsg->list, &t->recvmsg_queue);
-       spin_unlock(&t->recvmsg_queue_lock);
+       spin_lock(&sc->recv_io.free.lock);
+       list_add(&recvmsg->list, &sc->recv_io.free.list);
+       spin_unlock(&sc->recv_io.free.lock);
 }
 
 static void enqueue_reassembly(struct smb_direct_transport *t,
@@ -333,6 +331,9 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
 
        sc->ib.dev = sc->rdma.cm_id->device;
 
+       INIT_LIST_HEAD(&sc->recv_io.free.list);
+       spin_lock_init(&sc->recv_io.free.lock);
+
        sc->status = SMBDIRECT_SOCKET_CREATED;
        init_waitqueue_head(&t->wait_status);
 
@@ -345,8 +346,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
        init_waitqueue_head(&t->wait_rw_credits);
 
        spin_lock_init(&t->receive_credit_lock);
-       spin_lock_init(&t->recvmsg_queue_lock);
-       INIT_LIST_HEAD(&t->recvmsg_queue);
 
        init_waitqueue_head(&t->wait_send_pending);
        atomic_set(&t->send_pending, 0);
@@ -1925,15 +1924,13 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
        if (!t->recvmsg_mempool)
                goto err;
 
-       INIT_LIST_HEAD(&t->recvmsg_queue);
-
        for (i = 0; i < sp->recv_credit_max; i++) {
                recvmsg = mempool_alloc(t->recvmsg_mempool, KSMBD_DEFAULT_GFP);
                if (!recvmsg)
                        goto err;
                recvmsg->socket = sc;
                recvmsg->sge.length = 0;
-               list_add(&recvmsg->list, &t->recvmsg_queue);
+               list_add(&recvmsg->list, &sc->recv_io.free.list);
        }
        t->count_avail_recvmsg = sp->recv_credit_max;