]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: don't use delayed_work for post_recv_credits_work
authorStefan Metzmacher <metze@samba.org>
Fri, 8 Aug 2025 15:55:17 +0000 (17:55 +0200)
committerSteve French <stfrench@microsoft.com>
Mon, 22 Sep 2025 00:34:52 +0000 (19:34 -0500)
If we are using a hardcoded delay of 0 there's no point in
using delayed_work it only adds confusion.

The client also uses a normal work_struct and now
it is easier to move it to the common smbdirect_socket.

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
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 6550bd9f002c27d9503b3f9ee4199e64e4b5f415..10a6b4ed1a037bbaaa6c3702cf56e6ccb6ccc3a8 100644 (file)
@@ -148,7 +148,7 @@ struct smb_direct_transport {
        wait_queue_head_t       wait_send_pending;
        atomic_t                send_pending;
 
-       struct delayed_work     post_recv_credits_work;
+       struct work_struct      post_recv_credits_work;
        struct work_struct      send_immediate_work;
        struct work_struct      disconnect_work;
 
@@ -367,8 +367,8 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
 
        spin_lock_init(&t->lock_new_recv_credits);
 
-       INIT_DELAYED_WORK(&t->post_recv_credits_work,
-                         smb_direct_post_recv_credits);
+       INIT_WORK(&t->post_recv_credits_work,
+                 smb_direct_post_recv_credits);
        INIT_WORK(&t->send_immediate_work, smb_direct_send_immediate_work);
        INIT_WORK(&t->disconnect_work, smb_direct_disconnect_rdma_work);
 
@@ -400,7 +400,7 @@ static void free_transport(struct smb_direct_transport *t)
                   atomic_read(&t->send_pending) == 0);
 
        cancel_work_sync(&t->disconnect_work);
-       cancel_delayed_work_sync(&t->post_recv_credits_work);
+       cancel_work_sync(&t->post_recv_credits_work);
        cancel_work_sync(&t->send_immediate_work);
 
        if (t->qp) {
@@ -615,8 +615,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                        wake_up_interruptible(&t->wait_send_credits);
 
                if (is_receive_credit_post_required(receive_credits, avail_recvmsg_count))
-                       mod_delayed_work(smb_direct_wq,
-                                        &t->post_recv_credits_work, 0);
+                       queue_work(smb_direct_wq, &t->post_recv_credits_work);
 
                if (data_length) {
                        enqueue_reassembly(t, recvmsg, (int)data_length);
@@ -773,8 +772,7 @@ again:
                st->count_avail_recvmsg += queue_removed;
                if (is_receive_credit_post_required(st->recv_credits, st->count_avail_recvmsg)) {
                        spin_unlock(&st->receive_credit_lock);
-                       mod_delayed_work(smb_direct_wq,
-                                        &st->post_recv_credits_work, 0);
+                       queue_work(smb_direct_wq, &st->post_recv_credits_work);
                } else {
                        spin_unlock(&st->receive_credit_lock);
                }
@@ -801,7 +799,7 @@ read_rfc1002_done:
 static void smb_direct_post_recv_credits(struct work_struct *work)
 {
        struct smb_direct_transport *t = container_of(work,
-               struct smb_direct_transport, post_recv_credits_work.work);
+               struct smb_direct_transport, post_recv_credits_work);
        struct smb_direct_recvmsg *recvmsg;
        int receive_credits, credits = 0;
        int ret;
@@ -1734,7 +1732,7 @@ static int smb_direct_prepare_negotiation(struct smb_direct_transport *t)
                goto out_err;
        }
 
-       smb_direct_post_recv_credits(&t->post_recv_credits_work.work);
+       smb_direct_post_recv_credits(&t->post_recv_credits_work);
        return 0;
 out_err:
        put_recvmsg(t, recvmsg);