From: Stefan Metzmacher Date: Fri, 17 Oct 2025 13:45:01 +0000 (+0200) Subject: smb: server: make use of smbdirect_connection_grant_recv_credits() X-Git-Tag: v7.1-rc1~128^2~26 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0a1702e9319f428e2e24a6f4b7109d212296f812;p=thirdparty%2Flinux.git smb: server: make use of smbdirect_connection_grant_recv_credits() This is already used by the client too and will help to share more common code. Cc: Namjae Jeon Cc: Steve French Cc: Tom Talpey Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Acked-by: Namjae Jeon Signed-off-by: Steve French --- diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c index 9f13f96978cd3..278dca9124859 100644 --- a/fs/smb/server/transport_rdma.c +++ b/fs/smb/server/transport_rdma.c @@ -618,43 +618,6 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf, return ret; } -static int manage_credits_prior_sending(struct smbdirect_socket *sc) -{ - int missing; - int available; - int new_credits; - - if (atomic_read(&sc->recv_io.credits.count) >= sc->recv_io.credits.target) - return 0; - - missing = (int)sc->recv_io.credits.target - atomic_read(&sc->recv_io.credits.count); - available = atomic_xchg(&sc->recv_io.credits.available, 0); - new_credits = (u16)min3(U16_MAX, missing, available); - if (new_credits <= 0) { - /* - * If credits are available, but not granted - * we need to re-add them again. - */ - if (available) - atomic_add(available, &sc->recv_io.credits.available); - return 0; - } - - if (new_credits < available) { - /* - * Readd the remaining available again. - */ - available -= new_credits; - atomic_add(available, &sc->recv_io.credits.available); - } - - /* - * Remember we granted the credits - */ - atomic_add(new_credits, &sc->recv_io.credits.count); - return new_credits; -} - static int manage_keep_alive_before_sending(struct smbdirect_socket *sc) { struct smbdirect_socket_parameters *sp = &sc->parameters; @@ -931,7 +894,7 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc, struct smbdirect_send_io *msg; int data_length; struct smbdirect_send_batch _send_ctx; - int new_credits; + u16 new_credits; if (!send_ctx) { smb_direct_send_ctx_init(&_send_ctx, false, 0); @@ -950,7 +913,7 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc, if (ret) goto credit_failed; - new_credits = manage_credits_prior_sending(sc); + new_credits = smbdirect_connection_grant_recv_credits(sc); if (new_credits == 0 && atomic_read(&sc->send_io.credits.count) == 0 && atomic_read(&sc->recv_io.credits.count) == 0) { @@ -964,7 +927,7 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc, if (ret < 0) goto credit_failed; - new_credits = manage_credits_prior_sending(sc); + new_credits = smbdirect_connection_grant_recv_credits(sc); } data_length = 0; @@ -1307,7 +1270,7 @@ static int smb_direct_send_negotiate_response(struct smbdirect_socket *sc, resp->reserved = 0; resp->credits_requested = cpu_to_le16(sp->send_credit_target); - resp->credits_granted = cpu_to_le16(manage_credits_prior_sending(sc)); + resp->credits_granted = cpu_to_le16(smbdirect_connection_grant_recv_credits(sc)); resp->max_readwrite_size = cpu_to_le32(sp->max_read_write_size); resp->preferred_send_size = cpu_to_le32(sp->max_send_size); resp->max_receive_size = cpu_to_le32(sp->max_recv_size);