diff --git a/configure.d/1_generic_acct.conf b/configure.d/1_generic_acct.conf index 15f6043..499a627 100644 --- a/configure.d/1_generic_acct.conf +++ b/configure.d/1_generic_acct.conf @@ -9,18 +9,21 @@ check() { cur_name=$(basename $2) config_file_path=$1 - if compile_module $cur_name "generic_start_io_acct(NULL, 0, 0, NULL)" "linux/bio.h" + if compile_module $cur_name "bio_start_io_acct(NULL)" "linux/blkdev.h" then echo $cur_name "1" >> $config_file_path - elif compile_module $cur_name "generic_start_io_acct(0, 0, NULL)" "linux/bio.h" + elif compile_module $cur_name "generic_start_io_acct(NULL, 0, 0, NULL)" "linux/bio.h" then echo $cur_name "2" >> $config_file_path - elif compile_module $cur_name "part_round_stats(1, 1)" "linux/genhd.h" + elif compile_module $cur_name "generic_start_io_acct(0, 0, NULL)" "linux/bio.h" then echo $cur_name "3" >> $config_file_path - elif compile_module $cur_name "part_round_stats(NULL, 1, 1)" "linux/genhd.h" + elif compile_module $cur_name "part_round_stats(1, 1)" "linux/genhd.h" then echo $cur_name "4" >> $config_file_path + elif compile_module $cur_name "part_round_stats(NULL, 1, 1)" "linux/genhd.h" + then + echo $cur_name "5" >> $config_file_path else echo $cur_name "X" >> $config_file_path fi @@ -29,79 +32,111 @@ check() { apply() { case "$1" in "1") - add_function " - static inline void cas_generic_start_io_acct(struct request_queue *q, - int rw, unsigned long sectors, struct hd_struct *part) { - generic_start_io_acct(q, rw, sectors, part); - }" - add_function " - static inline void cas_generic_end_io_acct(struct request_queue *q, - int rw, struct hd_struct *part, unsigned long start_time) - { - generic_end_io_acct(q, rw, part, start_time); - }" ;; + add_function " + static inline unsigned long long cas_generic_start_io_acct( + struct request_queue *q, struct bio *bio, + struct hd_struct *part) + { + return bio_start_io_acct(bio); + }" + add_function " + static inline void cas_generic_end_io_acct(struct request_queue *q, + struct bio *bio, struct hd_struct *part, + unsigned long start_time) + { + bio_end_io_acct(bio, start_time); + }" ;; "2") - add_function " - static inline void cas_generic_start_io_acct(struct request_queue *q, - int rw, unsigned long sectors, struct hd_struct *part) - { - generic_start_io_acct(rw, sectors, part); - }" - add_function " - static inline void cas_generic_end_io_acct(struct request_queue *q, - int rw, struct hd_struct *part, unsigned long start_time) - { - generic_end_io_acct(rw, part, start_time); - }" ;; - "3") - add_function " - static inline void cas_generic_start_io_acct(struct request_queue *q, - int rw, unsigned long sectors, struct hd_struct *part) - { - int cpu = part_stat_lock(); - part_round_stats(cpu, part); - part_stat_inc(cpu, part, ios[rw]); - part_stat_add(cpu, part, sectors[rw], sectors); - part_inc_in_flight(part, rw); - part_stat_unlock(); - }" - add_function " - static inline void cas_generic_end_io_acct(struct request_queue *q, - int rw, struct hd_struct *part, unsigned long start_time) - { - unsigned long duration = jiffies - start_time; - int cpu = part_stat_lock(); - part_stat_add(cpu, part, ticks[rw], duration); - part_round_stats(cpu, part); - part_dec_in_flight(part, rw); - part_stat_unlock(); - }" ;; - "4") - add_function " - static inline void cas_generic_start_io_acct(struct request_queue *q, - int rw, unsigned long sectors, struct hd_struct *part) - { - int cpu = part_stat_lock(); - part_round_stats(NULL, cpu, part); - part_stat_inc(cpu, part, ios[rw]); - part_stat_add(cpu, part, sectors[rw], sectors); - part_inc_in_flight(NULL, part, rw); - part_stat_unlock(); - }" - add_function " - static inline void cas_generic_end_io_acct(struct request_queue *q, - int rw, struct hd_struct *part, unsigned long start_time) - { - unsigned long duration = jiffies - start_time; - int cpu = part_stat_lock(); - part_stat_add(cpu, part, ticks[rw], duration); - part_round_stats(NULL, cpu, part); - part_dec_in_flight(NULL, part, rw); - part_stat_unlock(); - }" ;; - *) + add_function " + static inline unsigned long long cas_generic_start_io_acct( + struct request_queue *q, struct bio *bio, + struct hd_struct *part) + { + generic_start_io_acct(q, bio_data_dir(bio), bio_sectors(bio), part); + return jiffies; + }" + add_function " + static inline void cas_generic_end_io_acct(struct request_queue *q, + struct bio *bio, struct hd_struct *part, + unsigned long start_time) + { + generic_end_io_acct(q, bio_data_dir(bio), part, start_time); + }" ;; + "3") + add_function " + static inline unsigned long long cas_generic_start_io_acct( + struct request_queue *q, struct bio *bio, + struct hd_struct *part) + { + generic_start_io_acct(bio_data_dir(bio), bio_sectors(bio), part); + return jiffies; + }" + add_function " + static inline void cas_generic_end_io_acct(struct request_queue *q, + struct bio *bio, struct hd_struct *part, + unsigned long start_time) + { + generic_end_io_acct(bio_data_dir(bio), part, start_time); + }" ;; + "4") + add_function " + static inline unsigned long long cas_generic_start_io_acct( + struct request_queue *q, struct bio *bio, + struct hd_struct *part) + { + int rw = bio_data_dir(bio); + int cpu = part_stat_lock(); + part_round_stats(cpu, part); + part_stat_inc(cpu, part, ios[rw]); + part_stat_add(cpu, part, sectors[rw], bio_sectors(bio)); + part_inc_in_flight(part, rw); + part_stat_unlock(); + return jiffies; + }" + add_function " + static inline void cas_generic_end_io_acct(struct request_queue *q, + struct bio *bio, struct hd_struct *part, + unsigned long start_time) + { + int rw = bio_data_dir(bio); + unsigned long duration = jiffies - start_time; + int cpu = part_stat_lock(); + part_stat_add(cpu, part, ticks[rw], duration); + part_round_stats(cpu, part); + part_dec_in_flight(part, rw); + part_stat_unlock(); + }" ;; + "5") + add_function " + static inline unsigned long long cas_generic_start_io_acct( + struct request_queue *q, struct bio *bio, + struct hd_struct *part) + { + int rw = bio_data_dir(bio); + int cpu = part_stat_lock(); + part_round_stats(NULL, cpu, part); + part_stat_inc(cpu, part, ios[rw]); + part_stat_add(cpu, part, sectors[rw], bio_sectors(bio)); + part_inc_in_flight(NULL, part, rw); + part_stat_unlock(); + return jiffies; + }" + add_function " + static inline void cas_generic_end_io_acct(struct request_queue *q, + struct bio *bio, struct hd_struct *part, + unsigned long start_time) + { + int rw = bio_data_dir(bio); + unsigned long duration = jiffies - start_time; + int cpu = part_stat_lock(); + part_stat_add(cpu, part, ticks[rw], duration); + part_round_stats(NULL, cpu, part); + part_dec_in_flight(NULL, part, rw); + part_stat_unlock(); + }" ;; + *) exit 1 - esac + esac } conf_run $@ diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 950c331..3355c48 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -57,12 +57,11 @@ static void _blockdev_set_bio_data(struct blk_data *data, struct bio *bio) #endif } -static inline void _blockdev_start_io_acct(struct bio *bio) +static inline unsigned long long _blockdev_start_io_acct(struct bio *bio) { struct gendisk *gd = CAS_BIO_GET_DEV(bio); - cas_generic_start_io_acct(gd->queue, bio_data_dir(bio), - bio_sectors(bio), &gd->part0); + return cas_generic_start_io_acct(gd->queue, bio, &gd->part0); } static inline void _blockdev_end_io_acct(struct bio *bio, @@ -70,8 +69,7 @@ static inline void _blockdev_end_io_acct(struct bio *bio, { struct gendisk *gd = CAS_BIO_GET_DEV(bio); - cas_generic_end_io_acct(gd->queue, bio_data_dir(bio), - &gd->part0, start_time); + cas_generic_end_io_acct(gd->queue, bio, &gd->part0, start_time); } void block_dev_start_bio_fast(struct ocf_io *io) @@ -79,7 +77,7 @@ void block_dev_start_bio_fast(struct ocf_io *io) struct blk_data *data = ocf_io_get_data(io); struct bio *bio = data->master_io_req; - _blockdev_start_io_acct(bio); + data->start_time = _blockdev_start_io_acct(bio); } void block_dev_complete_bio_fast(struct ocf_io *io, int error) @@ -761,7 +759,6 @@ static int _blockdev_make_request_fast(struct casdsk_disk *dsk, _blockdev_set_bio_data(data, bio); data->master_io_req = bio; - data->start_time = jiffies; io = ocf_core_new_io(core, cache_priv->io_queues[smp_processor_id()], CAS_BIO_BISECTOR(bio) << SECTOR_SHIFT,