diff options
author | Martin Peschke <mpeschke@linux.vnet.ibm.com> | 2009-03-02 07:08:56 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-03-12 13:58:18 -0400 |
commit | 94506fd1483b39cd5d66b8ccb4ead3c9cc9542ac (patch) | |
tree | bb4cc68021eb831b3cab561810a19bdc24993586 /drivers/s390/scsi/zfcp_qdio.c | |
parent | 86f8a1b4b472e4b2b58df5826709d4797d84d46f (diff) |
[SCSI] zfcp: add measurement data for average qdio queue utilisation
Provide measurement data for the utilisation of the QDIO outbound queue.
The additional value allows to calculate an average queue utilisation
by looking at the deltas per time unit. Needed for capacity planning.
It is up to user space to handle wrap-arounds of the 64 bit value.
The new counter neatly complements the existing counter for queue full
conditions. That is why, both statistics counter have been integrated.
Signed-off-by: Martin Peschke <mpeschke@linux.vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/s390/scsi/zfcp_qdio.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 33e0a206a0a..3d068709027 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -77,6 +77,23 @@ static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt) | |||
77 | } | 77 | } |
78 | } | 78 | } |
79 | 79 | ||
80 | /* this needs to be called prior to updating the queue fill level */ | ||
81 | static void zfcp_qdio_account(struct zfcp_adapter *adapter) | ||
82 | { | ||
83 | ktime_t now; | ||
84 | s64 span; | ||
85 | int free, used; | ||
86 | |||
87 | spin_lock(&adapter->qdio_stat_lock); | ||
88 | now = ktime_get(); | ||
89 | span = ktime_us_delta(now, adapter->req_q_time); | ||
90 | free = max(0, atomic_read(&adapter->req_q.count)); | ||
91 | used = QDIO_MAX_BUFFERS_PER_Q - free; | ||
92 | adapter->req_q_util += used * span; | ||
93 | adapter->req_q_time = now; | ||
94 | spin_unlock(&adapter->qdio_stat_lock); | ||
95 | } | ||
96 | |||
80 | static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err, | 97 | static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err, |
81 | int queue_no, int first, int count, | 98 | int queue_no, int first, int count, |
82 | unsigned long parm) | 99 | unsigned long parm) |
@@ -93,6 +110,7 @@ static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err, | |||
93 | /* cleanup all SBALs being program-owned now */ | 110 | /* cleanup all SBALs being program-owned now */ |
94 | zfcp_qdio_zero_sbals(queue->sbal, first, count); | 111 | zfcp_qdio_zero_sbals(queue->sbal, first, count); |
95 | 112 | ||
113 | zfcp_qdio_account(adapter); | ||
96 | atomic_add(count, &queue->count); | 114 | atomic_add(count, &queue->count); |
97 | wake_up(&adapter->request_wq); | 115 | wake_up(&adapter->request_wq); |
98 | } | 116 | } |
@@ -359,6 +377,8 @@ int zfcp_qdio_send(struct zfcp_fsf_req *fsf_req) | |||
359 | sbale->flags |= SBAL_FLAGS0_PCI; | 377 | sbale->flags |= SBAL_FLAGS0_PCI; |
360 | } | 378 | } |
361 | 379 | ||
380 | zfcp_qdio_account(adapter); | ||
381 | |||
362 | retval = do_QDIO(adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0, first, | 382 | retval = do_QDIO(adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0, first, |
363 | count); | 383 | count); |
364 | if (unlikely(retval)) { | 384 | if (unlikely(retval)) { |