mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
Enhanced partition statistics: update partition statitics
Updates the enhanced partition statistics in generic block layer besides the disk statistics. Signed-off-by: Jerome Marchand <jmarchan@redhat.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
ea5c48ab2a
commit
6f2576af5b
@ -60,10 +60,15 @@ static void drive_stat_acct(struct request *rq, int new_io)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!new_io) {
|
if (!new_io) {
|
||||||
__disk_stat_inc(rq->rq_disk, merges[rw]);
|
__all_stat_inc(rq->rq_disk, merges[rw], rq->sector);
|
||||||
} else {
|
} else {
|
||||||
|
struct hd_struct *part = get_part(rq->rq_disk, rq->sector);
|
||||||
disk_round_stats(rq->rq_disk);
|
disk_round_stats(rq->rq_disk);
|
||||||
rq->rq_disk->in_flight++;
|
rq->rq_disk->in_flight++;
|
||||||
|
if (part) {
|
||||||
|
part_round_stats(part);
|
||||||
|
part->in_flight++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -997,6 +1002,21 @@ void disk_round_stats(struct gendisk *disk)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(disk_round_stats);
|
EXPORT_SYMBOL_GPL(disk_round_stats);
|
||||||
|
|
||||||
|
void part_round_stats(struct hd_struct *part)
|
||||||
|
{
|
||||||
|
unsigned long now = jiffies;
|
||||||
|
|
||||||
|
if (now == part->stamp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (part->in_flight) {
|
||||||
|
__part_stat_add(part, time_in_queue,
|
||||||
|
part->in_flight * (now - part->stamp));
|
||||||
|
__part_stat_add(part, io_ticks, (now - part->stamp));
|
||||||
|
}
|
||||||
|
part->stamp = now;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* queue lock must be held
|
* queue lock must be held
|
||||||
*/
|
*/
|
||||||
@ -1530,7 +1550,8 @@ static int __end_that_request_first(struct request *req, int error,
|
|||||||
if (blk_fs_request(req) && req->rq_disk) {
|
if (blk_fs_request(req) && req->rq_disk) {
|
||||||
const int rw = rq_data_dir(req);
|
const int rw = rq_data_dir(req);
|
||||||
|
|
||||||
disk_stat_add(req->rq_disk, sectors[rw], nr_bytes >> 9);
|
all_stat_add(req->rq_disk, sectors[rw],
|
||||||
|
nr_bytes >> 9, req->sector);
|
||||||
}
|
}
|
||||||
|
|
||||||
total_bytes = bio_nbytes = 0;
|
total_bytes = bio_nbytes = 0;
|
||||||
@ -1715,11 +1736,16 @@ static void end_that_request_last(struct request *req, int error)
|
|||||||
if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
|
if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
|
||||||
unsigned long duration = jiffies - req->start_time;
|
unsigned long duration = jiffies - req->start_time;
|
||||||
const int rw = rq_data_dir(req);
|
const int rw = rq_data_dir(req);
|
||||||
|
struct hd_struct *part = get_part(disk, req->sector);
|
||||||
|
|
||||||
__disk_stat_inc(disk, ios[rw]);
|
__all_stat_inc(disk, ios[rw], req->sector);
|
||||||
__disk_stat_add(disk, ticks[rw], duration);
|
__all_stat_add(disk, ticks[rw], duration, req->sector);
|
||||||
disk_round_stats(disk);
|
disk_round_stats(disk);
|
||||||
disk->in_flight--;
|
disk->in_flight--;
|
||||||
|
if (part) {
|
||||||
|
part_round_stats(part);
|
||||||
|
part->in_flight--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (req->end_io)
|
if (req->end_io)
|
||||||
|
@ -454,8 +454,14 @@ static int attempt_merge(struct request_queue *q, struct request *req,
|
|||||||
elv_merge_requests(q, req, next);
|
elv_merge_requests(q, req, next);
|
||||||
|
|
||||||
if (req->rq_disk) {
|
if (req->rq_disk) {
|
||||||
|
struct hd_struct *part
|
||||||
|
= get_part(req->rq_disk, req->sector);
|
||||||
disk_round_stats(req->rq_disk);
|
disk_round_stats(req->rq_disk);
|
||||||
req->rq_disk->in_flight--;
|
req->rq_disk->in_flight--;
|
||||||
|
if (part) {
|
||||||
|
part_round_stats(part);
|
||||||
|
part->in_flight--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
req->ioprio = ioprio_best(req->ioprio, next->ioprio);
|
req->ioprio = ioprio_best(req->ioprio, next->ioprio);
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
#include <linux/genhd.h>
|
||||||
|
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
|
|
||||||
@ -273,6 +274,7 @@ static struct attribute_group *part_attr_groups[] = {
|
|||||||
static void part_release(struct device *dev)
|
static void part_release(struct device *dev)
|
||||||
{
|
{
|
||||||
struct hd_struct *p = dev_to_part(dev);
|
struct hd_struct *p = dev_to_part(dev);
|
||||||
|
free_part_stats(p);
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,6 +316,7 @@ void delete_partition(struct gendisk *disk, int part)
|
|||||||
p->nr_sects = 0;
|
p->nr_sects = 0;
|
||||||
p->ios[0] = p->ios[1] = 0;
|
p->ios[0] = p->ios[1] = 0;
|
||||||
p->sectors[0] = p->sectors[1] = 0;
|
p->sectors[0] = p->sectors[1] = 0;
|
||||||
|
part_stat_set_all(p, 0);
|
||||||
kobject_put(p->holder_dir);
|
kobject_put(p->holder_dir);
|
||||||
device_del(&p->dev);
|
device_del(&p->dev);
|
||||||
put_device(&p->dev);
|
put_device(&p->dev);
|
||||||
@ -336,6 +339,10 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len,
|
|||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!init_part_stats(p)) {
|
||||||
|
kfree(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
p->start_sect = start;
|
p->start_sect = start;
|
||||||
p->nr_sects = len;
|
p->nr_sects = len;
|
||||||
p->partno = part;
|
p->partno = part;
|
||||||
|
@ -365,6 +365,7 @@ static inline void free_part_stats(struct hd_struct *part)
|
|||||||
|
|
||||||
/* drivers/block/ll_rw_blk.c */
|
/* drivers/block/ll_rw_blk.c */
|
||||||
extern void disk_round_stats(struct gendisk *disk);
|
extern void disk_round_stats(struct gendisk *disk);
|
||||||
|
extern void part_round_stats(struct hd_struct *part);
|
||||||
|
|
||||||
/* drivers/block/genhd.c */
|
/* drivers/block/genhd.c */
|
||||||
extern int get_blkdev_list(char *, int);
|
extern int get_blkdev_list(char *, int);
|
||||||
|
Loading…
Reference in New Issue
Block a user