Skip to content

Commit

Permalink
Revert "dm bufio: fix deadlock with loop device"
Browse files Browse the repository at this point in the history
commit cf3591ef832915892f2499b7e54b51d4c578b28c upstream.

Revert the commit bd293d071ffe65e645b4d8104f9d8fe15ea13862. The proper
fix has been made available with commit d0a255e795ab ("loop: set
PF_MEMALLOC_NOIO for the worker thread").

Note that the fix offered by commit bd293d071ffe doesn't really prevent
the deadlock from occuring - if we look at the stacktrace reported by
Junxiao Bi, we see that it hangs in bit_wait_io and not on the mutex -
i.e. it has already successfully taken the mutex. Changing the mutex
from mutex_lock to mutex_trylock won't help with deadlocks that happen
afterwards.

PID: 474    TASK: ffff8813e11f4600  CPU: 10  COMMAND: "kswapd0"
   #0 [ffff8813dedfb938] __schedule at ffffffff8173f405
   ivanmeler#1 [ffff8813dedfb990] schedule at ffffffff8173fa27
   ivanmeler#2 [ffff8813dedfb9b0] schedule_timeout at ffffffff81742fec
   ivanmeler#3 [ffff8813dedfba60] io_schedule_timeout at ffffffff8173f186
   ivanmeler#4 [ffff8813dedfbaa0] bit_wait_io at ffffffff8174034f
   ivanmeler#5 [ffff8813dedfbac0] __wait_on_bit at ffffffff8173fec8
   ivanmeler#6 [ffff8813dedfbb10] out_of_line_wait_on_bit at ffffffff8173ff81
   ivanmeler#7 [ffff8813dedfbb90] __make_buffer_clean at ffffffffa038736f [dm_bufio]
   ivanmeler#8 [ffff8813dedfbbb0] __try_evict_buffer at ffffffffa0387bb8 [dm_bufio]
   #9 [ffff8813dedfbbd0] dm_bufio_shrink_scan at ffffffffa0387cc3 [dm_bufio]
  ivanmeler#10 [ffff8813dedfbc40] shrink_slab at ffffffff811a87ce
  ivanmeler#11 [ffff8813dedfbd30] shrink_zone at ffffffff811ad778
  ivanmeler#12 [ffff8813dedfbdc0] kswapd at ffffffff811ae92f
  ivanmeler#13 [ffff8813dedfbec0] kthread at ffffffff810a8428
  ivanmeler#14 [ffff8813dedfbf50] ret_from_fork at ffffffff81745242

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org
Fixes: bd293d071ffe ("dm bufio: fix deadlock with loop device")
Depends-on: d0a255e795ab ("loop: set PF_MEMALLOC_NOIO for the worker thread")
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I6cd6b254cca8cb8e72c197d44b91790c1a799554
  • Loading branch information
Mikulas Patocka authored and gregkh committed Sep 6, 2019
1 parent 7527584 commit 0170e2f
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/md/dm-bufio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1541,7 +1541,9 @@ dm_bufio_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
unsigned long freed;

c = container_of(shrink, struct dm_bufio_client, shrinker);
if (!dm_bufio_trylock(c))
if (sc->gfp_mask & __GFP_FS)
dm_bufio_lock(c);
else if (!dm_bufio_trylock(c))
return SHRINK_STOP;

freed = __scan(c, sc->nr_to_scan, sc->gfp_mask);
Expand Down

0 comments on commit 0170e2f

Please sign in to comment.