[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
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user