All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Paul Cercueil" <paul.cercueil@bootlin.com>,
	"Pratyush Yadav" <pratyush@kernel.org>,
	"Michael Walle" <mwalle@kernel.org>,
	"Takahiro Kuwano" <takahiro.kuwano@infineon.com>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Richard Weinberger" <richard@nod.at>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>
Cc: "Kees Cook" <kees@kernel.org>, "Tony Luck" <tony.luck@intel.com>,
	"Guilherme G . Piccoli" <gpiccoli@igalia.com>,
	linux-mtd@lists.infradead.org,
	"Bharat Bhushan" <bbhushan2@marvell.com>,
	"Sunil Kovvuri Goutham" <sgoutham@marvell.com>,
	"Tanmay Jagdale" <tanmay@marvell.com>
Subject: Re: [PATCH v2 3/7] mtd: spi-nor: Add support for panic writes
Date: Tue, 13 Oct 2026 14:27:10 +0000	[thread overview]
Message-ID: <sashiko-outbox-169903@kernel.org> (raw)
In-Reply-To: <20261013141350.189996-4-paul.cercueil@bootlin.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] pm: spi-mem: mishandled pm_runtime_get_if_active() silently breaks panic write
- [High] mm: spi-nor: panic write allocation uses sleeping GFP mask
- [High] spi: spi-mem: panic write fallback path sleeps on ENOTSUPP
--

commit a1f9f053470ff10fa10c133dc5aeb0827bc367a1
Author: Tanmay Jagdale <tanmay@marvell.com>

    mtd: spi-nor: Add support for panic writes
    
    If the SPI controller supports it, provide the functionality of doing a
    panic write.
    
    Update the spi-nor core code and controllers to make sure they won't try
    to grab locked mutexes or sleep when doing a panic write, as preemption
    and IRQs are disabled.

> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
> index 2509fb983d4f2..281acc54b3245 100644
> --- a/drivers/mtd/spi-nor/core.c
> +++ b/drivers/mtd/spi-nor/core.c

[ ... ]

> @@ -2196,6 +2235,7 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
>  static int spi_nor_octal_dtr_write(struct spi_nor *nor, loff_t to, size_t len,
>  				   const u8 *buf)
>  {
> +	gfp_t mm_flags = GFP_KERNEL;
>  	u8 *tmp_buf;
>  	size_t bytes_written;
>  	loff_t start, end;
> @@ -2204,7 +2244,10 @@ static int spi_nor_octal_dtr_write(struct spi_nor *nor, loff_t to, size_t len,
>  	if (IS_ALIGNED(to, 2) && IS_ALIGNED(len, 2))
>  		return spi_nor_write_data(nor, to, len, buf);
>  
> -	tmp_buf = kmalloc(nor->params->page_size, GFP_KERNEL);
> +	if (nor->mtd.oops_panic_write)
> +		mm_flags |= GFP_ATOMIC;
> +
> +	tmp_buf = kmalloc(nor->params->page_size, mm_flags);

[Severity: High]
Does this bitwise OR successfully remove the sleepable __GFP_DIRECT_RECLAIM
flag?

Because mm_flags is initialized to GFP_KERNEL (which includes
__GFP_DIRECT_RECLAIM), bitwise ORing GFP_ATOMIC into the mask does not
clear the __GFP_DIRECT_RECLAIM bit. This means the resulting mask still
instructs the page allocator that it is allowed to sleep and enter direct
reclaim.

Since panic writes execute in a strictly atomic context with preemption and
local interrupts disabled, could this trigger a bug or deadlock and prevent
the oops log from being saved?

[ ... ]

> @@ -3589,8 +3652,13 @@ static int spi_nor_set_mtd_info(struct spi_nor *nor)
>  	mtd->size = nor->params->size;
>  	mtd->_read = spi_nor_read;
>  	/* Might be already set by some SST flashes. */
> -	if (!mtd->_write)
> +	if (!mtd->_write) {
>  		mtd->_write = spi_nor_write;
> +		if (nor->spimem &&
> +		    spi_mem_controller_is_capable(nor->spimem->spi->controller, panic_write)) {
> +			mtd->_panic_write = spi_nor_panic_write;
> +		}
> +	}

[Severity: Critical]
By hooking up panic write here, this delegates to spi_mem_exec_op() in
drivers/spi/spi-mem.c, which seems to mishandle the runtime pm reference
for panic writes.

In spi_mem_exec_op(), the panic write path does:

    else if (ctlr->auto_runtime_pm)
        ret = pm_runtime_get_if_active(ctlr->dev.parent);
    if (ret)
        return ret;

Since pm_runtime_get_if_active() returns 1 if the device is active, this
catches the success case (1) as an error and returns immediately, skipping
ctlr->mem_ops->exec_op() and leaking the pm reference.

Conversely, if the device was suspended, it returns 0, execution continues
on the suspended controller, and the subsequent pm_runtime_put_noidle() will
underflow the usage count.

Does this silently break the panic write execution?

[Severity: High]
Additionally, if the controller's exec_op() method dynamically returns
-ENOTSUPP or -EOPNOTSUPP, spi_mem_exec_op() falls back to a path that
cannot execute in atomic context:

    tmpbuf = kzalloc(tmpbufsize, GFP_KERNEL | GFP_DMA);
    ...
    ret = spi_sync(mem->spi, &msg);

Both kzalloc(GFP_KERNEL) and spi_sync() can sleep. If this fallback is
triggered during a panic write, will it violate atomic context constraints
and deadlock?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261013141350.189996-1-paul.cercueil@bootlin.com?part=3

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2026-10-13 14:27 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13 14:13 [PATCH v2 0/7] spi: Add support for panic mem writes Paul Cercueil
2026-10-13 14:13 ` Paul Cercueil
2026-10-13 14:13 ` [PATCH v2 1/7] spi: spi-mem: " Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:23   ` sashiko-bot
2026-10-13 15:33     ` Paul Cercueil
2026-10-13 15:57       ` Miquel Raynal
2026-10-13 14:13 ` [PATCH v2 2/7] mtd: spi-nor: Wait for NOR ready with poll_timeout_us() Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:30   ` sashiko-bot
2026-10-13 15:29     ` Paul Cercueil
2026-10-13 14:13 ` [PATCH v2 3/7] mtd: spi-nor: Add support for panic writes Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:27   ` sashiko-bot [this message]
2026-10-13 15:35     ` Paul Cercueil
2026-10-13 14:13 ` [PATCH v2 4/7] spi: cadence-xspi: Clear "SDMA ready" IRQ flag after polling Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:13 ` [PATCH v2 5/7] spi: cadence-xspi: Add irq-less support Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:33   ` sashiko-bot
2026-10-13 15:40     ` Paul Cercueil
2026-10-13 14:13 ` [PATCH v2 6/7] spi: cadence-xspi: Add support for panic writes Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:29   ` sashiko-bot
2026-10-13 14:13 ` [PATCH v2 7/7] spi: dt-bindings: cadence: Make XSPI's IRQ line optional Paul Cercueil
2026-10-13 14:13   ` Paul Cercueil
2026-10-13 14:20   ` sashiko-bot

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=sashiko-outbox-169903@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=bbhushan2@marvell.com \
    --cc=broonie@kernel.org \
    --cc=gpiccoli@igalia.com \
    --cc=kees@kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=mwalle@kernel.org \
    --cc=paul.cercueil@bootlin.com \
    --cc=pratyush@kernel.org \
    --cc=richard@nod.at \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=sgoutham@marvell.com \
    --cc=takahiro.kuwano@infineon.com \
    --cc=tanmay@marvell.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=tony.luck@intel.com \
    --cc=vigneshr@ti.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.