提交 9ca0a0a9 编写于 作者: M Mikulas Patocka 提交者: Zheng Zengkai

dm stats: add cond_resched when looping over entries

stable inclusion
from stable-v5.10.120
commit e39b536d70edc5f622187cf787db94287e389c50
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5L6BR

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=e39b536d70edc5f622187cf787db94287e389c50

--------------------------------

commit bfe2b014 upstream.

dm-stats can be used with a very large number of entries (it is only
limited by 1/4 of total system memory), so add rescheduling points to
the loops that iterate over the entries.

Cc: stable@vger.kernel.org
Signed-off-by: NMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: NMike Snitzer <snitzer@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
上级 8e2df291
...@@ -224,6 +224,7 @@ void dm_stats_cleanup(struct dm_stats *stats) ...@@ -224,6 +224,7 @@ void dm_stats_cleanup(struct dm_stats *stats)
atomic_read(&shared->in_flight[READ]), atomic_read(&shared->in_flight[READ]),
atomic_read(&shared->in_flight[WRITE])); atomic_read(&shared->in_flight[WRITE]));
} }
cond_resched();
} }
dm_stat_free(&s->rcu_head); dm_stat_free(&s->rcu_head);
} }
...@@ -313,6 +314,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end, ...@@ -313,6 +314,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
for (ni = 0; ni < n_entries; ni++) { for (ni = 0; ni < n_entries; ni++) {
atomic_set(&s->stat_shared[ni].in_flight[READ], 0); atomic_set(&s->stat_shared[ni].in_flight[READ], 0);
atomic_set(&s->stat_shared[ni].in_flight[WRITE], 0); atomic_set(&s->stat_shared[ni].in_flight[WRITE], 0);
cond_resched();
} }
if (s->n_histogram_entries) { if (s->n_histogram_entries) {
...@@ -325,6 +327,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end, ...@@ -325,6 +327,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
for (ni = 0; ni < n_entries; ni++) { for (ni = 0; ni < n_entries; ni++) {
s->stat_shared[ni].tmp.histogram = hi; s->stat_shared[ni].tmp.histogram = hi;
hi += s->n_histogram_entries + 1; hi += s->n_histogram_entries + 1;
cond_resched();
} }
} }
...@@ -345,6 +348,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end, ...@@ -345,6 +348,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
for (ni = 0; ni < n_entries; ni++) { for (ni = 0; ni < n_entries; ni++) {
p[ni].histogram = hi; p[ni].histogram = hi;
hi += s->n_histogram_entries + 1; hi += s->n_histogram_entries + 1;
cond_resched();
} }
} }
} }
...@@ -474,6 +478,7 @@ static int dm_stats_list(struct dm_stats *stats, const char *program, ...@@ -474,6 +478,7 @@ static int dm_stats_list(struct dm_stats *stats, const char *program,
} }
DMEMIT("\n"); DMEMIT("\n");
} }
cond_resched();
} }
mutex_unlock(&stats->mutex); mutex_unlock(&stats->mutex);
...@@ -750,6 +755,7 @@ static void __dm_stat_clear(struct dm_stat *s, size_t idx_start, size_t idx_end, ...@@ -750,6 +755,7 @@ static void __dm_stat_clear(struct dm_stat *s, size_t idx_start, size_t idx_end,
local_irq_enable(); local_irq_enable();
} }
} }
cond_resched();
} }
} }
...@@ -865,6 +871,8 @@ static int dm_stats_print(struct dm_stats *stats, int id, ...@@ -865,6 +871,8 @@ static int dm_stats_print(struct dm_stats *stats, int id,
if (unlikely(sz + 1 >= maxlen)) if (unlikely(sz + 1 >= maxlen))
goto buffer_overflow; goto buffer_overflow;
cond_resched();
} }
if (clear) if (clear)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册