summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2025-09-18 21:39:25 +0200
committerSteve French <stfrench@microsoft.com>2026-04-15 21:58:21 -0500
commit73ec624781cd7a43a2dbad8c7d40133703089224 (patch)
treea16fd41781de7a372d494879e9c16c24bddc88f7
parent26003faa7d477eed4ceb5b5b49e4eb4a77bf2f6f (diff)
downloadlwn-73ec624781cd7a43a2dbad8c7d40133703089224.tar.gz
lwn-73ec624781cd7a43a2dbad8c7d40133703089224.zip
smb: client: make use of smbdirect_connection_recv_io_refill_work()
This is basically a copy of smbd_post_send_credits(), but there are several improvements compared to the existing function: We calculate the number of missing posted buffers by getting the difference between recv_io.credits.target and recv_io.posted.count. Instead of the difference between recv_io.credits.target and recv_io.credits.count, because recv_io.credits.count is only updated once a message is send to the peer. It was not really a problem before, because we have a fixed number smbdirect_recv_io buffers, so the loop terminated when smbdirect_connection_get_recv_io() returns NULL. But using recv_io.posted.count makes it easier to understand. 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>
-rw-r--r--fs/smb/client/smbdirect.c54
1 files changed, 1 insertions, 53 deletions
diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c
index f8b204a9d304..e66fd17ffc67 100644
--- a/fs/smb/client/smbdirect.c
+++ b/fs/smb/client/smbdirect.c
@@ -400,58 +400,6 @@ static bool process_negotiation_response(
return true;
}
-static void smbd_post_send_credits(struct work_struct *work)
-{
- int rc;
- struct smbdirect_recv_io *response;
- struct smbdirect_socket *sc =
- container_of(work, struct smbdirect_socket, recv_io.posted.refill_work);
- int posted = 0;
-
- if (sc->status != SMBDIRECT_SOCKET_CONNECTED) {
- return;
- }
-
- if (sc->recv_io.credits.target >
- atomic_read(&sc->recv_io.credits.count)) {
- while (true) {
- response = smbdirect_connection_get_recv_io(sc);
- if (!response)
- break;
-
- response->first_segment = false;
- rc = smbdirect_connection_post_recv_io(response);
- if (rc) {
- log_rdma_recv(ERR,
- "post_recv failed rc=%d\n", rc);
- smbdirect_connection_put_recv_io(response);
- break;
- }
-
- atomic_inc(&sc->recv_io.posted.count);
- posted += 1;
- }
- }
-
- atomic_add(posted, &sc->recv_io.credits.available);
-
- /*
- * If the last send credit is waiting for credits
- * it can grant we need to wake it up
- */
- if (posted &&
- atomic_read(&sc->send_io.bcredits.count) == 0 &&
- atomic_read(&sc->send_io.credits.count) == 0)
- wake_up(&sc->send_io.credits.wait_queue);
-
- /* Promptly send an immediate packet as defined in [MS-SMBD] 3.1.1.1 */
- if (atomic_read(&sc->recv_io.credits.count) <
- sc->recv_io.credits.target - 1) {
- log_keep_alive(INFO, "schedule send of an empty message\n");
- queue_work(sc->workqueue, &sc->idle.immediate_work);
- }
-}
-
/* Called from softirq, when recv is done */
static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
{
@@ -1607,7 +1555,7 @@ static struct smbd_connection *_smbd_get_connection(
mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
msecs_to_jiffies(sp->negotiate_timeout_msec));
- INIT_WORK(&sc->recv_io.posted.refill_work, smbd_post_send_credits);
+ INIT_WORK(&sc->recv_io.posted.refill_work, smbdirect_connection_recv_io_refill_work);
rc = smbd_negotiate(sc);
if (rc) {