[SCSI] zfcp: optimize zfcp_qdio_account
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 18 Aug 2009 13:43:32 +0000 (15:43 +0200)
committerJames Bottomley <James.Bottomley@suse.de>
Sat, 5 Sep 2009 13:49:49 +0000 (08:49 -0500)
Remove expensive ktime_get()/ktime_us_delta() functions from the hot
path and use get_clock_monotonic() instead. This elimates seven
function calls and avoids a lot of unnecessary calculations.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_qdio.c

index cc98eea..7da2fad 100644 (file)
@@ -438,7 +438,7 @@ struct zfcp_qdio {
        struct zfcp_qdio_queue  req_q;
        spinlock_t              stat_lock;
        spinlock_t              req_q_lock;
-       ktime_t                 req_q_time;
+       unsigned long long      req_q_time;
        u64                     req_q_util;
        atomic_t                req_q_full;
        wait_queue_head_t       req_q_wq;
index 2b499e2..6c5228b 100644 (file)
@@ -56,16 +56,15 @@ static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt)
 }
 
 /* this needs to be called prior to updating the queue fill level */
-static void zfcp_qdio_account(struct zfcp_qdio *qdio)
+static inline void zfcp_qdio_account(struct zfcp_qdio *qdio)
 {
-       ktime_t now;
-       s64 span;
+       unsigned long long now, span;
        int free, used;
 
        spin_lock(&qdio->stat_lock);
-       now = ktime_get();
-       span = ktime_us_delta(now, qdio->req_q_time);
-       free = max(0, atomic_read(&qdio->req_q.count));
+       now = get_clock_monotonic();
+       span = (now - qdio->req_q_time) >> 12;
+       free = atomic_read(&qdio->req_q.count);
        used = QDIO_MAX_BUFFERS_PER_Q - free;
        qdio->req_q_util += used * span;
        qdio->req_q_time = now;