static void start_io_acct(struct dm_io *io) { struct mapped_device *md = io->md; io->start_time = jiffies; preempt_disable(); disk_round_stats(dm_disk(md)); preempt_enable(); dm_disk(md)->in_flight = atomic_inc_return(&md->pending); }
static int end_io_acct(struct dm_io *io) { struct mapped_device *md = io->md; struct bio *bio = io->bio; unsigned long duration = jiffies - io->start_time; int pending; int rw = bio_data_dir(bio); preempt_disable(); disk_round_stats(dm_disk(md)); preempt_enable(); dm_disk(md)->in_flight = pending = atomic_dec_return(&md->pending); disk_stat_add(dm_disk(md), ticks[rw], duration); return !pending; }
/* Update disk stats when completing request upwards */ static void _drbd_end_io_acct(struct drbd_conf *mdev, struct drbd_request *req) { int rw = bio_data_dir(req->master_bio); unsigned long duration = jiffies - req->start_time; #ifndef __disk_stat_inc int cpu; #endif #ifdef __disk_stat_add __disk_stat_add(mdev->vdisk, ticks[rw], duration); disk_round_stats(mdev->vdisk); mdev->vdisk->in_flight--; #else cpu = part_stat_lock(); part_stat_add(cpu, &mdev->vdisk->part0, ticks[rw], duration); part_round_stats(cpu, &mdev->vdisk->part0); part_dec_in_flight(&mdev->vdisk->part0, rw); part_stat_unlock(); #endif }
/* Update disk stats at start of I/O request */ static void _drbd_start_io_acct(struct drbd_conf *mdev, struct drbd_request *req, struct bio *bio) { const int rw = bio_data_dir(bio); #ifndef __disk_stat_inc int cpu; #endif #ifdef __disk_stat_inc __disk_stat_inc(mdev->vdisk, ios[rw]); __disk_stat_add(mdev->vdisk, sectors[rw], bio_sectors(bio)); disk_round_stats(mdev->vdisk); mdev->vdisk->in_flight++; #else cpu = part_stat_lock(); part_stat_inc(cpu, &mdev->vdisk->part0, ios[rw]); part_stat_add(cpu, &mdev->vdisk->part0, sectors[rw], bio_sectors(bio)); part_inc_in_flight(&mdev->vdisk->part0, rw); part_stat_unlock(); #endif }
static ssize_t disk_stats_read(struct gendisk * disk, char *page) { preempt_disable(); disk_round_stats(disk); preempt_enable(); return sprintf(page, "%8u %8u %8llu %8u " "%8u %8u %8llu %8u " "%8u %8u %8u" "\n", disk_stat_read(disk, reads), disk_stat_read(disk, read_merges), (unsigned long long)disk_stat_read(disk, read_sectors), jiffies_to_msecs(disk_stat_read(disk, read_ticks)), disk_stat_read(disk, writes), disk_stat_read(disk, write_merges), (unsigned long long)disk_stat_read(disk, write_sectors), jiffies_to_msecs(disk_stat_read(disk, write_ticks)), disk->in_flight, jiffies_to_msecs(disk_stat_read(disk, io_ticks)), jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); }
int get_partition_list(char *page, char **start, off_t offset, int count) { struct gendisk *gp; struct hd_struct *hd; char buf[64]; int len, n; len = sprintf(page, "major minor #blocks name\n\n"); read_lock(&gendisk_lock); for (gp = gendisk_head; gp; gp = gp->next) { for (n = 0; n < (gp->nr_real << gp->minor_shift); n++) { if (gp->part[n].nr_sects == 0) continue; hd = &gp->part[n]; disk_round_stats(hd); len += sprintf(page + len, "%4d %4d %10d %s\n", gp->major, n, gp->sizes[n], disk_name(gp, n, buf)); if (len < offset) offset -= len, len = 0; else if (len >= offset + count) goto out; } } out: read_unlock(&gendisk_lock); *start = page + offset; len -= offset; if (len < 0) len = 0; return len > count ? count : len; }