Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4544683a authored by Swen Schillig's avatar Swen Schillig Committed by James Bottomley
Browse files

[SCSI] zfcp: Move workqueue to adapter struct



Remove the global driver work queue and replace it with a workqueue
local to the adapter. The usage of this workqueue makes this the
correct place for the structure. In addition multiple adapters won't
block each other due to the serialization of the queued work.

Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 09a46c6e
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -176,8 +176,6 @@ static int __init zfcp_module_init(void)
	if (!zfcp_data.gid_pn_cache)
		goto out_gid_cache;

	zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");

	sema_init(&zfcp_data.config_sema, 1);
	rwlock_init(&zfcp_data.config_lock);

@@ -458,6 +456,27 @@ static void zfcp_print_sl(struct seq_file *m, struct service_level *sl)
		   adapter->fsf_lic_version);
}

static int zfcp_setup_adapter_work_queue(struct zfcp_adapter *adapter)
{
	char name[TASK_COMM_LEN];

	snprintf(name, sizeof(name), "zfcp_q_%s",
		 dev_name(&adapter->ccw_device->dev));
	adapter->work_queue = create_singlethread_workqueue(name);

	if (adapter->work_queue)
		return 0;
	return -ENOMEM;
}

static void zfcp_destroy_adapter_work_queue(struct zfcp_adapter *adapter)
{
	if (adapter->work_queue)
		destroy_workqueue(adapter->work_queue);
	adapter->work_queue = NULL;

}

/**
 * zfcp_adapter_enqueue - enqueue a new adapter to the list
 * @ccw_device: pointer to the struct cc_device
@@ -504,6 +523,9 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
	if (zfcp_adapter_debug_register(adapter))
		goto debug_register_failed;

	if (zfcp_setup_adapter_work_queue(adapter))
		goto work_queue_failed;

	init_waitqueue_head(&adapter->remove_wq);
	init_waitqueue_head(&adapter->erp_thread_wqh);
	init_waitqueue_head(&adapter->erp_done_wqh);
@@ -543,6 +565,8 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
		return 0;

sysfs_failed:
	zfcp_destroy_adapter_work_queue(adapter);
work_queue_failed:
	zfcp_adapter_debug_unregister(adapter);
debug_register_failed:
	dev_set_drvdata(&ccw_device->dev, NULL);
@@ -579,6 +603,7 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
	if (!retval)
		return;

	zfcp_destroy_adapter_work_queue(adapter);
	zfcp_adapter_debug_unregister(adapter);
	zfcp_qdio_free(adapter);
	zfcp_free_low_mem_buffers(adapter);
+1 −1
Original line number Diff line number Diff line
@@ -485,6 +485,7 @@ struct zfcp_adapter {
	struct work_struct	scan_work;
	struct service_level	service_level;
	atomic_t		qdio_outb_full;	   /* queue full incidents */
	struct workqueue_struct	*work_queue;
};

struct zfcp_port {
@@ -573,7 +574,6 @@ struct zfcp_data {
	struct kmem_cache	*qtcb_cache;
	struct kmem_cache	*sr_buffer_cache;
	struct kmem_cache	*gid_pn_cache;
	struct workqueue_struct	*work_queue;
};

/********************** ZFCP SPECIFIC DEFINES ********************************/
+1 −1
Original line number Diff line number Diff line
@@ -875,7 +875,7 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
			return zfcp_erp_open_ptp_port(act);
		if (!port->d_id) {
			zfcp_port_get(port);
			if (!queue_work(zfcp_data.work_queue,
			if (!queue_work(adapter->work_queue,
					&port->gid_pn_work))
				zfcp_port_put(port);
			return ZFCP_ERP_CONTINUES;
+1 −1
Original line number Diff line number Diff line
@@ -480,7 +480,7 @@ void zfcp_fc_link_test_work(struct work_struct *work)
void zfcp_test_link(struct zfcp_port *port)
{
	zfcp_port_get(port);
	if (!queue_work(zfcp_data.work_queue, &port->test_link_work))
	if (!queue_work(port->adapter->work_queue, &port->test_link_work))
		zfcp_port_put(port);
}

+1 −1
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
	zfcp_fsf_req_free(req);

	atomic_inc(&adapter->stat_miss);
	queue_work(zfcp_data.work_queue, &adapter->stat_work);
	queue_work(adapter->work_queue, &adapter->stat_work);
}

static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req)
Loading