public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] scsi: use GFP_NOFS to avoid circular locking dependency
@ 2025-01-28 21:47 Rik van Riel
  2025-01-29  5:35 ` Christoph Hellwig
  0 siblings, 1 reply; 5+ messages in thread
From: Rik van Riel @ 2025-01-28 21:47 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Marc Aurèle La France, James E.J. Bottomley, linux-scsi,
	linux-kernel, kernel-team

Filesystems can write to disk from page reclaim with filesystem
locks held, if __GFP_FS is set. Marc found a case where 
scsi_realloc_sdev_budget_map ends up in page reclaim with GFP_KERNEL, 
where it could try to take filesystem locks again, leading to a deadlock.

WARNING: possible circular locking dependency detected
6.13.0 #1 Not tainted
------------------------------------------------------
kswapd0/70 is trying to acquire lock:
ffff8881025d5d78 (&q->q_usage_counter(io)){++++}-{0:0}, at: blk_mq_submit_bio+0x461/0x6e0

but task is already holding lock:
ffffffff81ef5f40 (fs_reclaim){+.+.}-{0:0}, at: balance_pgdat+0x9f/0x760

The full lockdep splat can be found in Marc's report:

https://lkml.org/lkml/2025/1/24/1101

Avoid the potential deadlock by doing the allocation with GFP_NOFS.

Reported-by: Marc Aurèle La France <tsi@tuyoix.net>
Signed-off-by: Rik van Riel <riel@surriel.com>
---
 drivers/scsi/scsi_scan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index f2093982b3db..93d6feef9c7c 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -245,7 +245,7 @@ static int scsi_realloc_sdev_budget_map(struct scsi_device *sdev,
 	}
 	ret = sbitmap_init_node(&sdev->budget_map,
 				scsi_device_max_queue_depth(sdev),
-				new_shift, GFP_KERNEL,
+				new_shift, GFP_NOFS,
 				sdev->request_queue->node, false, true);
 	if (!ret)
 		sbitmap_resize(&sdev->budget_map, depth);
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] scsi: use GFP_NOFS to avoid circular locking dependency
  2025-01-28 21:47 [PATCH] scsi: use GFP_NOFS to avoid circular locking dependency Rik van Riel
@ 2025-01-29  5:35 ` Christoph Hellwig
  2025-01-29 15:45   ` [PATCH v2] scsi: use GFP_NOIO " Rik van Riel
  0 siblings, 1 reply; 5+ messages in thread
From: Christoph Hellwig @ 2025-01-29  5:35 UTC (permalink / raw)
  To: Rik van Riel
  Cc: Martin K. Petersen, Marc Aurèle La France,
	James E.J. Bottomley, linux-scsi, linux-kernel, kernel-team

GFP_NOFS is never the right thing for block layer allocations.
The right thing here is GFP_NOIO which is a superset of GFP_NOFS.
Otherwise you could reproduce the same deadlock when using swap
instead of a file system to reproduce basically the same deadlock.

Note that this:

https://lore.kernel.org/linux-block/20250117074442.256705-3-hch@lst.de/T/#u

should probably fix the actual deadlock, but it might still need
annotations for lockdep to deal with the initial probing where
the queue is not frozen.  Compared to hacky annotations just using
GFP_NOIO feels simpler and more obvious.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2] scsi: use GFP_NOIO to avoid circular locking dependency
  2025-01-29  5:35 ` Christoph Hellwig
@ 2025-01-29 15:45   ` Rik van Riel
  2025-01-31  7:10     ` Christoph Hellwig
  2025-02-04  3:33     ` Martin K. Petersen
  0 siblings, 2 replies; 5+ messages in thread
From: Rik van Riel @ 2025-01-29 15:45 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Martin K. Petersen, Marc Aurèle La France,
	James E.J. Bottomley, linux-scsi, linux-kernel, kernel-team

On Tue, 28 Jan 2025 21:35:18 -0800
Christoph Hellwig <hch@infradead.org> wrote:

> GFP_NOFS is never the right thing for block layer allocations.
> The right thing here is GFP_NOIO which is a superset of GFP_NOFS.
> Otherwise you could reproduce the same deadlock when using swap
> instead of a file system to reproduce basically the same deadlock.

Duh, you are right of course!

The fixed up patch with GFP_NOIO is below.

---8<---

From 74272b4537415fd7d94c216e422510c27aa88fa0 Mon Sep 17 00:00:00 2001
From: Rik van Riel <riel@surriel.com>
Date: Tue, 28 Jan 2025 16:35:39 -0500
Subject: [PATCH] scsi: use GFP_NOIO to avoid circular locking dependency
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Filesystems can write to disk from page reclaim with __GFP_FS
set. Marc found a case where scsi_realloc_sdev_budget_map
ends up in page reclaim with GFP_KERNEL, where it could try
to take filesystem locks again, leading to a deadlock.

WARNING: possible circular locking dependency detected
6.13.0 #1 Not tainted
------------------------------------------------------
kswapd0/70 is trying to acquire lock:
ffff8881025d5d78 (&q->q_usage_counter(io)){++++}-{0:0}, at: blk_mq_submit_bio+0x461/0x6e0

but task is already holding lock:
ffffffff81ef5f40 (fs_reclaim){+.+.}-{0:0}, at: balance_pgdat+0x9f/0x760

The full lockdep splat can be found in Marc's report:

https://lkml.org/lkml/2025/1/24/1101

Avoid the potential deadlock by doing the allocation with GFP_NOIO,
which prevents both filesystem and block layer recursion.

Reported-by: Marc Aurèle La France <tsi@tuyoix.net>
Signed-off-by: Rik van Riel <riel@surriel.com>
---
 drivers/scsi/scsi_scan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index f2093982b3db..b0964b6dd646 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -245,7 +245,7 @@ static int scsi_realloc_sdev_budget_map(struct scsi_device *sdev,
 	}
 	ret = sbitmap_init_node(&sdev->budget_map,
 				scsi_device_max_queue_depth(sdev),
-				new_shift, GFP_KERNEL,
+				new_shift, GFP_NOIO,
 				sdev->request_queue->node, false, true);
 	if (!ret)
 		sbitmap_resize(&sdev->budget_map, depth);
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] scsi: use GFP_NOIO to avoid circular locking dependency
  2025-01-29 15:45   ` [PATCH v2] scsi: use GFP_NOIO " Rik van Riel
@ 2025-01-31  7:10     ` Christoph Hellwig
  2025-02-04  3:33     ` Martin K. Petersen
  1 sibling, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2025-01-31  7:10 UTC (permalink / raw)
  To: Rik van Riel
  Cc: Christoph Hellwig, Martin K. Petersen, Marc Aurèle La France,
	James E.J. Bottomley, linux-scsi, linux-kernel, kernel-team

On Wed, Jan 29, 2025 at 10:45:25AM -0500, Rik van Riel wrote:
> On Tue, 28 Jan 2025 21:35:18 -0800
> Christoph Hellwig <hch@infradead.org> wrote:
> 
> > GFP_NOFS is never the right thing for block layer allocations.
> > The right thing here is GFP_NOIO which is a superset of GFP_NOFS.
> > Otherwise you could reproduce the same deadlock when using swap
> > instead of a file system to reproduce basically the same deadlock.
> 
> Duh, you are right of course!
> 
> The fixed up patch with GFP_NOIO is below.

Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] scsi: use GFP_NOIO to avoid circular locking dependency
  2025-01-29 15:45   ` [PATCH v2] scsi: use GFP_NOIO " Rik van Riel
  2025-01-31  7:10     ` Christoph Hellwig
@ 2025-02-04  3:33     ` Martin K. Petersen
  1 sibling, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2025-02-04  3:33 UTC (permalink / raw)
  To: Christoph Hellwig, Rik van Riel
  Cc: Martin K . Petersen, Marc Aur èle La France,
	James E.J. Bottomley, linux-scsi, linux-kernel, kernel-team

On Wed, 29 Jan 2025 10:45:25 -0500, Rik van Riel wrote:

> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> Filesystems can write to disk from page reclaim with __GFP_FS
> set. Marc found a case where scsi_realloc_sdev_budget_map
> ends up in page reclaim with GFP_KERNEL, where it could try
> to take filesystem locks again, leading to a deadlock.
> 
> [...]

Applied to 6.14/scsi-fixes, thanks!

[1/1] scsi: use GFP_NOIO to avoid circular locking dependency
      https://git.kernel.org/mkp/scsi/c/5363ee9d110e

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-02-04  3:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-28 21:47 [PATCH] scsi: use GFP_NOFS to avoid circular locking dependency Rik van Riel
2025-01-29  5:35 ` Christoph Hellwig
2025-01-29 15:45   ` [PATCH v2] scsi: use GFP_NOIO " Rik van Riel
2025-01-31  7:10     ` Christoph Hellwig
2025-02-04  3:33     ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox