Commit 8beeb3bb authored by Shmulik Ladkani's avatar Shmulik Ladkani Committed by Artem Bityutskiy

UBI: introduce new bad PEB limit

Introduce 'ubi->bad_peb_limit', which specifies an upper limit of PEBs
UBI expects to go bad.  Currently, it is initialized to a fixed percentage
of total PEBs in the UBI device (configurable via CONFIG_MTD_UBI_BEB_LIMIT).

The 'bad_peb_limit' is intended to be used for calculating the amount of PEBs
UBI needs to reserve for bad eraseblock handling.

Artem: minor amendments.
Signed-off-by: default avatarShmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
parent afe7d12b
...@@ -34,13 +34,25 @@ config MTD_UBI_BEB_RESERVE ...@@ -34,13 +34,25 @@ config MTD_UBI_BEB_RESERVE
help help
If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI
reserves some amount of physical eraseblocks to handle new bad reserves some amount of physical eraseblocks to handle new bad
eraseblocks. For example, if a flash physical eraseblock becomes bad, eraseblocks. When a physical eraseblock becomes bad, UBI uses these
UBI uses these reserved physical eraseblocks to relocate the bad one. reserved physical eraseblocks to relocate the bad one. This
This option specifies how many physical eraseblocks will be reserved configuration option specifies how many physical eraseblocks will be
for bad eraseblock handling (percents of total number of good flash reserved for bad eraseblock handling (percents of total number of
eraseblocks). If the underlying flash does not admit of bad good physical eraseblocks on this MTD partition). If the underlying
eraseblocks (e.g. NOR flash), this value is ignored and nothing is flash does not admit of bad eraseblocks (e.g. NOR flash), this value
reserved. Leave the default value if unsure. is ignored and nothing is reserved. Leave the default value if
unsure.
config MTD_UBI_BEB_LIMIT
int "Percentage of maximum expected bad eraseblocks"
default 2
range 0 25
help
This option specifies the maximum bad physical eraseblocks UBI
expects on the UBI device (percents of total number of physical
eraseblocks on this MTD partition). If the underlying flash does not
admit of bad eraseblocks (e.g. NOR flash), this value is ignored.
Leave the default value if unsure.
config MTD_UBI_GLUEBI config MTD_UBI_GLUEBI
tristate "MTD devices emulation driver (gluebi)" tristate "MTD devices emulation driver (gluebi)"
......
...@@ -607,8 +607,18 @@ static int io_init(struct ubi_device *ubi) ...@@ -607,8 +607,18 @@ static int io_init(struct ubi_device *ubi)
ubi->peb_count = mtd_div_by_eb(ubi->mtd->size, ubi->mtd); ubi->peb_count = mtd_div_by_eb(ubi->mtd->size, ubi->mtd);
ubi->flash_size = ubi->mtd->size; ubi->flash_size = ubi->mtd->size;
if (mtd_can_have_bb(ubi->mtd)) if (mtd_can_have_bb(ubi->mtd)) {
ubi->bad_allowed = 1; ubi->bad_allowed = 1;
if (CONFIG_MTD_UBI_BEB_LIMIT > 0) {
int percent = CONFIG_MTD_UBI_BEB_LIMIT;
int limit = mult_frac(ubi->peb_count, percent, 100);
/* Round it up */
if (mult_frac(limit, 100, percent) < ubi->peb_count)
limit += 1;
ubi->bad_peb_limit = limit;
}
}
if (ubi->mtd->type == MTD_NORFLASH) { if (ubi->mtd->type == MTD_NORFLASH) {
ubi_assert(ubi->mtd->writesize == 1); ubi_assert(ubi->mtd->writesize == 1);
......
...@@ -363,6 +363,7 @@ struct ubi_wl_entry; ...@@ -363,6 +363,7 @@ struct ubi_wl_entry;
* @flash_size: underlying MTD device size (in bytes) * @flash_size: underlying MTD device size (in bytes)
* @peb_count: count of physical eraseblocks on the MTD device * @peb_count: count of physical eraseblocks on the MTD device
* @peb_size: physical eraseblock size * @peb_size: physical eraseblock size
* @bad_peb_limit: top limit of expected bad physical eraseblocks
* @bad_peb_count: count of bad physical eraseblocks * @bad_peb_count: count of bad physical eraseblocks
* @good_peb_count: count of good physical eraseblocks * @good_peb_count: count of good physical eraseblocks
* @corr_peb_count: count of corrupted physical eraseblocks (preserved and not * @corr_peb_count: count of corrupted physical eraseblocks (preserved and not
...@@ -410,6 +411,7 @@ struct ubi_device { ...@@ -410,6 +411,7 @@ struct ubi_device {
int avail_pebs; int avail_pebs;
int beb_rsvd_pebs; int beb_rsvd_pebs;
int beb_rsvd_level; int beb_rsvd_level;
int bad_peb_limit;
int autoresize_vol_id; int autoresize_vol_id;
int vtbl_slots; int vtbl_slots;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment