Round UBI average erase count up to next integer

Message ID 20180918130521.22880-2-amworsley@gmail.com
State New
Delegated to: Richard Weinberger
Headers show
Series
  • Round UBI average erase count up to next integer
Related show

Commit Message

Andrew Worsley Sept. 18, 2018, 1:05 p.m.
Use a slightly larger than average EC so these PEBs will be
reinitialised with erase counts that make them less likely to
be reused than other (perhaps less worn or error-prone) PEBs

We have more frequent ECC failures on reads of page 0 of some PEBs
which manifest itself commonly during ubiattach. We believe this is due to
"program disturb" and want those PEB to be re-used later than average.

Signed-off-by: Andrew Worsley <amworsley@gmail.com>
---
 drivers/mtd/ubi/attach.c  | 2 +-
 drivers/mtd/ubi/fastmap.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

Comments

Richard Weinberger Sept. 18, 2018, 2:31 p.m. | #1
Andrew,

Am Dienstag, 18. September 2018, 15:05:21 CEST schrieb Andrew Worsley:
> Use a slightly larger than average EC so these PEBs will be
> reinitialised with erase counts that make them less likely to
> be reused than other (perhaps less worn or error-prone) PEBs
> 
> We have more frequent ECC failures on reads of page 0 of some PEBs
> which manifest itself commonly during ubiattach. We believe this is due to
> "program disturb" and want those PEB to be re-used later than average.

So the general idea behind the patch is that we want to hold back PEBs
that lost the EC header since they must be less healthy than others?
More precisely such that this PEB will be less likely picked by find_mean_wl_entry().

Did you check, doesn't this make it more likely that such a "bad" PEB is more often
picked by wear leveling? It does not use find_mean_wl_entry().

Thanks,
//richard

Patch

diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c
index 93ceea4f27d5..f97e2ba56fb2 100644
--- a/drivers/mtd/ubi/attach.c
+++ b/drivers/mtd/ubi/attach.c
@@ -1414,7 +1414,7 @@  static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai,
 
 	/* Calculate mean erase counter */
 	if (ai->ec_count)
-		ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
+		ai->mean_ec = div_u64(ai->ec_sum+ai->ec_count-1, ai->ec_count);
 
 	err = late_analysis(ubi, ai);
 	if (err)
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c
index 462526a10537..91e513788f38 100644
--- a/drivers/mtd/ubi/fastmap.c
+++ b/drivers/mtd/ubi/fastmap.c
@@ -684,7 +684,7 @@  static int ubi_attach_fastmap(struct ubi_device *ubi,
 			be32_to_cpu(fmec->ec), 1);
 	}
 
-	ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
+	ai->mean_ec = div_u64(ai->ec_sum+ai->ec_count-1, ai->ec_count);
 	ai->bad_peb_count = be32_to_cpu(fmhdr->bad_peb_count);
 
 	/* Iterate over all volumes and read their EBA table */