Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 84900
b: refs/heads/master
c: 6f2576a
h: refs/heads/master
v: v3
  • Loading branch information
Jerome Marchand authored and Jens Axboe committed Feb 8, 2008
1 parent 86e620d commit 33fc2bd
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ea5c48ab2a76559d4af39e1f7de137c0851ac0a5
refs/heads/master: 6f2576af5ba5913538fda7dfb7c6a17771025477
34 changes: 30 additions & 4 deletions trunk/block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,15 @@ static void drive_stat_acct(struct request *rq, int new_io)
return;

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++;
}
}
}

Expand Down Expand Up @@ -997,6 +1002,21 @@ void disk_round_stats(struct gendisk *disk)
}
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
*/
Expand Down Expand Up @@ -1530,7 +1550,8 @@ static int __end_that_request_first(struct request *req, int error,
if (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;
Expand Down Expand Up @@ -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) {
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)
Expand Down
6 changes: 6 additions & 0 deletions trunk/block/blk-merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,8 +454,14 @@ static int attempt_merge(struct request_queue *q, struct request *req,
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);
Expand Down
7 changes: 7 additions & 0 deletions trunk/fs/partitions/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/fs.h>
#include <linux/kmod.h>
#include <linux/ctype.h>
#include <linux/genhd.h>

#include "check.h"

Expand Down Expand Up @@ -273,6 +274,7 @@ static struct attribute_group *part_attr_groups[] = {
static void part_release(struct device *dev)
{
struct hd_struct *p = dev_to_part(dev);
free_part_stats(p);
kfree(p);
}

Expand Down Expand Up @@ -314,6 +316,7 @@ void delete_partition(struct gendisk *disk, int part)
p->nr_sects = 0;
p->ios[0] = p->ios[1] = 0;
p->sectors[0] = p->sectors[1] = 0;
part_stat_set_all(p, 0);
kobject_put(p->holder_dir);
device_del(&p->dev);
put_device(&p->dev);
Expand All @@ -336,6 +339,10 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len,
if (!p)
return;

if (!init_part_stats(p)) {
kfree(p);
return;
}
p->start_sect = start;
p->nr_sects = len;
p->partno = part;
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/genhd.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ static inline void free_part_stats(struct hd_struct *part)

/* 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);
Expand Down

0 comments on commit 33fc2bd

Please sign in to comment.