From 92dfa6b625d796560f839d1f214b145864515bc3 Mon Sep 17 00:00:00 2001 From: Mike Snitzer Date: Mon, 5 Aug 2013 12:41:04 -0400 Subject: [PATCH 7/8] dm stats: factor __dm_stat_bio out of dm_stats_bio agk raised it as something to fixup due to embedded declarations --- drivers/md/dm-stats.c | 69 +++++++++++++++++++++++++++--------------------- 1 files changed, 39 insertions(+), 30 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 2d8bfa6..2aaa18a 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -295,6 +295,43 @@ static void dm_stat_for_entry(struct dm_stat *m, size_t entry, preempt_enable(); } +void __dm_stat_bio(struct dm_stat *m, unsigned long bi_rw, + sector_t bi_sector, sector_t end_sector, + bool end, unsigned long duration) +{ + sector_t rel_sector, offset; + unsigned todo; + size_t entry; + unsigned fragment_len; + + if (end_sector <= m->start || bi_sector >= m->end) + return; + + if (unlikely(bi_sector < m->start)) { + rel_sector = 0; + todo = end_sector - m->start; + } else { + rel_sector = bi_sector - m->start; + todo = end_sector - bi_sector; + } + if (unlikely(end_sector > m->end)) + todo -= end_sector - m->end; + + offset = sector_div(rel_sector, m->step); + entry = rel_sector; + do { + BUG_ON(entry >= m->n_entries); + fragment_len = todo; + if (fragment_len > m->step - offset) + fragment_len = m->step - offset; + dm_stat_for_entry(m, entry, bi_rw, fragment_len, + end, duration); + todo -= fragment_len; + entry++; + offset = 0; + } while (unlikely(todo != 0)); +} + void dm_stats_bio(struct dm_stats *st, unsigned long bi_rw, sector_t bi_sector, unsigned bi_sectors, bool end, unsigned long duration) @@ -309,36 +346,8 @@ void dm_stats_bio(struct dm_stats *st, rcu_read_lock(); - list_for_each_entry_rcu(m, &st->list, list_entry) { - sector_t rel_sector, offset; - unsigned todo; - size_t entry; - if (end_sector <= m->start || bi_sector >= m->end) - continue; - if (unlikely(bi_sector < m->start)) { - rel_sector = 0; - todo = end_sector - m->start; - } else { - rel_sector = bi_sector - m->start; - todo = end_sector - bi_sector; - } - if (unlikely(end_sector > m->end)) - todo -= end_sector - m->end; - offset = sector_div(rel_sector, m->step); - entry = rel_sector; - do { - unsigned fragment_len; - BUG_ON(entry >= m->n_entries); - fragment_len = todo; - if (fragment_len > m->step - offset) - fragment_len = m->step - offset; - dm_stat_for_entry(m, entry, bi_rw, fragment_len, - end, duration); - todo -= fragment_len; - entry++; - offset = 0; - } while (unlikely(todo != 0)); - } + list_for_each_entry_rcu(m, &st->list, list_entry) + __dm_stat_bio(m, bi_rw, bi_sector, end_sector, end, duration); rcu_read_unlock(); } -- 1.7.1