From 008a6ba96f016fd0a3e8bb35cdce3d27e1c11363 Mon Sep 17 00:00:00 2001 From: Mike Snitzer Date: Mon, 5 Aug 2013 18:33:47 -0400 Subject: [PATCH 9/9] dm stats: move stats mutex locking out of dm_stats_find to caller also rename functions that are called while mutex is locked or rcu locked (to have leading double underscores) --- drivers/md/dm-stats.c | 63 +++++++++++++++++++++++++++++------------------- 1 files changed, 38 insertions(+), 25 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 2025228..61f5739 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -325,12 +325,10 @@ free_ret: return -ENOMEM; } -static struct dm_stat *dm_stats_find(struct dm_stats *st, int id) +static struct dm_stat *__dm_stats_find(struct dm_stats *st, int id) { struct dm_stat *m; - mutex_lock(&st->mutex); - list_for_each_entry(m, &st->list, list_entry) { if (m->id > id) break; @@ -338,8 +336,6 @@ static struct dm_stat *dm_stats_find(struct dm_stats *st, int id) return m; } - mutex_unlock(&st->mutex); - return NULL; } @@ -348,9 +344,13 @@ static int dm_stats_delete(struct dm_stats *st, int id) struct dm_stat *m; int cpu; - m = dm_stats_find(st, id); - if (!m) + mutex_lock(&st->mutex); + + m = __dm_stats_find(st, id); + if (!m) { + mutex_unlock(&st->mutex); return -ENOENT; + } list_del_rcu(&m->list_entry); mutex_unlock(&st->mutex); @@ -457,9 +457,10 @@ 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, struct dm_stats_aux *aux) +static 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, + struct dm_stats_aux *aux) { sector_t rel_sector, offset; unsigned todo; @@ -522,13 +523,13 @@ void dm_stats_bio(struct dm_stats *st, rcu_read_lock(); list_for_each_entry_rcu(m, &st->list, list_entry) - dm_stat_bio(m, bi_rw, bi_sector, end_sector, end, duration, aux); + __dm_stat_bio(m, bi_rw, bi_sector, end_sector, end, duration, aux); rcu_read_unlock(); } -static void dm_stat_init_temporary_percpu_totals(struct dm_stat_shared *s, - struct dm_stat *m, size_t x) +static void __dm_stat_init_temporary_percpu_totals(struct dm_stat_shared *s, + struct dm_stat *m, size_t x) { int cpu; struct dm_stat_percpu *p; @@ -556,8 +557,8 @@ static void dm_stat_init_temporary_percpu_totals(struct dm_stat_shared *s, } } -static void dm_stat_clear(struct dm_stat *m, size_t idx_start, size_t idx_end, - bool init_tmp_percpu_totals) +static void __dm_stat_clear(struct dm_stat *m, size_t idx_start, size_t idx_end, + bool init_tmp_percpu_totals) { size_t x; struct dm_stat_shared *s; @@ -566,7 +567,7 @@ static void dm_stat_clear(struct dm_stat *m, size_t idx_start, size_t idx_end, for (x = idx_start; x < idx_end; x++) { s = &m->stat_shared[x]; if (init_tmp_percpu_totals) - dm_stat_init_temporary_percpu_totals(s, m ,x); + __dm_stat_init_temporary_percpu_totals(s, m ,x); local_irq_disable(); p = &m->stat_percpu[smp_processor_id()][x]; p->sectors[0] -= s->tmp.sectors[0]; @@ -589,11 +590,15 @@ static int dm_stats_clear(struct dm_stats *st, int id) { struct dm_stat *m; - m = dm_stats_find(st, id); - if (!m) + mutex_lock(&st->mutex); + + m = __dm_stats_find(st, id); + if (!m) { + mutex_unlock(&st->mutex); return -ENOENT; + } - dm_stat_clear(m, 0, m->n_entries, true); + __dm_stat_clear(m, 0, m->n_entries, true); mutex_unlock(&st->mutex); @@ -631,9 +636,13 @@ static int dm_stats_print(struct dm_stats *st, int id, size_t idx_end; struct dm_stat_shared *s; - m = dm_stats_find(st, id); - if (!m) + mutex_lock(&st->mutex); + + m = __dm_stats_find(st, id); + if (!m) { + mutex_unlock(&st->mutex); return -ENOENT; + } idx_end = idx_start + idx_len; if (idx_end < idx_start || @@ -651,7 +660,7 @@ static int dm_stats_print(struct dm_stats *st, int id, if (unlikely(end > m->end)) end = m->end; - dm_stat_init_temporary_percpu_totals(s, m, x); + __dm_stat_init_temporary_percpu_totals(s, m, x); DMEMIT("%llu-%llu %llu %llu %llu %llu %llu %llu %llu %llu %d %llu %llu %llu %llu\n", (unsigned long long)start, @@ -675,7 +684,7 @@ static int dm_stats_print(struct dm_stats *st, int id, } if (clear) - dm_stat_clear(m, idx_start, idx_end, false); + __dm_stat_clear(m, idx_start, idx_end, false); buffer_overflow: mutex_unlock(&st->mutex); @@ -687,9 +696,13 @@ static int dm_stats_set_aux(struct dm_stats *st, int id, const char *aux) { struct dm_stat *m; - m = dm_stats_find(st, id); - if (!m) + mutex_lock(&st->mutex); + + m = __dm_stats_find(st, id); + if (!m) { + mutex_unlock(&st->mutex); return -ENOENT; + } aux = kstrdup(aux, GFP_KERNEL); if (!aux) { -- 1.7.1