dm writecache: add cond_resched to avoid CPU hangs
authorMikulas Patocka <mpatocka@redhat.com>
Fri, 27 Mar 2020 11:22:36 +0000 (07:22 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 Apr 2020 08:50:17 +0000 (10:50 +0200)
commit 1edaa447d958bec24c6a79685a5790d98976fd16 upstream.

Initializing a dm-writecache device can take a long time when the
persistent memory device is large.  Add cond_resched() to a few loops
to avoid warnings that the CPU is stuck.

Cc: stable@vger.kernel.org # v4.18+
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/dm-writecache.c

index 184dabc..5bf60d6 100644 (file)
@@ -872,6 +872,7 @@ static int writecache_alloc_entries(struct dm_writecache *wc)
                struct wc_entry *e = &wc->entries[b];
                e->index = b;
                e->write_in_progress = false;
+               cond_resched();
        }
 
        return 0;
@@ -926,6 +927,7 @@ static void writecache_resume(struct dm_target *ti)
                        e->original_sector = le64_to_cpu(wme.original_sector);
                        e->seq_count = le64_to_cpu(wme.seq_count);
                }
+               cond_resched();
        }
 #endif
        for (b = 0; b < wc->n_blocks; b++) {
@@ -1770,8 +1772,10 @@ static int init_memory(struct dm_writecache *wc)
        pmem_assign(sb(wc)->n_blocks, cpu_to_le64(wc->n_blocks));
        pmem_assign(sb(wc)->seq_count, cpu_to_le64(0));
 
-       for (b = 0; b < wc->n_blocks; b++)
+       for (b = 0; b < wc->n_blocks; b++) {
                write_original_sector_seq_count(wc, &wc->entries[b], -1, -1);
+               cond_resched();
+       }
 
        writecache_flush_all_metadata(wc);
        writecache_commit_flushed(wc, false);