Commit 7cb6683c authored by Mike Christie's avatar Mike Christie Committed by Martin K. Petersen
Browse files

scsi: iscsi: Use the session workqueue for recovery

Use the session workqueue for recovery and unbinding. If there are delays
during device blocking/cleanup then it will no longer affect other
sessions.

Link: https://lore.kernel.org/r/20220226230435.38733-6-michael.christie@oracle.com


Reviewed-by: default avatarChris Leech <cleech@redhat.com>
Reviewed-by: default avatarLee Duncan <lduncan@suse.com>
Signed-off-by: default avatarMike Christie <michael.christie@oracle.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5842ea36
Loading
Loading
Loading
Loading
+4 −16
Original line number Diff line number Diff line
@@ -87,7 +87,6 @@ struct iscsi_internal {
};

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

static struct workqueue_struct *iscsi_conn_cleanup_workq;

@@ -1913,7 +1912,7 @@ void iscsi_unblock_session(struct iscsi_cls_session *session)
	if (!cancel_work_sync(&session->block_work))
		cancel_delayed_work_sync(&session->recovery_work);

	queue_work(iscsi_eh_timer_workq, &session->unblock_work);
	queue_work(session->workq, &session->unblock_work);
	/*
	 * Blocking the session can be done from any context so we only
	 * queue the block work. Make sure the unblock work has completed
@@ -1937,14 +1936,14 @@ static void __iscsi_block_session(struct work_struct *work)
	scsi_target_block(&session->dev);
	ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n");
	if (session->recovery_tmo >= 0)
		queue_delayed_work(iscsi_eh_timer_workq,
		queue_delayed_work(session->workq,
				   &session->recovery_work,
				   session->recovery_tmo * HZ);
}

void iscsi_block_session(struct iscsi_cls_session *session)
{
	queue_work(iscsi_eh_timer_workq, &session->block_work);
	queue_work(session->workq, &session->block_work);
}
EXPORT_SYMBOL_GPL(iscsi_block_session);

@@ -4851,26 +4850,16 @@ static __init int iscsi_transport_init(void)
		goto unregister_flashnode_bus;
	}

	iscsi_eh_timer_workq = alloc_workqueue("%s",
			WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
			1, "iscsi_eh");
	if (!iscsi_eh_timer_workq) {
		err = -ENOMEM;
		goto release_nls;
	}

	iscsi_conn_cleanup_workq = alloc_workqueue("%s",
			WQ_SYSFS | WQ_MEM_RECLAIM | WQ_UNBOUND, 0,
			"iscsi_conn_cleanup");
	if (!iscsi_conn_cleanup_workq) {
		err = -ENOMEM;
		goto destroy_wq;
		goto release_nls;
	}

	return 0;

destroy_wq:
	destroy_workqueue(iscsi_eh_timer_workq);
release_nls:
	netlink_kernel_release(nls);
unregister_flashnode_bus:
@@ -4893,7 +4882,6 @@ static __init int iscsi_transport_init(void)
static void __exit iscsi_transport_exit(void)
{
	destroy_workqueue(iscsi_conn_cleanup_workq);
	destroy_workqueue(iscsi_eh_timer_workq);
	netlink_kernel_release(nls);
	bus_unregister(&iscsi_flashnode_bus);
	transport_class_unregister(&iscsi_connection_class);