mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
[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: Stefan Raspl <raspl@linux.vnet.ibm.com> Signed-off-by: Martin Peschke <mp3@de.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
7ae628d9d2
commit
2450d3e7b8
4 changed files with 32 additions and 7 deletions
|
@ -568,6 +568,7 @@ struct zfcp_adapter {
|
|||
struct fsf_qtcb_bottom_port *stats_reset_data;
|
||||
unsigned long stats_reset;
|
||||
struct work_struct scan_work;
|
||||
atomic_t qdio_outb_full; /* queue full incidents */
|
||||
};
|
||||
|
||||
struct zfcp_port {
|
||||
|
|
|
@ -717,6 +717,14 @@ static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
|
|||
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)
|
||||
{
|
||||
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);
|
||||
if (ret > 0)
|
||||
return 0;
|
||||
if (!ret)
|
||||
atomic_inc(&adapter->qdio_outb_full);
|
||||
|
||||
spin_lock_bh(&req_q->lock);
|
||||
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;
|
||||
|
||||
spin_lock(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
|
||||
req_flags, adapter->pool.fsf_req_abort);
|
||||
|
@ -1219,7 +1229,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
|
|||
return -EBUSY;
|
||||
|
||||
spin_lock(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
|
||||
ZFCP_REQ_AUTO_CLEANUP, NULL);
|
||||
|
@ -1264,7 +1274,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
|
|||
int retval = -EIO;
|
||||
|
||||
spin_lock_bh(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter,
|
||||
FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
|
@ -1360,7 +1370,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
spin_lock_bh(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
|
||||
ZFCP_REQ_AUTO_CLEANUP,
|
||||
|
@ -1406,7 +1416,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
spin_lock_bh(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
|
||||
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;
|
||||
|
||||
spin_lock(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
|
||||
adapter->pool.fsf_req_scsi);
|
||||
|
@ -2347,7 +2357,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter,
|
|||
return NULL;
|
||||
|
||||
spin_lock(&adapter->req_q.lock);
|
||||
if (!atomic_read(&adapter->req_q.count))
|
||||
if (!zfcp_fsf_sbal_available(adapter))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
|
||||
adapter->pool.fsf_req_scsi);
|
||||
|
|
|
@ -282,6 +282,7 @@ static int zfcp_qdio_fill_sbals(struct zfcp_fsf_req *fsf_req,
|
|||
addr += length, remaining -= length) {
|
||||
sbale = zfcp_qdio_sbale_next(fsf_req, sbtype);
|
||||
if (!sbale) {
|
||||
atomic_inc(&fsf_req->adapter->qdio_outb_full);
|
||||
zfcp_qdio_undo_sbals(fsf_req);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -487,10 +487,23 @@ ZFCP_SHOST_ATTR(megabytes, "%llu %llu\n",
|
|||
ZFCP_SHOST_ATTR(seconds_active, "%llu\n",
|
||||
(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[] = {
|
||||
&dev_attr_utilization,
|
||||
&dev_attr_requests,
|
||||
&dev_attr_megabytes,
|
||||
&dev_attr_seconds_active,
|
||||
&dev_attr_queue_full,
|
||||
NULL
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue