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;
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);
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);
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)
struct smb_direct_send_ctx *send_ctx,
bool is_last)
{
+ struct smbdirect_socket *sc = &t->socket;
struct smbdirect_send_io *first, *last;
int ret;
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);
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)
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;
}
return 0;
err:
smb_direct_free_sendmsg(t, msg);
- atomic_inc(&t->send_credits);
+ atomic_inc(&sc->send_io.credits.count);
return ret;
}
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: {
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;