block: disable preemption before using sched_clock()
authorJens Axboe <jaxboe@fusionio.com>
Tue, 1 Jun 2010 10:23:18 +0000 (12:23 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Tue, 1 Jun 2010 10:23:18 +0000 (12:23 +0200)
Commit 9195291e5f05e01d67f9a09c756b8aca8f009089 added calls to
sched_clock() from preemptible code. sched_clock() is both the
wrong interface AND cannot be called without preempt disabled.

Apply a temporary fix to get rid of the warnings, a real patch
is in the works.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
include/linux/blkdev.h

index 8b7f5e0..09a8402 100644 (file)
@@ -1211,14 +1211,23 @@ struct work_struct;
 int kblockd_schedule_work(struct request_queue *q, struct work_struct *work);
 
 #ifdef CONFIG_BLK_CGROUP
+/*
+ * This should not be using sched_clock(). A real patch is in progress
+ * to fix this up, until that is in place we need to disable preemption
+ * around sched_clock() in this function and set_io_start_time_ns().
+ */
 static inline void set_start_time_ns(struct request *req)
 {
+       preempt_disable();
        req->start_time_ns = sched_clock();
+       preempt_enable();
 }
 
 static inline void set_io_start_time_ns(struct request *req)
 {
+       preempt_disable();
        req->io_start_time_ns = sched_clock();
+       preempt_enable();
 }
 
 static inline uint64_t rq_start_time_ns(struct request *req)