]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: make use of smbdirect_socket.send_io.credits.{count,wait_queue}
authorStefan Metzmacher <metze@samba.org>
Mon, 11 Aug 2025 15:12:58 +0000 (17:12 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:52 +0000 (18:29 -0500)
This will is used by the client already and will allow to create
common helper functions.

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 d8f0f252e401154c00619853e17a065e4db7eb43..256970c7258615f8aa9e28fcc19bd41beb408b08 100644 (file)
@@ -96,14 +96,12 @@ struct smb_direct_transport {
        int                     recv_credits;
        int                     recv_credit_target;
 
-       atomic_t                send_credits;
        spinlock_t              lock_new_recv_credits;
        int                     new_recv_credits;
        int                     max_rw_credits;
        int                     pages_per_rw_credit;
        atomic_t                rw_credits;
 
-       wait_queue_head_t       wait_send_credits;
        wait_queue_head_t       wait_rw_credits;
 
        struct work_struct      post_recv_credits_work;
@@ -334,7 +332,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
 
        sc->ib.dev = sc->rdma.cm_id->device;
 
-       init_waitqueue_head(&t->wait_send_credits);
        init_waitqueue_head(&t->wait_rw_credits);
 
        spin_lock_init(&t->receive_credit_lock);
@@ -374,7 +371,7 @@ static void free_transport(struct smb_direct_transport *t)
                                         sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
        }
 
-       wake_up_all(&t->wait_send_credits);
+       wake_up_all(&sc->send_io.credits.wait_queue);
        wake_up_all(&sc->send_io.pending.zero_wait_queue);
 
        disable_work_sync(&t->post_recv_credits_work);
@@ -588,14 +585,14 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                t->recv_credit_target =
                                le16_to_cpu(data_transfer->credits_requested);
                atomic_add(le16_to_cpu(data_transfer->credits_granted),
-                          &t->send_credits);
+                          &sc->send_io.credits.count);
 
                if (le16_to_cpu(data_transfer->flags) &
                    SMBDIRECT_FLAG_RESPONSE_REQUESTED)
                        queue_work(smb_direct_wq, &t->send_immediate_work);
 
-               if (atomic_read(&t->send_credits) > 0)
-                       wake_up(&t->wait_send_credits);
+               if (atomic_read(&sc->send_io.credits.count) > 0)
+                       wake_up(&sc->send_io.credits.wait_queue);
 
                if (data_length) {
                        if (t->recv_credit_target > old_recv_credit_target)
@@ -901,6 +898,7 @@ static int smb_direct_flush_send_list(struct smb_direct_transport *t,
                                      struct smb_direct_send_ctx *send_ctx,
                                      bool is_last)
 {
+       struct smbdirect_socket *sc = &t->socket;
        struct smbdirect_send_io *first, *last;
        int ret;
 
@@ -927,8 +925,8 @@ static int smb_direct_flush_send_list(struct smb_direct_transport *t,
                                         send_ctx->need_invalidate_rkey,
                                         send_ctx->remote_key);
        } else {
-               atomic_add(send_ctx->wr_cnt, &t->send_credits);
-               wake_up(&t->wait_send_credits);
+               atomic_add(send_ctx->wr_cnt, &sc->send_io.credits.count);
+               wake_up(&sc->send_io.credits.wait_queue);
                list_for_each_entry_safe(first, last, &send_ctx->msg_list,
                                         sibling_list) {
                        smb_direct_free_sendmsg(t, first);
@@ -963,16 +961,17 @@ static int wait_for_credits(struct smb_direct_transport *t,
 static int wait_for_send_credits(struct smb_direct_transport *t,
                                 struct smb_direct_send_ctx *send_ctx)
 {
+       struct smbdirect_socket *sc = &t->socket;
        int ret;
 
        if (send_ctx &&
-           (send_ctx->wr_cnt >= 16 || atomic_read(&t->send_credits) <= 1)) {
+           (send_ctx->wr_cnt >= 16 || atomic_read(&sc->send_io.credits.count) <= 1)) {
                ret = smb_direct_flush_send_list(t, send_ctx, false);
                if (ret)
                        return ret;
        }
 
-       return wait_for_credits(t, &t->wait_send_credits, &t->send_credits, 1);
+       return wait_for_credits(t, &sc->send_io.credits.wait_queue, &sc->send_io.credits.count, 1);
 }
 
 static int wait_for_rw_credits(struct smb_direct_transport *t, int credits)
@@ -1155,7 +1154,7 @@ static int smb_direct_post_send_data(struct smb_direct_transport *t,
        ret = smb_direct_create_header(t, data_length, remaining_data_length,
                                       &msg);
        if (ret) {
-               atomic_inc(&t->send_credits);
+               atomic_inc(&sc->send_io.credits.count);
                return ret;
        }
 
@@ -1195,7 +1194,7 @@ static int smb_direct_post_send_data(struct smb_direct_transport *t,
        return 0;
 err:
        smb_direct_free_sendmsg(t, msg);
-       atomic_inc(&t->send_credits);
+       atomic_inc(&sc->send_io.credits.count);
        return ret;
 }
 
@@ -1581,7 +1580,7 @@ static int smb_direct_cm_handler(struct rdma_cm_id *cm_id,
                smb_direct_disconnect_rdma_work(&sc->disconnect_work);
                wake_up_all(&sc->status_wait);
                wake_up_all(&sc->recv_io.reassembly.wait_queue);
-               wake_up_all(&t->wait_send_credits);
+               wake_up_all(&sc->send_io.credits.wait_queue);
                break;
        }
        case RDMA_CM_EVENT_CONNECT_ERROR: {
@@ -1844,7 +1843,6 @@ static int smb_direct_init_params(struct smb_direct_transport *t,
        t->new_recv_credits = 0;
 
        sp->send_credit_target = smb_direct_send_credit_target;
-       atomic_set(&t->send_credits, 0);
        atomic_set(&t->rw_credits, t->max_rw_credits);
 
        sp->max_send_size = smb_direct_max_send_size;