This patch allows to better differentiate between I/O types. It will
be used later to implement read/write/flush histograms.

https://virtuozzo.atlassian.net/browse/VSTOR-103846
Signed-off-by: Andrey Zhadchenko <[email protected]>
---
 drivers/md/dm-rq.c    |  4 ++--
 drivers/md/dm-stats.c | 12 +++++++-----
 drivers/md/dm-stats.h |  2 +-
 drivers/md/dm.c       |  2 +-
 4 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index 28bd496143770..20f495bf5399d 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -133,7 +133,7 @@ static void rq_end_stats(struct mapped_device *md, struct 
request *orig)
                        tio->stats_aux.histogram_duration_ns =
                                bio_issue_elapsed_ns(orig->bio);
 
-               dm_stats_account_io(&md->stats, rq_data_dir(orig),
+               dm_stats_account_io(&md->stats, orig->cmd_flags,
                                    blk_rq_pos(orig), tio->n_sectors, true,
                                    tio->duration_jiffies, &tio->stats_aux);
        }
@@ -453,7 +453,7 @@ static void dm_start_request(struct mapped_device *md, 
struct request *orig)
                tio->n_sectors = blk_rq_sectors(orig);
 
                dm_stats_record_start(&md->stats, &tio->stats_aux);
-               dm_stats_account_io(&md->stats, rq_data_dir(orig),
+               dm_stats_account_io(&md->stats, orig->cmd_flags,
                                    blk_rq_pos(orig), tio->n_sectors, false, 0,
                                    &tio->stats_aux);
        }
diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c
index 2ede4b51c5a4c..7a465b5e36cd3 100644
--- a/drivers/md/dm-stats.c
+++ b/drivers/md/dm-stats.c
@@ -569,12 +569,13 @@ static void dm_stat_round(struct dm_stat *s, struct 
dm_stat_shared *shared,
 }
 
 static void dm_stat_for_entry(struct dm_stat *s, size_t entry,
-                             int idx, sector_t len,
+                             blk_opf_t bi_opf, sector_t len,
                              struct dm_stats_aux *stats_aux, bool end,
                              unsigned long duration_jiffies)
 {
        struct dm_stat_shared *shared = &s->stat_shared[entry];
        struct dm_stat_percpu *p;
+       int idx = op_is_write(bi_opf);
 
        /*
         * For strict correctness we should use local_irq_save/restore
@@ -644,7 +645,7 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t 
entry,
 #endif
 }
 
-static void __dm_stat_bio(struct dm_stat *s, int bi_rw,
+static void __dm_stat_bio(struct dm_stat *s, blk_opf_t bi_opf,
                          sector_t bi_sector, sector_t end_sector,
                          bool end, unsigned long duration_jiffies,
                          struct dm_stats_aux *stats_aux)
@@ -674,7 +675,7 @@ static void __dm_stat_bio(struct dm_stat *s, int bi_rw,
                fragment_len = todo;
                if (fragment_len > s->step - offset)
                        fragment_len = s->step - offset;
-               dm_stat_for_entry(s, entry, bi_rw, fragment_len,
+               dm_stat_for_entry(s, entry, bi_opf, fragment_len,
                                  stats_aux, end, duration_jiffies);
                todo -= fragment_len;
                entry++;
@@ -682,7 +683,7 @@ static void __dm_stat_bio(struct dm_stat *s, int bi_rw,
        } while (unlikely(todo != 0));
 }
 
-void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw,
+void dm_stats_account_io(struct dm_stats *stats, blk_opf_t bi_opf,
                         sector_t bi_sector, unsigned int bi_sectors, bool end,
                         unsigned long start_time,
                         struct dm_stats_aux *stats_aux)
@@ -692,6 +693,7 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned 
long bi_rw,
        struct dm_stats_last_position *last;
        bool got_precise_time;
        unsigned long duration_jiffies = 0;
+       unsigned long bi_rw = op_is_write(bi_opf);
 
        if (unlikely(!bi_sectors))
                return;
@@ -724,7 +726,7 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned 
long bi_rw,
                                stats_aux->duration_ns = 
ktime_to_ns(ktime_get()) - stats_aux->duration_ns;
                        got_precise_time = true;
                }
-               __dm_stat_bio(s, bi_rw, bi_sector, end_sector, end, 
duration_jiffies, stats_aux);
+               __dm_stat_bio(s, bi_opf, bi_sector, end_sector, end, 
duration_jiffies, stats_aux);
        }
 
        rcu_read_unlock();
diff --git a/drivers/md/dm-stats.h b/drivers/md/dm-stats.h
index cce68414b97ee..1da681c89d127 100644
--- a/drivers/md/dm-stats.h
+++ b/drivers/md/dm-stats.h
@@ -31,7 +31,7 @@ struct mapped_device;
 int dm_stats_message(struct mapped_device *md, unsigned int argc, char **argv,
                     char *result, unsigned int maxlen);
 
-void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw,
+void dm_stats_account_io(struct dm_stats *stats, blk_opf_t bi_op,
                         sector_t bi_sector, unsigned int bi_sectors, bool end,
                         unsigned long start_time,
                         struct dm_stats_aux *aux);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 7029201480358..0d157be57d381 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -578,7 +578,7 @@ static void dm_io_acct(struct dm_io *io, bool end)
                else
                        sector = bio->bi_iter.bi_sector;
 
-               dm_stats_account_io(&io->md->stats, bio_data_dir(bio),
+               dm_stats_account_io(&io->md->stats, bio->bi_opf,
                                    sector, dm_io_sectors(io, bio),
                                    end, io->start_time, &io->stats_aux);
        }
-- 
2.43.5

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to