From: Stefan Raspl <raspl@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> Signed-off-by: Martin Peschke <mp3@xxxxxxxxxx> Signed-off-by: Christof Schmitt <christof.schmitt@xxxxxxxxxx> --- drivers/s390/scsi/zfcp_def.h | 1 + drivers/s390/scsi/zfcp_fsf.c | 24 +++++++++++++++++------- drivers/s390/scsi/zfcp_qdio.c | 1 + drivers/s390/scsi/zfcp_sysfs.c | 13 +++++++++++++ 4 files changed, 32 insertions(+), 7 deletions(-) --- a/drivers/s390/scsi/zfcp_def.h 2008-09-12 13:16:25.000000000 +0200 +++ b/drivers/s390/scsi/zfcp_def.h 2008-09-12 13:16:59.000000000 +0200 @@ -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 { --- a/drivers/s390/scsi/zfcp_qdio.c 2008-09-12 13:16:25.000000000 +0200 +++ b/drivers/s390/scsi/zfcp_qdio.c 2008-09-12 13:16:59.000000000 +0200 @@ -282,6 +282,7 @@ static int zfcp_qdio_fill_sbals(struct z 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; } --- a/drivers/s390/scsi/zfcp_fsf.c 2008-09-12 13:16:25.000000000 +0200 +++ b/drivers/s390/scsi/zfcp_fsf.c 2008-09-12 13:22:30.000000000 +0200 @@ -717,6 +717,14 @@ static int zfcp_fsf_sbal_check(struct zf 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_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_ 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_e 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 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 z 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(str 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(struc 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_c 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); --- a/drivers/s390/scsi/zfcp_sysfs.c 2008-09-12 13:16:25.000000000 +0200 +++ b/drivers/s390/scsi/zfcp_sysfs.c 2008-09-12 13:16:59.000000000 +0200 @@ -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 }; -- -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html