mtd: nand: reduce the warning noise when the ECC is too weak

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Sun Jul 13 22:59:01 PDT 2014


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=54c39e9ba3a93e3848ad8f9d082c39010cfc5e73
Commit:     54c39e9ba3a93e3848ad8f9d082c39010cfc5e73
Parent:     6938ad40cb97a52d88a763008935340729a4acc7
Author:     Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
AuthorDate: Wed Jul 2 15:16:32 2014 +0200
Committer:  Brian Norris <computersforpeace at gmail.com>
CommitDate: Sun Jul 13 22:19:02 2014 -0700

    mtd: nand: reduce the warning noise when the ECC is too weak
    
    In commit 67a9ad9b8a6f ("mtd: nand: Warn the user if the selected ECC
    strength is too weak"), a check was added to inform the user when the
    ECC used for a NAND device is weaker than the recommended ECC
    advertised by the NAND chip. However, the warning uses WARN_ON(),
    which has two undesirable side-effects:
    
     - It just prints to the kernel log the fact that there is a warning
       in this file, at this line, but it doesn't explain anything about
       the warning itself.
    
     - It dumps a stack trace which is very noisy, for something that the
       user is most likely not able to fix. If a certain ECC used by the
       kernel is weaker than the advertised one, it's most likely to make
       sure the kernel uses an ECC that is compatible with the one used by
       the bootloader, and changing the bootloader may not necessarily be
       easy. Therefore, normal users would not be able to do anything to
       fix this very noisy warning, and will have to suffer from it at
       every kernel boot. At least every time I see this stack trace in my
       kernel boot log, I wonder what new thing is broken, just to realize
       that it's once again this NAND ECC warning.
    
    Therefore, this commit turns:
    
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 1 at /home/thomas/projets/linux-2.6/drivers/mtd/nand/nand_base.c:4051 nand_scan_tail+0x538/0x780()
    Modules linked in:
    CPU: 0 PID: 1 Comm: swapper Not tainted 3.16.0-rc3-dirty #4
    [<c000e3dc>] (unwind_backtrace) from [<c000bee4>] (show_stack+0x10/0x14)
    [<c000bee4>] (show_stack) from [<c0018180>] (warn_slowpath_common+0x6c/0x8c)
    [<c0018180>] (warn_slowpath_common) from [<c001823c>] (warn_slowpath_null+0x1c/0x24)
    [<c001823c>] (warn_slowpath_null) from [<c02c50cc>] (nand_scan_tail+0x538/0x780)
    [<c02c50cc>] (nand_scan_tail) from [<c0639f78>] (orion_nand_probe+0x224/0x2e4)
    [<c0639f78>] (orion_nand_probe) from [<c026da00>] (platform_drv_probe+0x18/0x4c)
    [<c026da00>] (platform_drv_probe) from [<c026c1f4>] (really_probe+0x80/0x218)
    [<c026c1f4>] (really_probe) from [<c026c47c>] (__driver_attach+0x98/0x9c)
    [<c026c47c>] (__driver_attach) from [<c026a8f0>] (bus_for_each_dev+0x64/0x94)
    [<c026a8f0>] (bus_for_each_dev) from [<c026bae4>] (bus_add_driver+0x144/0x1ec)
    [<c026bae4>] (bus_add_driver) from [<c026cb00>] (driver_register+0x78/0xf8)
    [<c026cb00>] (driver_register) from [<c026da5c>] (platform_driver_probe+0x20/0xb8)
    [<c026da5c>] (platform_driver_probe) from [<c00088b8>] (do_one_initcall+0x80/0x1d8)
    [<c00088b8>] (do_one_initcall) from [<c0620c9c>] (kernel_init_freeable+0xf4/0x1b4)
    [<c0620c9c>] (kernel_init_freeable) from [<c049a098>] (kernel_init+0x8/0xec)
    [<c049a098>] (kernel_init) from [<c00095f0>] (ret_from_fork+0x14/0x24)
    ---[ end trace 62f87d875aceccb4 ]---
    
    Into the much shorter, and much more useful:
    
    nand: WARNING: MT29F2G08ABAEAWP: the ECC used on your system is too weak compared to the one required by the NAND chip
    
    Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/nand/nand_base.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 41167e9..4f3e80c 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -4047,8 +4047,10 @@ int nand_scan_tail(struct mtd_info *mtd)
 		ecc->layout->oobavail += ecc->layout->oobfree[i].length;
 	mtd->oobavail = ecc->layout->oobavail;
 
-	/* ECC sanity check: warn noisily if it's too weak */
-	WARN_ON(!nand_ecc_strength_good(mtd));
+	/* ECC sanity check: warn if it's too weak */
+	if (!nand_ecc_strength_good(mtd))
+		pr_warn("WARNING: %s: the ECC used on your system is too weak compared to the one required by the NAND chip\n",
+			mtd->name);
 
 	/*
 	 * Set the number of read / write steps for one page depending on ECC



More information about the linux-mtd-cvs mailing list