]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb: server: remove separate empty_recvmsg_queue
authorStefan Metzmacher <metze@samba.org>
Mon, 4 Aug 2025 12:15:50 +0000 (14:15 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 6 Aug 2025 19:09:57 +0000 (14:09 -0500)
There's no need to maintain two lists, we can just
have a single list of receive buffers, which are free to use.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Fixes: 0626e6641f6b ("cifsd: add server handler for central processing and tranport layers")
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 c6cbe0d56e32122d33e45570cb97494a3ae5b344..393254109fc41521c982870f98b39e60d2efd341 100644 (file)
@@ -129,9 +129,6 @@ struct smb_direct_transport {
        spinlock_t              recvmsg_queue_lock;
        struct list_head        recvmsg_queue;
 
-       spinlock_t              empty_recvmsg_queue_lock;
-       struct list_head        empty_recvmsg_queue;
-
        int                     send_credit_target;
        atomic_t                send_credits;
        spinlock_t              lock_new_recv_credits;
@@ -276,32 +273,6 @@ static void put_recvmsg(struct smb_direct_transport *t,
        spin_unlock(&t->recvmsg_queue_lock);
 }
 
-static struct
-smb_direct_recvmsg *get_empty_recvmsg(struct smb_direct_transport *t)
-{
-       struct smb_direct_recvmsg *recvmsg = NULL;
-
-       spin_lock(&t->empty_recvmsg_queue_lock);
-       if (!list_empty(&t->empty_recvmsg_queue)) {
-               recvmsg = list_first_entry(&t->empty_recvmsg_queue,
-                                          struct smb_direct_recvmsg, list);
-               list_del(&recvmsg->list);
-       }
-       spin_unlock(&t->empty_recvmsg_queue_lock);
-       return recvmsg;
-}
-
-static void put_empty_recvmsg(struct smb_direct_transport *t,
-                             struct smb_direct_recvmsg *recvmsg)
-{
-       ib_dma_unmap_single(t->cm_id->device, recvmsg->sge.addr,
-                           recvmsg->sge.length, DMA_FROM_DEVICE);
-
-       spin_lock(&t->empty_recvmsg_queue_lock);
-       list_add_tail(&recvmsg->list, &t->empty_recvmsg_queue);
-       spin_unlock(&t->empty_recvmsg_queue_lock);
-}
-
 static void enqueue_reassembly(struct smb_direct_transport *t,
                               struct smb_direct_recvmsg *recvmsg,
                               int data_length)
@@ -386,9 +357,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
        spin_lock_init(&t->recvmsg_queue_lock);
        INIT_LIST_HEAD(&t->recvmsg_queue);
 
-       spin_lock_init(&t->empty_recvmsg_queue_lock);
-       INIT_LIST_HEAD(&t->empty_recvmsg_queue);
-
        init_waitqueue_head(&t->wait_send_pending);
        atomic_set(&t->send_pending, 0);
 
@@ -554,7 +522,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                               wc->opcode);
                        smb_direct_disconnect_rdma_connection(t);
                }
-               put_empty_recvmsg(t, recvmsg);
+               put_recvmsg(t, recvmsg);
                return;
        }
 
@@ -568,7 +536,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
        switch (recvmsg->type) {
        case SMB_DIRECT_MSG_NEGOTIATE_REQ:
                if (wc->byte_len < sizeof(struct smb_direct_negotiate_req)) {
-                       put_empty_recvmsg(t, recvmsg);
+                       put_recvmsg(t, recvmsg);
                        return;
                }
                t->negotiation_requested = true;
@@ -585,7 +553,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
 
                if (wc->byte_len <
                    offsetof(struct smb_direct_data_transfer, padding)) {
-                       put_empty_recvmsg(t, recvmsg);
+                       put_recvmsg(t, recvmsg);
                        return;
                }
 
@@ -593,7 +561,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                if (data_length) {
                        if (wc->byte_len < sizeof(struct smb_direct_data_transfer) +
                            (u64)data_length) {
-                               put_empty_recvmsg(t, recvmsg);
+                               put_recvmsg(t, recvmsg);
                                return;
                        }
 
@@ -613,7 +581,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                        avail_recvmsg_count = t->count_avail_recvmsg;
                        spin_unlock(&t->receive_credit_lock);
                } else {
-                       put_empty_recvmsg(t, recvmsg);
+                       put_recvmsg(t, recvmsg);
 
                        spin_lock(&t->receive_credit_lock);
                        receive_credits = --(t->recv_credits);
@@ -811,7 +779,6 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
        struct smb_direct_recvmsg *recvmsg;
        int receive_credits, credits = 0;
        int ret;
-       int use_free = 1;
 
        spin_lock(&t->receive_credit_lock);
        receive_credits = t->recv_credits;
@@ -819,18 +786,9 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
 
        if (receive_credits < t->recv_credit_target) {
                while (true) {
-                       if (use_free)
-                               recvmsg = get_free_recvmsg(t);
-                       else
-                               recvmsg = get_empty_recvmsg(t);
-                       if (!recvmsg) {
-                               if (use_free) {
-                                       use_free = 0;
-                                       continue;
-                               } else {
-                                       break;
-                               }
-                       }
+                       recvmsg = get_free_recvmsg(t);
+                       if (!recvmsg)
+                               break;
 
                        recvmsg->type = SMB_DIRECT_MSG_DATA_TRANSFER;
                        recvmsg->first_segment = false;
@@ -1806,8 +1764,6 @@ static void smb_direct_destroy_pools(struct smb_direct_transport *t)
 
        while ((recvmsg = get_free_recvmsg(t)))
                mempool_free(recvmsg, t->recvmsg_mempool);
-       while ((recvmsg = get_empty_recvmsg(t)))
-               mempool_free(recvmsg, t->recvmsg_mempool);
 
        mempool_destroy(t->recvmsg_mempool);
        t->recvmsg_mempool = NULL;