Enhanced partition statistics: update partition statitics
PATCH 2/8 Enhanced partition statistics: update partition statitics
Updates the enhanced partition statistics in generic block layer besides the disk statistics.
Signed-off-by Jerome Marchand <[email protected]>
--- block/ll_rw_blk.c | 40 ++++++++++++++++++++++++++++++++++++---- fs/partitions/check.c | 7 +++++++ include/linux/genhd.h | 1 + 3 files changed, 44 insertions(+), 4 deletions(-)
block/ll_rw_blk.c +36 -4
@@ -2734,10 +2734,15 @@ static void drive_stat_acct(struct requereturn ;if (!new_io) { -__disk_stat_inc (rq->rq_disk, merges[rw]); +__all_stat_inc (rq->rq_disk, merges[rw], rq->sector); }else { +struct hd_struct *part =get_part (rq->rq_disk, rq->sector);disk_round_stats (rq->rq_disk); rq->rq_disk->in_flight++; +if (part) { +part_round_stats (part); + part->in_flight++; + } } }
@@ -2789,6 +2794,21 @@ void disk_round_stats(struct gendisk *diEXPORT_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 */
@@ -2903,8 +2923,14 @@ static int attempt_merge(struct request_elv_merge_requests (q, req, next);if (req->rq_disk) { +struct hd_struct *part + =get_part (req->rq_disk, req->sector);disk_round_stats (req->rq_disk); req->rq_disk->in_flight--; +if (part) { +part_round_stats (part); + part->in_flight--; + } } req->ioprio =ioprio_best (req->ioprio, next->ioprio);
@@ -3447,7 +3473,8 @@ static int __end_that_request_first(struif (blk_fs_request (req) && req->rq_disk) {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 ;
@@ -3676,11 +3703,16 @@ void end_that_request_last(struct requesif (disk &&blk_fs_request (req) && req != &req->q->bar_rq) {unsigned long duration = jiffies - req->start_time;const int rw =rq_data_dir (req); +struct hd_struct *part =get_part (disk, req->sector); -__disk_stat_inc (disk, ios[rw]); -__disk_stat_add (disk, ticks[rw], duration); +__all_stat_inc (disk, ios[rw], req->sector); +__all_stat_add (disk, ticks[rw], duration, req->sector);disk_round_stats (disk); disk->in_flight--; +if (part) { +part_round_stats (part); + part->in_flight--; + } }if (req->end_io) req->end_io (req, error);
fs/partitions/check.c +7 -0
@@ -18,6 +18,7 @@#include <linux/fs.h> #include <linux/kmod.h> #include <linux/ctype.h> +#include <linux/genhd.h> #include "check.h"
@@ -321,6 +322,7 @@ extern struct kset block_subsys;static void part_release (struct kobject *kobj) { struct hd_struct * p = container_of(kobj,struct hd_struct,kobj); +free_part_stats (p);kfree (p); }
@@ -361,6 +363,7 @@ void delete_partition(struct gendisk *di p->nr_sects =0 ; p->ios[0 ] = p->ios[1 ] =0 ; p->sectors[0 ] = p->sectors[1 ] =0 ; +part_stat_set_all (p,0 );sysfs_remove_link (&p->kobj,"subsystem" );kobject_unregister (p->holder_dir);kobject_uevent (&p->kobj,KOBJ_REMOVE );
@@ -376,6 +379,10 @@ void add_partition(struct gendisk *disk,if (!p)return ; +if (!init_part_stats (p)) { +kfree (p); +return ; + } p->start_sect = start; p->nr_sects = len; p->partno = part;
include/linux/genhd.h +1 -0
@@ -359,6 +359,7 @@ static inline void free_part_stats(struc/* drivers/block/ll_rw_blk.c */ extern void disk_round_stats (struct gendisk *disk); +extern void part_round_stats (struct hd_struct *part);/* drivers/block/genhd.c */ extern int get_blkdev_list (char *,int );