|
@@ -1470,17 +1470,12 @@ static void add_acct_request(struct request_queue *q, struct request *rq,
|
|
|
}
|
|
|
|
|
|
static void part_round_stats_single(struct request_queue *q, int cpu,
|
|
|
- struct hd_struct *part, unsigned long now)
|
|
|
+ struct hd_struct *part, unsigned long now,
|
|
|
+ unsigned int inflight)
|
|
|
{
|
|
|
- int inflight[2];
|
|
|
-
|
|
|
- if (now == part->stamp)
|
|
|
- return;
|
|
|
-
|
|
|
- part_in_flight(q, part, inflight);
|
|
|
- if (inflight[0]) {
|
|
|
+ if (inflight) {
|
|
|
__part_stat_add(cpu, part, time_in_queue,
|
|
|
- inflight[0] * (now - part->stamp));
|
|
|
+ inflight * (now - part->stamp));
|
|
|
__part_stat_add(cpu, part, io_ticks, (now - part->stamp));
|
|
|
}
|
|
|
part->stamp = now;
|
|
@@ -1505,12 +1500,29 @@ static void part_round_stats_single(struct request_queue *q, int cpu,
|
|
|
*/
|
|
|
void part_round_stats(struct request_queue *q, int cpu, struct hd_struct *part)
|
|
|
{
|
|
|
+ struct hd_struct *part2 = NULL;
|
|
|
unsigned long now = jiffies;
|
|
|
+ unsigned int inflight[2];
|
|
|
+ int stats = 0;
|
|
|
+
|
|
|
+ if (part->stamp != now)
|
|
|
+ stats |= 1;
|
|
|
+
|
|
|
+ if (part->partno) {
|
|
|
+ part2 = &part_to_disk(part)->part0;
|
|
|
+ if (part2->stamp != now)
|
|
|
+ stats |= 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!stats)
|
|
|
+ return;
|
|
|
+
|
|
|
+ part_in_flight(q, part, inflight);
|
|
|
|
|
|
- if (part->partno)
|
|
|
- part_round_stats_single(q, cpu, &part_to_disk(part)->part0,
|
|
|
- now);
|
|
|
- part_round_stats_single(q, cpu, part, now);
|
|
|
+ if (stats & 2)
|
|
|
+ part_round_stats_single(q, cpu, part2, now, inflight[1]);
|
|
|
+ if (stats & 1)
|
|
|
+ part_round_stats_single(q, cpu, part, now, inflight[0]);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(part_round_stats);
|
|
|
|