From: Damien Le Moal <dlemoal@kernel.org>
To: "Siwinski, Steve" <ssiwinski@atto.com>,
Christoph Hellwig <hch@infradead.org>
Cc: bgrove@atto.com, James.Bottomley@hansenpartnership.com,
linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
martin.petersen@oracle.com,
Steve Siwinski <stevensiwinski@gmail.com>
Subject: Re: [PATCH] scsi: sd_zbc: Limit the report zones buffer size to UIO_MAXIOV
Date: Fri, 25 Apr 2025 10:42:46 +0900 [thread overview]
Message-ID: <ff2ba1e1-a7bd-49b7-a1f2-e51f5cfed27a@kernel.org> (raw)
In-Reply-To: <05faf356-0bc7-4fdf-8a74-f738365fad20@atto.com>
On 4/25/25 00:33, Siwinski, Steve wrote:
> My issue is not with passthough report zones.
>
> The report zones command is failing on driver load and causing the drive
> to fail to appear as a block device. If queue_max_segments is set to a
> value over 1024, then nr_vecs in bio_alloc() will be greater than
> UIO_MAXIOV and bio_alloc() will return NULL.
OK... A remainder about the path:
sd_zbc_do_report_zones() -> scsi_execute_cmd() -> blk_rq_map_kern() ->
bio_map_kern() -> bio_kmalloc()
and the fact that bio_kmalloc() does not allow more than UIO_MAXIOV segments
would have made things clear from the beginning. I had to look it up again to
understand why UIO_MAXIOV matters.
> This causes the error.
> ```
> sd 8:0:0:0: [sdb] REPORT ZONES start lba 0 failed
> sd 8:0:0:0: [sdb] REPORT ZONES: Result: hostbyte=0xff driverbyte=DRIVER_OK
> sdb: failed to revalidate zones
> ```
>
> You can reproduce this by setting the max_sgl_entries parameter to 2k or
> greater in the mpt3sas driver. Other drivers can also reproduce this
> behavior.
Well, I think that the problem you uncovered here is a lot more fundamental than
just ZBC report zones. If the drive has a queue_max_segments() value larger than
UIO_MAXIOV, any attempt to map a large buffer for any command (e.g. a read) will
also fail. So this limit inconsistency seems wrong...
Christoph ? Since you were touching the vmalloc-ed BIO mapping code, do you have
any idea about this ? The quick and dirty fix would be to do:
diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
index 7a447ff600d2..3cb897b25878 100644
--- a/drivers/scsi/sd_zbc.c
+++ b/drivers/scsi/sd_zbc.c
@@ -169,6 +169,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
unsigned int nr_zones, size_t *buflen)
{
struct request_queue *q = sdkp->disk->queue;
+ size_t max_segs;
size_t bufsize;
void *buf;
@@ -185,7 +186,8 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
bufsize = roundup((nr_zones + 1) * 64, SECTOR_SIZE);
bufsize = min_t(size_t, bufsize,
queue_max_hw_sectors(q) << SECTOR_SHIFT);
- bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
+ max_segs = min(queue_max_segments(q), UIO_MAXIOV);
+ bufsize = min_t(size_t, bufsize, max_segs << PAGE_SHIFT);
while (bufsize >= SECTOR_SIZE) {
buf = kvzalloc(bufsize, GFP_KERNEL | __GFP_NORETRY);
But that feels wrong...
--
Damien Le Moal
Western Digital Research
next prev parent reply other threads:[~2025-04-25 1:42 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-11 20:36 [PATCH] scsi: sd_zbc: Limit the report zones buffer size to UIO_MAXIOV Steve Siwinski
2025-04-14 5:52 ` Christoph Hellwig
[not found] ` <OFA5AB0241.ED5C089D-ON85258C70.0068BDE0-85258C70.00721A7A@atto.com>
2025-04-18 21:29 ` Damien Le Moal
2025-04-24 15:33 ` Siwinski, Steve
2025-04-25 1:42 ` Damien Le Moal [this message]
2025-04-30 14:06 ` Christoph Hellwig
2025-05-02 19:35 ` [PATCH v2] block, scsi: sd_zbc: Respect bio vector limits for report zones buffer Steve Siwinski
2025-05-06 2:29 ` Damien Le Moal
2025-05-08 20:01 ` [PATCH v3] " Steve Siwinski
2025-05-08 23:08 ` Damien Le Moal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ff2ba1e1-a7bd-49b7-a1f2-e51f5cfed27a@kernel.org \
--to=dlemoal@kernel.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=bgrove@atto.com \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ssiwinski@atto.com \
--cc=stevensiwinski@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.