From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.free-electrons.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1ea00i-0007LC-H5 for linux-mtd@lists.infradead.org; Fri, 12 Jan 2018 14:08:47 +0000 Date: Fri, 12 Jan 2018 15:08:22 +0100 From: Boris Brezillon To: Miquel Raynal Cc: Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Cyrille Pitchen , linux-mtd@lists.infradead.org, David Oberhollenzer Subject: Re: [PATCH] mtd: mtd_oobtest: Handle bitflips during reads Message-ID: <20180112150822.291162c8@bbrezillon> In-Reply-To: <20180111203920.8136-1-miquel.raynal@free-electrons.com> References: <20180111203920.8136-1-miquel.raynal@free-electrons.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , +David On Thu, 11 Jan 2018 21:39:20 +0100 Miquel Raynal wrote: > Reads from NAND devices usually trigger bitflips, this is an expected > behavior. While bitflips are under a given threshold, the MTD core > returns 0. However, when the number of corrected bitflips is above this > same threshold, -EUCLEAN is returned to inform the upper layer that this > block is slightly dying and soon the ECC engine will be overtaken so > actions should be taken to move the data out of it. > > This particular condition should not be treated like an error and the > test should continue. > > Signed-off-by: Miquel Raynal Applied. BTW, any volunteer to port this test in mtd-utils, or is there anything in this test preventing us implementing it in userspace? > --- > drivers/mtd/tests/oobtest.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c > index 1cb3f7758fb6..766b2c385682 100644 > --- a/drivers/mtd/tests/oobtest.c > +++ b/drivers/mtd/tests/oobtest.c > @@ -193,6 +193,9 @@ static int verify_eraseblock(int ebnum) > ops.datbuf = NULL; > ops.oobbuf = readbuf; > err = mtd_read_oob(mtd, addr, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err || ops.oobretlen != use_len) { > pr_err("error: readoob failed at %#llx\n", > (long long)addr); > @@ -227,6 +230,9 @@ static int verify_eraseblock(int ebnum) > ops.datbuf = NULL; > ops.oobbuf = readbuf; > err = mtd_read_oob(mtd, addr, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err || ops.oobretlen != mtd->oobavail) { > pr_err("error: readoob failed at %#llx\n", > (long long)addr); > @@ -286,6 +292,9 @@ static int verify_eraseblock_in_one_go(int ebnum) > > /* read entire block's OOB at one go */ > err = mtd_read_oob(mtd, addr, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err || ops.oobretlen != len) { > pr_err("error: readoob failed at %#llx\n", > (long long)addr); > @@ -527,6 +536,9 @@ static int __init mtd_oobtest_init(void) > pr_info("attempting to start read past end of OOB\n"); > pr_info("an error is expected...\n"); > err = mtd_read_oob(mtd, addr0, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err) { > pr_info("error occurred as expected\n"); > err = 0; > @@ -571,6 +583,9 @@ static int __init mtd_oobtest_init(void) > pr_info("attempting to read past end of device\n"); > pr_info("an error is expected...\n"); > err = mtd_read_oob(mtd, mtd->size - mtd->writesize, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err) { > pr_info("error occurred as expected\n"); > err = 0; > @@ -615,6 +630,9 @@ static int __init mtd_oobtest_init(void) > pr_info("attempting to read past end of device\n"); > pr_info("an error is expected...\n"); > err = mtd_read_oob(mtd, mtd->size - mtd->writesize, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err) { > pr_info("error occurred as expected\n"); > err = 0; > @@ -684,6 +702,9 @@ static int __init mtd_oobtest_init(void) > ops.datbuf = NULL; > ops.oobbuf = readbuf; > err = mtd_read_oob(mtd, addr, &ops); > + if (mtd_is_bitflip(err)) > + err = 0; > + > if (err) > goto out; > if (memcmpshow(addr, readbuf, writebuf,