mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 19:47:08 +02:00
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>
This commit is contained in:
parent
fd0ad9c521
commit
2def28338a
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user