|
@@ -474,3 +474,60 @@ static void cfqg_stats_set_start_group_wait_time(struct cfq_group *cfqg,
|
|
return;
|
|
return;
|
|
if (cfqg == curr_cfqg)
|
|
if (cfqg == curr_cfqg)
|
|
return;
|
|
return;
|
|
|
|
+ stats->start_group_wait_time = sched_clock();
|
|
|
|
+ cfqg_stats_mark_waiting(stats);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* This should be called with the queue_lock held. */
|
|
|
|
+static void cfqg_stats_end_empty_time(struct cfqg_stats *stats)
|
|
|
|
+{
|
|
|
|
+ unsigned long long now;
|
|
|
|
+
|
|
|
|
+ if (!cfqg_stats_empty(stats))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ now = sched_clock();
|
|
|
|
+ if (time_after64(now, stats->start_empty_time))
|
|
|
|
+ blkg_stat_add(&stats->empty_time,
|
|
|
|
+ now - stats->start_empty_time);
|
|
|
|
+ cfqg_stats_clear_empty(stats);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void cfqg_stats_update_dequeue(struct cfq_group *cfqg)
|
|
|
|
+{
|
|
|
|
+ blkg_stat_add(&cfqg->stats.dequeue, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void cfqg_stats_set_start_empty_time(struct cfq_group *cfqg)
|
|
|
|
+{
|
|
|
|
+ struct cfqg_stats *stats = &cfqg->stats;
|
|
|
|
+
|
|
|
|
+ if (blkg_rwstat_sum(&stats->queued))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * group is already marked empty. This can happen if cfqq got new
|
|
|
|
+ * request in parent group and moved to this group while being added
|
|
|
|
+ * to service tree. Just ignore the event and move on.
|
|
|
|
+ */
|
|
|
|
+ if (cfqg_stats_empty(stats))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ stats->start_empty_time = sched_clock();
|
|
|
|
+ cfqg_stats_mark_empty(stats);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void cfqg_stats_update_idle_time(struct cfq_group *cfqg)
|
|
|
|
+{
|
|
|
|
+ struct cfqg_stats *stats = &cfqg->stats;
|
|
|
|
+
|
|
|
|
+ if (cfqg_stats_idling(stats)) {
|
|
|
|
+ unsigned long long now = sched_clock();
|
|
|
|
+
|
|
|
|
+ if (time_after64(now, stats->start_idle_time))
|
|
|
|
+ blkg_stat_add(&stats->idle_time,
|
|
|
|
+ now - stats->start_idle_time);
|
|
|
|
+ cfqg_stats_clear_idling(stats);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|