On Wed, 10 Jul 2024 at 20:09, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > > blk_queue_max_segment_size() ensured: > > if (max_size < PAGE_SIZE) > max_size = PAGE_SIZE; > > whereas: > > blk_validate_limits() makes it an error: > > if (WARN_ON_ONCE(lim->max_segment_size < PAGE_SIZE)) > return -EINVAL; > > The change from one to the other, exposed sdhci which was setting maximum > segment size too low in some circumstances. > > Fix the maximum segment size when it is too low. > > Fixes: 616f87661792 ("mmc: pass queue_limits to blk_mq_alloc_disk") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> Applied for fixes, thanks! If we want to log a message due to the wrong max_seg_size, let's do that from a patch on top. Kind regards Uffe > --- > drivers/mmc/host/sdhci.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index a20df9383b20..4b91c9e96635 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -4708,6 +4708,21 @@ int sdhci_setup_host(struct sdhci_host *host) > if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) { > host->max_adma = 65532; /* 32-bit alignment */ > mmc->max_seg_size = 65535; > + /* > + * sdhci_adma_table_pre() expects to define 1 DMA > + * descriptor per segment, so the maximum segment size > + * is set accordingly. SDHCI allows up to 64KiB per DMA > + * descriptor (16-bit field), but some controllers do > + * not support "zero means 65536" reducing the maximum > + * for them to 65535. That is a problem if PAGE_SIZE is > + * 64KiB because the block layer does not support > + * max_seg_size < PAGE_SIZE, however > + * sdhci_adma_table_pre() has a workaround to handle > + * that case, and split the descriptor. Refer also > + * comment in sdhci_adma_table_pre(). > + */ > + if (mmc->max_seg_size < PAGE_SIZE) > + mmc->max_seg_size = PAGE_SIZE; > } else { > mmc->max_seg_size = 65536; > } > -- > 2.34.1 >