]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: smbdirect: introduce smbdirect_socket.send_io.lcredits.*
authorStefan Metzmacher <metze@samba.org>
Mon, 20 Oct 2025 18:35:58 +0000 (20:35 +0200)
committerSteve French <stfrench@microsoft.com>
Thu, 23 Oct 2025 01:10:19 +0000 (20:10 -0500)
This will be used to implement a logic in order to make sure
we don't overflow the send submission queue for ib_post_send().

We will initialize the local credits with the
fixed sp->send_credit_target value, which matches
the reserved slots in the submission queue for ib_post_send().

We will be a local credit first and then wait for a remote credit,
if we managed to get both we are allowed to post an
IB_WR_SEND[_WITH_INV]. The local credit is given back to
the pool when we get the local ib_post_send() completion,
while remote credits are granted by the peer.

From reading the git history of the linux smbdirect
implementations in client and server) it was seen
that a peer granted more credits than we requested.
I guess that only happened because of bugs in our
implementation which was active as client and server.
I guess Windows won't do that.

So the local credits make sure we only use the amount
of credits we asked for.

The client already has some logic for this based on
smbdirect_socket.send_io.pending.count, but that
counts in the order direction and makes it complex it
share common logic for various credits classes.
That logic will be replaced soon.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
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/common/smbdirect/smbdirect_socket.h

index 361db7f9f623ede8e2687af00ae0c2d79948c1cf..ee5a90d691c898ea03f9d44adbdd3d6dbb29c667 100644 (file)
@@ -142,7 +142,15 @@ struct smbdirect_socket {
                } mem;
 
                /*
-                * The credit state for the send side
+                * The local credit state for ib_post_send()
+                */
+               struct {
+                       atomic_t count;
+                       wait_queue_head_t wait_queue;
+               } lcredits;
+
+               /*
+                * The remote credit state for the send side
                 */
                struct {
                        atomic_t count;
@@ -337,6 +345,9 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)
        INIT_DELAYED_WORK(&sc->idle.timer_work, __smbdirect_socket_disabled_work);
        disable_delayed_work_sync(&sc->idle.timer_work);
 
+       atomic_set(&sc->send_io.lcredits.count, 0);
+       init_waitqueue_head(&sc->send_io.lcredits.wait_queue);
+
        atomic_set(&sc->send_io.credits.count, 0);
        init_waitqueue_head(&sc->send_io.credits.wait_queue);