[PATCH] mtd: nand: fix shutdown/reboot for multi-chip systems
Scott Branden
sbranden at broadcom.com
Fri Nov 13 15:49:04 PST 2015
On 15-11-09 04:37 PM, Brian Norris wrote:
> If multiple NAND chips are registered to the same controller, then when
> rebooting the system, the first one will grab the controller lock, while
> the second will wait forever for the first one to release it. i.e., a
> classic deadlock.
>
> This problem was solved for a similar case (suspend/resume) back in
> commit 6b0d9a841249 ("mtd: nand: fix multi-chip suspend problem"), and
> the shutdown state really isn't much different for us, so rather than
> adding a new special case to nand_get_device(), we can just overload the
> FL_PM_SUSPENDED state.
>
> Now, multiple chips can "get" the same controller lock (preventing
> further I/O), while we still allow other chips to pass through
> nand_shutdown().
>
> Original report:
> http://thread.gmane.org/gmane.linux.drivers.mtd/59726
> http://lists.infradead.org/pipermail/linux-mtd/2015-July/059992.html
>
> Fixes: 72ea403669c7 ("mtd: nand: added nand_shutdown")
> Reported-by: Andrew E. Mileski <andrewm at isoar.ca>
> Signed-off-by: Brian Norris <computersforpeace at gmail.com>
> Cc: Scott Branden <sbranden at broadcom.com>
> Cc: Andrew E. Mileski <andrewm at isoar.ca>
> ---
> I only compile-tested
>
> If we get proper tests, this is probably 4.4 material
I reviewed the code in nand_get_device and it looks sane whether
FL_SHUTDOWN or PL_PM_SUSPENDED is called.
Acked-by: Scott Branden <sbranden at broadcom.com>
>
> drivers/mtd/nand/nand_base.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index cc74142938b0..ece544efccc3 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -3110,7 +3110,7 @@ static void nand_resume(struct mtd_info *mtd)
> */
> static void nand_shutdown(struct mtd_info *mtd)
> {
> - nand_get_device(mtd, FL_SHUTDOWN);
> + nand_get_device(mtd, FL_PM_SUSPENDED);
> }
>
> /* Set default functions */
>
More information about the linux-mtd
mailing list