block: make part_in_flight() take an array of two ints
Instead of returning the count that matches the partition, pass in an array of two ints. Index 0 will be filled with the inflight count for the partition in question, and index 1 will filled with the root inflight count, if the partition passed in is not the root. This is in preparation for being able to calculate both in one go. Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
d62e26b3ff
commit
0609e0efc5
|
@ -1472,15 +1472,15 @@ static void add_acct_request(struct request_queue *q, struct request *rq,
|
||||||
static void part_round_stats_single(struct request_queue *q, int cpu,
|
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)
|
||||||
{
|
{
|
||||||
int inflight;
|
int inflight[2];
|
||||||
|
|
||||||
if (now == part->stamp)
|
if (now == part->stamp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
inflight = part_in_flight(q, part);
|
part_in_flight(q, part, inflight);
|
||||||
if (inflight) {
|
if (inflight[0]) {
|
||||||
__part_stat_add(cpu, part, time_in_queue,
|
__part_stat_add(cpu, part, time_in_queue,
|
||||||
inflight * (now - part->stamp));
|
inflight[0] * (now - part->stamp));
|
||||||
__part_stat_add(cpu, part, io_ticks, (now - part->stamp));
|
__part_stat_add(cpu, part, io_ticks, (now - part->stamp));
|
||||||
}
|
}
|
||||||
part->stamp = now;
|
part->stamp = now;
|
||||||
|
|
|
@ -1204,6 +1204,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
|
||||||
struct disk_part_iter piter;
|
struct disk_part_iter piter;
|
||||||
struct hd_struct *hd;
|
struct hd_struct *hd;
|
||||||
char buf[BDEVNAME_SIZE];
|
char buf[BDEVNAME_SIZE];
|
||||||
|
unsigned int inflight[2];
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1219,6 +1220,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
|
||||||
cpu = part_stat_lock();
|
cpu = part_stat_lock();
|
||||||
part_round_stats(gp->queue, cpu, hd);
|
part_round_stats(gp->queue, cpu, hd);
|
||||||
part_stat_unlock();
|
part_stat_unlock();
|
||||||
|
part_in_flight(gp->queue, hd, inflight);
|
||||||
seq_printf(seqf, "%4d %7d %s %lu %lu %lu "
|
seq_printf(seqf, "%4d %7d %s %lu %lu %lu "
|
||||||
"%u %lu %lu %lu %u %u %u %u\n",
|
"%u %lu %lu %lu %u %u %u %u\n",
|
||||||
MAJOR(part_devt(hd)), MINOR(part_devt(hd)),
|
MAJOR(part_devt(hd)), MINOR(part_devt(hd)),
|
||||||
|
@ -1231,7 +1233,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
|
||||||
part_stat_read(hd, merges[WRITE]),
|
part_stat_read(hd, merges[WRITE]),
|
||||||
part_stat_read(hd, sectors[WRITE]),
|
part_stat_read(hd, sectors[WRITE]),
|
||||||
jiffies_to_msecs(part_stat_read(hd, ticks[WRITE])),
|
jiffies_to_msecs(part_stat_read(hd, ticks[WRITE])),
|
||||||
part_in_flight(gp->queue, hd),
|
inflight[0],
|
||||||
jiffies_to_msecs(part_stat_read(hd, io_ticks)),
|
jiffies_to_msecs(part_stat_read(hd, io_ticks)),
|
||||||
jiffies_to_msecs(part_stat_read(hd, time_in_queue))
|
jiffies_to_msecs(part_stat_read(hd, time_in_queue))
|
||||||
);
|
);
|
||||||
|
|
|
@ -113,11 +113,13 @@ ssize_t part_stat_show(struct device *dev,
|
||||||
{
|
{
|
||||||
struct hd_struct *p = dev_to_part(dev);
|
struct hd_struct *p = dev_to_part(dev);
|
||||||
struct request_queue *q = dev_to_disk(dev)->queue;
|
struct request_queue *q = dev_to_disk(dev)->queue;
|
||||||
|
unsigned int inflight[2];
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
cpu = part_stat_lock();
|
cpu = part_stat_lock();
|
||||||
part_round_stats(q, cpu, p);
|
part_round_stats(q, cpu, p);
|
||||||
part_stat_unlock();
|
part_stat_unlock();
|
||||||
|
part_in_flight(q, p, inflight);
|
||||||
return sprintf(buf,
|
return sprintf(buf,
|
||||||
"%8lu %8lu %8llu %8u "
|
"%8lu %8lu %8llu %8u "
|
||||||
"%8lu %8lu %8llu %8u "
|
"%8lu %8lu %8llu %8u "
|
||||||
|
@ -131,7 +133,7 @@ ssize_t part_stat_show(struct device *dev,
|
||||||
part_stat_read(p, merges[WRITE]),
|
part_stat_read(p, merges[WRITE]),
|
||||||
(unsigned long long)part_stat_read(p, sectors[WRITE]),
|
(unsigned long long)part_stat_read(p, sectors[WRITE]),
|
||||||
jiffies_to_msecs(part_stat_read(p, ticks[WRITE])),
|
jiffies_to_msecs(part_stat_read(p, ticks[WRITE])),
|
||||||
part_in_flight(q, p),
|
inflight[0],
|
||||||
jiffies_to_msecs(part_stat_read(p, io_ticks)),
|
jiffies_to_msecs(part_stat_read(p, io_ticks)),
|
||||||
jiffies_to_msecs(part_stat_read(p, time_in_queue)));
|
jiffies_to_msecs(part_stat_read(p, time_in_queue)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -378,11 +378,18 @@ static inline void part_dec_in_flight(struct request_queue *q,
|
||||||
atomic_dec(&part_to_disk(part)->part0.in_flight[rw]);
|
atomic_dec(&part_to_disk(part)->part0.in_flight[rw]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int part_in_flight(struct request_queue *q,
|
static inline void part_in_flight(struct request_queue *q,
|
||||||
struct hd_struct *part)
|
struct hd_struct *part,
|
||||||
|
unsigned int inflight[2])
|
||||||
{
|
{
|
||||||
return atomic_read(&part->in_flight[0]) +
|
inflight[0] = atomic_read(&part->in_flight[0]) +
|
||||||
atomic_read(&part->in_flight[1]);
|
atomic_read(&part->in_flight[1]);
|
||||||
|
if (part->partno) {
|
||||||
|
part = &part_to_disk(part)->part0;
|
||||||
|
inflight[1] = atomic_read(&part->in_flight[0]) +
|
||||||
|
atomic_read(&part->in_flight[1]);
|
||||||
|
} else
|
||||||
|
inflight[1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk)
|
static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk)
|
||||||
|
|
Loading…
Reference in New Issue