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

Commit 2450d3e7 authored by Stefan Raspl's avatar Stefan Raspl Committed by James Bottomley
Browse files

[SCSI] zfcp: add queue_full sysfs attribute



Adds a new sysfs attribute queue_full for adapters that records the number
of incidents where a requests could not be submitted due to insufficient
free space on the request queue.

Signed-off-by: default avatarStefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Peschke <mp3@de.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 7ae628d9
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -568,6 +568,7 @@ struct zfcp_adapter {
	struct fsf_qtcb_bottom_port *stats_reset_data;
	struct fsf_qtcb_bottom_port *stats_reset_data;
	unsigned long		stats_reset;
	unsigned long		stats_reset;
	struct work_struct	scan_work;
	struct work_struct	scan_work;
	atomic_t		qdio_outb_full;	   /* queue full incidents */
};
};


struct zfcp_port {
struct zfcp_port {
+17 −7
Original line number Original line Diff line number Diff line
@@ -717,6 +717,14 @@ static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
	return 0;
	return 0;
}
}


static int zfcp_fsf_sbal_available(struct zfcp_adapter *adapter)
{
	unsigned int count = atomic_read(&adapter->req_q.count);
	if (!count)
		atomic_inc(&adapter->qdio_outb_full);
	return count > 0;
}

static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
{
{
	long ret;
	long ret;
@@ -727,6 +735,8 @@ static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
					zfcp_fsf_sbal_check(req_q), 5 * HZ);
					zfcp_fsf_sbal_check(req_q), 5 * HZ);
	if (ret > 0)
	if (ret > 0)
		return 0;
		return 0;
	if (!ret)
		atomic_inc(&adapter->qdio_outb_full);


	spin_lock_bh(&req_q->lock);
	spin_lock_bh(&req_q->lock);
	return -EIO;
	return -EIO;
@@ -984,7 +994,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id,
	struct zfcp_fsf_req *req = NULL;
	struct zfcp_fsf_req *req = NULL;


	spin_lock(&adapter->req_q.lock);
	spin_lock(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
				  req_flags, adapter->pool.fsf_req_abort);
				  req_flags, adapter->pool.fsf_req_abort);
@@ -1219,7 +1229,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
		return -EBUSY;
		return -EBUSY;


	spin_lock(&adapter->req_q.lock);
	spin_lock(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
				  ZFCP_REQ_AUTO_CLEANUP, NULL);
				  ZFCP_REQ_AUTO_CLEANUP, NULL);
@@ -1264,7 +1274,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
	int retval = -EIO;
	int retval = -EIO;


	spin_lock_bh(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter,
	req = zfcp_fsf_req_create(adapter,
				  FSF_QTCB_EXCHANGE_CONFIG_DATA,
				  FSF_QTCB_EXCHANGE_CONFIG_DATA,
@@ -1360,7 +1370,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	spin_lock_bh(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
@@ -1406,7 +1416,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	spin_lock_bh(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
@@ -2224,7 +2234,7 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
		return -EBUSY;
		return -EBUSY;


	spin_lock(&adapter->req_q.lock);
	spin_lock(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
				  adapter->pool.fsf_req_scsi);
				  adapter->pool.fsf_req_scsi);
@@ -2347,7 +2357,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter,
		return NULL;
		return NULL;


	spin_lock(&adapter->req_q.lock);
	spin_lock(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!zfcp_fsf_sbal_available(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
				  adapter->pool.fsf_req_scsi);
				  adapter->pool.fsf_req_scsi);
+1 −0
Original line number Original line Diff line number Diff line
@@ -282,6 +282,7 @@ static int zfcp_qdio_fill_sbals(struct zfcp_fsf_req *fsf_req,
	     addr += length, remaining -= length) {
	     addr += length, remaining -= length) {
		sbale = zfcp_qdio_sbale_next(fsf_req, sbtype);
		sbale = zfcp_qdio_sbale_next(fsf_req, sbtype);
		if (!sbale) {
		if (!sbale) {
			atomic_inc(&fsf_req->adapter->qdio_outb_full);
			zfcp_qdio_undo_sbals(fsf_req);
			zfcp_qdio_undo_sbals(fsf_req);
			return -EINVAL;
			return -EINVAL;
		}
		}
+13 −0
Original line number Original line Diff line number Diff line
@@ -487,10 +487,23 @@ ZFCP_SHOST_ATTR(megabytes, "%llu %llu\n",
ZFCP_SHOST_ATTR(seconds_active, "%llu\n",
ZFCP_SHOST_ATTR(seconds_active, "%llu\n",
		(unsigned long long) stat_info.seconds_act);
		(unsigned long long) stat_info.seconds_act);


static ssize_t zfcp_sysfs_adapter_q_full_show(struct device *dev,
					      struct device_attribute *attr,
					      char *buf)
{
	struct Scsi_Host *scsi_host = class_to_shost(dev);
	struct zfcp_adapter *adapter =
		(struct zfcp_adapter *) scsi_host->hostdata[0];

	return sprintf(buf, "%d\n", atomic_read(&adapter->qdio_outb_full));
}
static DEVICE_ATTR(queue_full, S_IRUGO, zfcp_sysfs_adapter_q_full_show, NULL);

struct device_attribute *zfcp_sysfs_shost_attrs[] = {
struct device_attribute *zfcp_sysfs_shost_attrs[] = {
	&dev_attr_utilization,
	&dev_attr_utilization,
	&dev_attr_requests,
	&dev_attr_requests,
	&dev_attr_megabytes,
	&dev_attr_megabytes,
	&dev_attr_seconds_active,
	&dev_attr_seconds_active,
	&dev_attr_queue_full,
	NULL
	NULL
};
};