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

Signed-off-by: Mikulas Patocka <[email protected]>
Cc: [email protected]

---
 drivers/md/dm-stats.c |    8 ++++++++
 1 file changed, 8 insertions(+)

Index: linux-2.6/drivers/md/dm-stats.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-stats.c        2022-04-24 18:51:25.000000000 
+0200
+++ linux-2.6/drivers/md/dm-stats.c     2022-04-24 18:51:25.000000000 +0200
@@ -225,6 +225,7 @@ void dm_stats_cleanup(struct dm_stats *s
                                       atomic_read(&shared->in_flight[READ]),
                                       atomic_read(&shared->in_flight[WRITE]));
                        }
+                       cond_resched();
                }
                dm_stat_free(&s->rcu_head);
        }
@@ -330,6 +331,7 @@ static int dm_stats_create(struct dm_sta
        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[WRITE], 0);
+               cond_resched();
        }
 
        if (s->n_histogram_entries) {
@@ -342,6 +344,7 @@ static int dm_stats_create(struct dm_sta
                for (ni = 0; ni < n_entries; ni++) {
                        s->stat_shared[ni].tmp.histogram = hi;
                        hi += s->n_histogram_entries + 1;
+                       cond_resched();
                }
        }
 
@@ -362,6 +365,7 @@ static int dm_stats_create(struct dm_sta
                        for (ni = 0; ni < n_entries; ni++) {
                                p[ni].histogram = hi;
                                hi += s->n_histogram_entries + 1;
+                               cond_resched();
                        }
                }
        }
@@ -497,6 +501,7 @@ static int dm_stats_list(struct dm_stats
                        }
                        DMEMIT("\n");
                }
+               cond_resched();
        }
        mutex_unlock(&stats->mutex);
 
@@ -774,6 +779,7 @@ static void __dm_stat_clear(struct dm_st
                                local_irq_enable();
                        }
                }
+               cond_resched();
        }
 }
 
@@ -889,6 +895,8 @@ static int dm_stats_print(struct dm_stat
 
                if (unlikely(sz + 1 >= maxlen))
                        goto buffer_overflow;
+
+               cond_resched();
        }
 
        if (clear)
--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to