Skip to content

Commit

Permalink
[SCSI] iscsi class: Use our own workq instead of common system one.
Browse files Browse the repository at this point in the history
There is just too much going on through the common workq and
something like a scsi device removal through sysfs affects
how long it will take to recover the transport, mark it as
failed, or shut it down gracefully.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
Mike Christie authored and James Bottomley committed Jan 12, 2008
1 parent b3a7ea8 commit d8bf541
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions drivers/scsi/scsi_transport_iscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ struct iscsi_internal {
};

static atomic_t iscsi_session_nr; /* sysfs session id for next new session */
static struct workqueue_struct *iscsi_eh_timer_workq;

/*
* list of registered transports and lock that must
Expand Down Expand Up @@ -252,16 +253,16 @@ static void session_recovery_timedout(struct work_struct *work)
void iscsi_unblock_session(struct iscsi_cls_session *session)
{
if (!cancel_delayed_work(&session->recovery_work))
flush_scheduled_work();
flush_workqueue(iscsi_eh_timer_workq);
scsi_target_unblock(&session->dev);
}
EXPORT_SYMBOL_GPL(iscsi_unblock_session);

void iscsi_block_session(struct iscsi_cls_session *session)
{
scsi_target_block(&session->dev);
schedule_delayed_work(&session->recovery_work,
session->recovery_tmo * HZ);
queue_delayed_work(iscsi_eh_timer_workq, &session->recovery_work,
session->recovery_tmo * HZ);
}
EXPORT_SYMBOL_GPL(iscsi_block_session);

Expand Down Expand Up @@ -357,7 +358,7 @@ void iscsi_remove_session(struct iscsi_cls_session *session)
struct iscsi_host *ihost = shost->shost_data;

if (!cancel_delayed_work(&session->recovery_work))
flush_scheduled_work();
flush_workqueue(iscsi_eh_timer_workq);

mutex_lock(&ihost->mutex);
list_del(&session->host_list);
Expand Down Expand Up @@ -1521,8 +1522,14 @@ static __init int iscsi_transport_init(void)
goto unregister_session_class;
}

iscsi_eh_timer_workq = create_singlethread_workqueue("iscsi_eh");
if (!iscsi_eh_timer_workq)
goto release_nls;

return 0;

release_nls:
sock_release(nls->sk_socket);
unregister_session_class:
transport_class_unregister(&iscsi_session_class);
unregister_conn_class:
Expand All @@ -1536,6 +1543,7 @@ static __init int iscsi_transport_init(void)

static void __exit iscsi_transport_exit(void)
{
destroy_workqueue(iscsi_eh_timer_workq);
sock_release(nls->sk_socket);
transport_class_unregister(&iscsi_connection_class);
transport_class_unregister(&iscsi_session_class);
Expand Down

0 comments on commit d8bf541

Please sign in to comment.