#endif
        /* number of requests that are on the dispatch list or inside driver */
        int dispatched;
+       struct cfq_ttime ttime;
 };
 
 /*
                *st = CFQ_RB_ROOT;
        RB_CLEAR_NODE(&cfqg->rb_node);
 
+       cfqg->ttime.last_end_request = jiffies;
+
        /*
         * Take the initial reference that will be released on destroy
         * This can be thought of a joint reference by cgroup and
         * this group, wait for requests to complete.
         */
 check_group_idle:
-       if (cfqd->cfq_group_idle && cfqq->cfqg->nr_cfqq == 1
-           && cfqq->cfqg->dispatched) {
+       if (cfqd->cfq_group_idle && cfqq->cfqg->nr_cfqq == 1 &&
+           cfqq->cfqg->dispatched &&
+           !cfq_io_thinktime_big(cfqd, &cfqq->cfqg->ttime, true)) {
                cfqq = NULL;
                goto keep_queue;
        }
                __cfq_update_io_thinktime(&cfqq->service_tree->ttime,
                        cfqd->cfq_slice_idle);
        }
+#ifdef CONFIG_CFQ_GROUP_IOSCHED
+       __cfq_update_io_thinktime(&cfqq->cfqg->ttime, cfqd->cfq_group_idle);
+#endif
 }
 
 static void
        if (cfqq->cfqg->nr_cfqq > 1)
                return false;
 
+       /* the only queue in the group, but think time is big */
+       if (cfq_io_thinktime_big(cfqd, &cfqq->cfqg->ttime, true))
+               return false;
+
        if (cfq_slice_used(cfqq))
                return true;
 
                        cfqd->last_delayed_sync = now;
        }
 
+#ifdef CONFIG_CFQ_GROUP_IOSCHED
+       cfqq->cfqg->ttime.last_end_request = now;
+#endif
+
        /*
         * If this is the active queue, check if it needs to be expired,
         * or if we want to idle in case it has no pending requests.