Re: [PATCH] mmc: core: Use GFP_NOIO in ACMD22

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 15 Oct 2024 at 11:44, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
>
> On 14/10/24 14:44, Avri Altman wrote:
> > While reviewing the SDUC series, Adrian made a comment concerning the
> > memory allocation code in mmc_sd_num_wr_blocks() - see [1].
> > Prevent memory allocations from triggering I/O operations while ACMD22
> > is in progress.
> >
> > [1] https://www.spinics.net/lists/linux-mmc/msg82199.html
> >
> > Suggested-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> > Signed-off-by: Avri Altman <avri.altman@xxxxxxx>
> > Cc: stable@xxxxxxxxxxxxxxx
> > ---
> >  drivers/mmc/core/block.c | 10 +++++++++-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> > index 04f3165cf9ae..042b0147d47e 100644
> > --- a/drivers/mmc/core/block.c
> > +++ b/drivers/mmc/core/block.c
> > @@ -995,6 +995,8 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)
> >       u32 result;
> >       __be32 *blocks;
> >       u8 resp_sz = mmc_card_ult_capacity(card) ? 8 : 4;
> > +     unsigned int noio_flag;
> > +
> >       struct mmc_request mrq = {};
> >       struct mmc_command cmd = {};
> >       struct mmc_data data = {};
> > @@ -1018,9 +1020,13 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)
> >       mrq.cmd = &cmd;
> >       mrq.data = &data;
> >
> > +     noio_flag = memalloc_noio_save();
> > +
> >       blocks = kmalloc(resp_sz, GFP_KERNEL);
>
> Could have memalloc_noio_restore() here:
>
>         memalloc_noio_restore(noio_flag);
>
> but I feel maybe adding something like:
>
>         u64 __aligned(8)        tiny_io_buf;
>
> to either struct mmc_card or struct mmc_host is better?
> Ulf, any thoughts?
>

I have no strong opinion.

A third option could be to allocate the buffer dynamically in the
struct mmc_card when probing the mmc block device driver, based on
mmc_card_sd() returning true.

if (mmc_card_sd())
   card->io_buf = devm_kmalloc(&card->dev, 4, GFP_KERNEL);

Kind regards
Uffe




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux