aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2025-08-11 17:12:58 +0200
committerSteve French <stfrench@microsoft.com>2025-09-28 18:29:52 -0500
commit2def28338a19f03a15a99d7df46930e6be6944e8 (patch)
treeb04cd88ce302dfefb03c6a70444f6954d31a4da2
parentsmb: server: make use of smbdirect_socket.send_io.pending.{count,zero_wait_qu... (diff)
downloadlinux-2def28338a19f03a15a99d7df46930e6be6944e8.tar.gz
linux-2def28338a19f03a15a99d7df46930e6be6944e8.zip
smb: server: make use of smbdirect_socket.send_io.credits.{count,wait_queue}
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>
-rw-r--r--fs/smb/server/transport_rdma.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c
index d8f0f252e401..256970c72586 100644
--- a/fs/smb/server/transport_rdma.c
+++ b/fs/smb/server/transport_rdma.c
@@ -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;