Index: 2.6.16-gl1/block/genhd.c =================================================================== --- 2.6.16-gl1.orig/block/genhd.c 2006-03-22 15:22:44.000000000 -0600 +++ 2.6.16-gl1/block/genhd.c 2006-03-22 15:24:24.000000000 -0600 @@ -32,6 +32,8 @@ char name[16]; } *major_names[MAX_PROBE_HASH]; +LIST_HEAD(gendisks); + /* index in the above - for now: assume no multimajor ranges */ static inline int major_to_index(int major) { @@ -469,19 +471,22 @@ jiffies_to_msecs(disk_stat_read(disk, io_ticks)), jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); } + +#ifdef CONFIG_FINGERPRINTING static ssize_t disk_fp_read(struct gendisk * disk, char *page) { - return sprintf(page, "reads: %llx\n" - "writes: %llx\n" - "head_pos: %llx\n" - "avg_dist: %llx\n" - "avg_size: %llx\n", + return sprintf(page, "reads: %lld\n" + "writes: %lld\n" + "head_pos: %lld\n" + "avg_dist: %lld\n" + "avg_size: %lld\n", (unsigned long long)disk->fp_ss->reads, (unsigned long long)disk->fp_ss->writes, (unsigned long long)disk->fp_ss->head_pos, (unsigned long long)disk->fp_ss->avg_dist, (unsigned long long)disk->fp_ss->avg_size); } +#endif static struct disk_attribute disk_attr_uevent = { .attr = {.name = "uevent", .mode = S_IWUSR }, @@ -507,10 +512,13 @@ .attr = {.name = "stat", .mode = S_IRUGO }, .show = disk_stats_read }; + +#ifdef CONFIG_FINGERPRINTING static struct disk_attribute disk_attr_fp = { .attr = {.name = "fp", .mode = S_IRUGO }, .show = disk_fp_read }; +#endif static struct attribute * default_attrs[] = { &disk_attr_uevent.attr, @@ -519,7 +527,9 @@ &disk_attr_removable.attr, &disk_attr_size.attr, &disk_attr_stat.attr, +#ifdef CONFIG_FINGERPRINTING &disk_attr_fp.attr, +#endif NULL, }; @@ -528,6 +538,7 @@ struct gendisk *disk = to_disk(kobj); kfree(disk->random); kfree(disk->part); + list_del(&disk->gendisks); free_disk_stats(disk); kfree(disk); } @@ -730,6 +741,7 @@ kobj_set_kset_s(disk,block_subsys); kobject_init(&disk->kobj); rand_initialize_disk(disk); + list_add_tail(&disk->gendisks, &gendisks); } disk->fp_ss = kmalloc(sizeof(struct fp_snapshot), GFP_KERNEL); Index: 2.6.16-gl1/block/ll_rw_blk.c =================================================================== --- 2.6.16-gl1.orig/block/ll_rw_blk.c 2006-03-22 15:22:44.000000000 -0600 +++ 2.6.16-gl1/block/ll_rw_blk.c 2006-03-22 15:24:24.000000000 -0600 @@ -22,6 +22,7 @@ #include #include #include /* for max_pfn/max_low_pfn */ +#include #include #include #include @@ -2549,6 +2550,141 @@ __elv_add_request(q, req, ELEVATOR_INSERT_SORT, 0); } +#ifdef CONFIG_GENETIC_IOSCHED_AS +extern struct list_head gendisks; + +void disk_stats_snapshot(phenotype_t * pt) +{ + struct list_head * d; + struct gendisk *disk; + struct disk_stats_snapshot * ss = (struct disk_stats_snapshot *)pt->child_ranking[0]->stats_snapshot; + + memset(ss, 0, sizeof(struct disk_stats_snapshot)); + + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + disk_round_stats(disk); + + ss->reads += disk_stat_read(disk, ios[READ]); + ss->writes += disk_stat_read(disk, ios[WRITE]); + ss->read_sectors += disk_stat_read(disk, sectors[READ]); + ss->write_sectors += disk_stat_read(disk, sectors[WRITE]); + ss->time_in_queue += disk_stat_read(disk, time_in_queue); + } +} + +unsigned long disk_num_ops_calc_fitness(genetic_child_t * child) +{ + struct list_head * d; + struct gendisk *disk; + struct disk_stats_snapshot * ss = (struct disk_stats_snapshot *)child->stats_snapshot; + unsigned long reads = 0; + unsigned long writes = 0; + + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + disk_round_stats(disk); + + reads += disk_stat_read(disk, ios[READ]); + writes += disk_stat_read(disk, ios[WRITE]); + } + + reads -= ss->reads; + writes -= ss->writes; + + return reads + writes; +} + +unsigned long disk_throughput_calc_fitness(genetic_child_t * child) +{ + struct list_head * d; + struct gendisk *disk; + struct disk_stats_snapshot * ss = (struct disk_stats_snapshot *)child->stats_snapshot; + unsigned long read_sectors = 0; + unsigned long write_sectors = 0; + + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + disk_round_stats(disk); + + read_sectors += disk_stat_read(disk, sectors[READ]); + write_sectors += disk_stat_read(disk, sectors[WRITE]); + } + + read_sectors -= ss->read_sectors; + write_sectors -= ss->write_sectors; + + return read_sectors + write_sectors; +} + +unsigned long disk_latency_calc_fitness(genetic_child_t * child) +{ + struct list_head * d; + struct gendisk *disk; + struct disk_stats_snapshot * ss = (struct disk_stats_snapshot *)child->stats_snapshot; + unsigned long time_in_queue = 0; + + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + disk_round_stats(disk); + + time_in_queue += disk_stat_read(disk, time_in_queue); + } + + time_in_queue = -(time_in_queue - ss->time_in_queue); + + return time_in_queue; +} + +#ifdef CONFIG_FINGERPRINTING + +void disk_update_fingerprint(phenotype_t * pt) +{ + struct list_head * d; + struct gendisk *disk; + + BUG_ON(!pt->fp_ss); + + /* tally up all the other disk snapshots */ + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + consolidate_fp_snapshot(pt->fp_ss, disk->fp_ss); + + /* reset it for the next generation */ + reset_fp_snapshot(disk->fp_ss); + } + +} + +void disk_get_fingerprint(phenotype_t * pt) +{ + struct list_head * d; + struct gendisk *disk; + + BUG_ON(!pt->fp_ss); + + /* tally up all the other disk snapshots */ + list_for_each(d, &gendisks) { + disk = list_entry(d, struct gendisk, gendisks); + + consolidate_fp_snapshot(pt->fp_ss, disk->fp_ss); + + /* reset it for the next generation */ + reset_fp_snapshot(disk->fp_ss); + } + + calc_fp(pt->fp, pt->fp_ss); +} + +#endif /* CONFIG_FINGERPRINTING */ + +#endif /* GENETIC_IOSCHED_AS */ + /* * disk_round_stats() - Round off the performance stats on a struct * disk_stats. Index: 2.6.16-gl1/include/linux/genhd.h =================================================================== --- 2.6.16-gl1.orig/include/linux/genhd.h 2006-03-22 15:22:44.000000000 -0600 +++ 2.6.16-gl1/include/linux/genhd.h 2006-03-22 15:24:24.000000000 -0600 @@ -122,6 +122,7 @@ atomic_t sync_io; /* RAID */ unsigned long stamp; int in_flight; + struct list_head gendisks; #ifdef CONFIG_SMP struct disk_stats *dkstats; #else Index: 2.6.16-gl1/include/linux/blkdev.h =================================================================== --- 2.6.16-gl1.orig/include/linux/blkdev.h 2006-03-22 15:20:14.000000000 -0600 +++ 2.6.16-gl1/include/linux/blkdev.h 2006-03-22 15:24:24.000000000 -0600 @@ -828,12 +828,23 @@ _res; \ } \ ) -#endif +#endif #define MODULE_ALIAS_BLOCKDEV(major,minor) \ MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ MODULE_ALIAS("block-major-" __stringify(major) "-*") +#ifdef CONFIG_GENETIC_IOSCHED_AS + +struct disk_stats_snapshot +{ + unsigned long reads; + unsigned long writes; + unsigned long read_sectors; + unsigned long write_sectors; + unsigned long time_in_queue; +}; +#endif /* CONFIG_GENETIC_IOSCHED_AS */ #endif