From: Andreas Gruenbacher Date: Wed, 10 Jun 2020 16:31:56 +0000 (+0200) Subject: gfs2: Don't sleep during glock hash walk X-Git-Tag: Ubuntu-5.10.0-12.13~2467^2~5 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=34244d711dea568f4a42c5b0d6b3d620f8cb6971;p=mirror_ubuntu-hirsute-kernel.git gfs2: Don't sleep during glock hash walk In flush_delete_work, instead of flushing each individual pending delayed work item, cancel and re-queue them for immediate execution. The waiting isn't needed here because we're already waiting for all queued work items to complete in gfs2_flush_delete_work. This makes the code more efficient, but more importantly, it avoids sleeping during a rhashtable walk, inside rcu_read_lock(). Signed-off-by: Andreas Gruenbacher --- diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 2299dcc417ea..8545024a1401 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1899,7 +1899,10 @@ bool gfs2_delete_work_queued(const struct gfs2_glock *gl) static void flush_delete_work(struct gfs2_glock *gl) { - flush_delayed_work(&gl->gl_delete); + if (cancel_delayed_work(&gl->gl_delete)) { + queue_delayed_work(gfs2_delete_workqueue, + &gl->gl_delete, 0); + } gfs2_glock_queue_work(gl, 0); }