diff options
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 33e0a206a0a4..3d0687090274 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)) { |