Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide
[linux-2.6-microblaze.git] / block / blk-iolatency.c
index d22e61b..d973c38 100644 (file)
@@ -618,44 +618,26 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio)
 
                inflight = atomic_dec_return(&rqw->inflight);
                WARN_ON_ONCE(inflight < 0);
-               if (iolat->min_lat_nsec == 0)
-                       goto next;
-               iolatency_record_time(iolat, &bio->bi_issue, now,
-                                     issue_as_root);
-               window_start = atomic64_read(&iolat->window_start);
-               if (now > window_start &&
-                   (now - window_start) >= iolat->cur_win_nsec) {
-                       if (atomic64_cmpxchg(&iolat->window_start,
-                                       window_start, now) == window_start)
-                               iolatency_check_latencies(iolat, now);
+               /*
+                * If bi_status is BLK_STS_AGAIN, the bio wasn't actually
+                * submitted, so do not account for it.
+                */
+               if (iolat->min_lat_nsec && bio->bi_status != BLK_STS_AGAIN) {
+                       iolatency_record_time(iolat, &bio->bi_issue, now,
+                                             issue_as_root);
+                       window_start = atomic64_read(&iolat->window_start);
+                       if (now > window_start &&
+                           (now - window_start) >= iolat->cur_win_nsec) {
+                               if (atomic64_cmpxchg(&iolat->window_start,
+                                            window_start, now) == window_start)
+                                       iolatency_check_latencies(iolat, now);
+                       }
                }
-next:
                wake_up(&rqw->wait);
                blkg = blkg->parent;
        }
 }
 
-static void blkcg_iolatency_cleanup(struct rq_qos *rqos, struct bio *bio)
-{
-       struct blkcg_gq *blkg;
-
-       blkg = bio->bi_blkg;
-       while (blkg && blkg->parent) {
-               struct rq_wait *rqw;
-               struct iolatency_grp *iolat;
-
-               iolat = blkg_to_lat(blkg);
-               if (!iolat)
-                       goto next;
-
-               rqw = &iolat->rq_wait;
-               atomic_dec(&rqw->inflight);
-               wake_up(&rqw->wait);
-next:
-               blkg = blkg->parent;
-       }
-}
-
 static void blkcg_iolatency_exit(struct rq_qos *rqos)
 {
        struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos);
@@ -667,7 +649,6 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos)
 
 static struct rq_qos_ops blkcg_iolatency_ops = {
        .throttle = blkcg_iolatency_throttle,
-       .cleanup = blkcg_iolatency_cleanup,
        .done_bio = blkcg_iolatency_done_bio,
        .exit = blkcg_iolatency_exit,
 };
@@ -778,8 +759,10 @@ static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val)
 
        if (!oldval && val)
                return 1;
-       if (oldval && !val)
+       if (oldval && !val) {
+               blkcg_clear_delay(blkg);
                return -1;
+       }
        return 0;
 }