*/
INIT_DELAYED_WORK(&sc->idle.timer_work, smbdirect_connection_idle_timer_work);
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->negotiate_timeout_msec));
return 0;
if (!sc->first_error) {
INIT_WORK(&sc->connect.work, smbdirect_accept_negotiate_recv_work);
if (sc->status == SMBDIRECT_SOCKET_NEGOTIATE_NEEDED)
- queue_work(sc->workqueue, &sc->connect.work);
+ queue_work(sc->workqueues.accept, &sc->connect.work);
}
spin_unlock_irqrestore(&sc->connect.lock, flags);
* order to trigger our next keepalive message.
*/
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->keepalive_interval_msec));
/*
sc->status = SMBDIRECT_SOCKET_NEGOTIATE_NEEDED;
spin_lock_irqsave(&sc->connect.lock, flags);
if (!sc->first_error)
- queue_work(sc->workqueue, &sc->connect.work);
+ queue_work(sc->workqueues.accept, &sc->connect.work);
spin_unlock_irqrestore(&sc->connect.lock, flags);
/*
*/
INIT_DELAYED_WORK(&sc->idle.timer_work, smbdirect_connection_idle_timer_work);
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->rdma_connect_timeout_msec));
return 0;
* so that the timer will cause a disconnect.
*/
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->negotiate_timeout_msec));
return 0;
if (!sc->first_error) {
INIT_WORK(&sc->connect.work, smbdirect_connect_negotiate_recv_work);
if (sc->status == SMBDIRECT_SOCKET_NEGOTIATE_RUNNING)
- queue_work(sc->workqueue, &sc->connect.work);
+ queue_work(sc->workqueues.connect, &sc->connect.work);
}
spin_unlock_irqrestore(&sc->connect.lock, flags);
* order to trigger our next keepalive message.
*/
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->keepalive_interval_msec));
/*
sc->statistics.put_receive_buffer++;
spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
- queue_work(sc->workqueue, &sc->recv_io.posted.refill_work);
+ queue_work(sc->workqueues.refill, &sc->recv_io.posted.refill_work);
}
__SMBDIRECT_PRIVATE__
* in order to wait for a response
*/
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->keepalive_timeout_msec));
smbdirect_log_keep_alive(sc, SMBDIRECT_LOG_INFO,
"schedule send of empty idle message\n");
- queue_work(sc->workqueue, &sc->idle.immediate_work);
+ queue_work(sc->workqueues.immediate, &sc->idle.immediate_work);
}
__SMBDIRECT_PRIVATE__
* Now use the keepalive timeout (instead of keepalive interval)
* in order to wait for a response
*/
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->keepalive_timeout_msec));
return true;
}
* get some new recv credits we can grant to
* the peer.
*/
- queue_work(sc->workqueue, &sc->recv_io.posted.refill_work);
+ queue_work(sc->workqueues.refill, &sc->recv_io.posted.refill_work);
/*
* wait until either the refill work or the peer
* order to trigger our next keepalive message.
*/
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
- mod_delayed_work(sc->workqueue, &sc->idle.timer_work,
+ mod_delayed_work(sc->workqueues.idle, &sc->idle.timer_work,
msecs_to_jiffies(sp->keepalive_interval_msec));
ib_dma_sync_single_for_cpu(sc->ib.dev,
if (flags & SMBDIRECT_FLAG_RESPONSE_REQUESTED) {
smbdirect_log_keep_alive(sc, SMBDIRECT_LOG_INFO,
"schedule send of immediate response\n");
- queue_work(sc->workqueue, &sc->idle.immediate_work);
+ queue_work(sc->workqueues.immediate, &sc->idle.immediate_work);
}
/*
if (data_length) {
if (current_recv_credits <= (sc->recv_io.credits.target / 4) ||
sc->recv_io.credits.target > old_recv_credit_target)
- queue_work(sc->workqueue, &sc->recv_io.posted.refill_work);
+ queue_work(sc->workqueues.refill, &sc->recv_io.posted.refill_work);
smbdirect_connection_reassembly_append_recv_io(sc, recv_io, data_length);
wake_up(&sc->recv_io.reassembly.wait_queue);
if (posted > 0) {
smbdirect_log_keep_alive(sc, SMBDIRECT_LOG_INFO,
"schedule send of an empty message\n");
- queue_work(sc->workqueue, &sc->idle.immediate_work);
+ queue_work(sc->workqueues.immediate, &sc->idle.immediate_work);
}
}
/*
* Remember the callers workqueue
*/
- sc->workqueue = workqueue;
+ sc->workqueues.accept = workqueue;
+ sc->workqueues.connect = workqueue;
+ sc->workqueues.idle = workqueue;
+ sc->workqueues.refill = workqueue;
+ sc->workqueues.immediate = workqueue;
+ sc->workqueues.cleanup = workqueue;
return 0;
}
*/
smbdirect_socket_wake_up_all(sc);
- queue_work(sc->workqueue, &sc->disconnect_work);
+ queue_work(sc->workqueues.cleanup, &sc->disconnect_work);
}
static void smbdirect_socket_cleanup_work(struct work_struct *work)
int first_error;
/*
- * This points to the workqueue to
+ * This points to the workqueues to
* be used for this socket.
* It can be per socket (on the client)
* or point to a global workqueue (on the server)
*/
- struct workqueue_struct *workqueue;
+ struct {
+ struct workqueue_struct *accept;
+ struct workqueue_struct *connect;
+ struct workqueue_struct *idle;
+ struct workqueue_struct *refill;
+ struct workqueue_struct *immediate;
+ struct workqueue_struct *cleanup;
+ } workqueues;
struct work_struct disconnect_work;