One bad PEB causes WL to run of PEBs

Winchenbach, Samuel Samuel-Winchenbach at idexx.com
Fri Jan 9 05:29:24 PST 2015


I think we figured it out.

In attach_by_scanning in build.c ubi_eba_init_scan is called before ubi_wl_init_scan.   eba_init_scan grabs all remaining (up to some limit) of available PEBs for bad PEB recovery.   We simply moved ubi_wl_init_scan before the eba scan so wear leveling has a chance to grab one of good PEBs before eba gobbles them up.

We also noticed that this change has been made in newer version of uboot/ubi.

Sam

________________________________________
From: Richard Weinberger [richard.weinberger at gmail.com]
Sent: Thursday, January 08, 2015 4:53 PM
To: Winchenbach, Samuel
Cc: linux-mtd at lists.infradead.org
Subject: Re: One bad PEB causes WL to run of PEBs

On Thu, Jan 8, 2015 at 5:33 PM, Winchenbach, Samuel
<Samuel-Winchenbach at idexx.com> wrote:
> Hi All,
>
> I am working on an instrument with uboot v2013.01.  This instrument experienced a nand corruption on one of the blocks (incrementing the bad PEB count to 1) when someone pulled the power plug.  When the instrument booted ubi_wl_init_scan had an error because avail_pebs was 0 and 1 was needed.   We added a bunch of debug prints and this is what it looks like (good and bad):
>
> ===== GOOD (BEFORE GETTING A BAD PEB) =====
> idexx> ubi part nand-rootfs
> UBI: mtd1 is detached from ubi0
> Creating 1 MTD partitions on "nand0":
> 0x000001500000-0x000020000000 : "mtd=5"
> UBI: attaching mtd1 to ubi0
> UBI: physical eraseblock size:   131072 bytes (128 KiB)
> UBI: logical eraseblock size:    129024 bytes
> UBI: smallest flash I/O unit:    2048
> UBI: sub-page size:              512
> UBI: VID header offset:          512 (aligned 512)
> UBI: data offset:                2048
> UBI error: process_eb: DEBUG! found volume table at peb: 3926
>
> UBI error: process_eb: DEBUG! found volume table at peb: 3927
>
> UBI error: attach_by_scanning: DEBUG! peb_count: 3928 bad_peb_count: 0
>
> UBI error: ubi_read_volume_table: DEBUG!
>         reserved_pebs: 755957760

huh?

>         alignment: 16777216
>         data_pad: 0
>         vol_type: 1
>         upd_marker: 0
>         name_len: 2816
>         name: nand-rootfs
>         flags: 0
>
> UBI error: ubi_read_volume_table: DEBUG!: setting avail_pebs = 3928
> UBI error: init_volumes: DEBUG! subtracting 3887 from avail_pebs.  Now 41
> UBI error: ubi_eba_init_scan: DEBUG! subtracting 1 from avail_pebs.  Now 40
> UBI error: ubi_eba_init_scan: DEBUG! subtracting 39 from avail_pebs.  Now 1
> UBI error: ubi_wl_init_scan: DEBUG! subtracting 1 from avail_pebs.  Now 0
> UBI: attached mtd1 to ubi0
> UBI: MTD device name:            "mtd=5"
> UBI: MTD device size:            491 MiB
> UBI: number of good PEBs:        3928
> UBI: number of bad PEBs:         0
> UBI: max. allowed volumes:       128
> UBI: wear-leveling threshold:    4096
> UBI: number of internal volumes: 1
> UBI: number of user volumes:     1
> UBI: available PEBs:             0
> UBI: total number of reserved PEBs: 3928
> UBI: number of PEBs reserved for bad PEB handling: 39
> UBI: max/mean erase counter: 21/10
>
>
>
> ===== BAD (AFTER GETTING A BAD PEB) =====
> idexx> ubi part nand-rootfs
> Creating 1 MTD partitions on "nand0":
> 0x000001500000-0x000020000000 : "mtd=5"
> UBI: attaching mtd1 to ubi0
> UBI: physical eraseblock size:   131072 bytes (128 KiB)
> UBI: logical eraseblock size:    129024 bytes
> UBI: smallest flash I/O unit:    2048
> UBI: sub-page size:              512
> UBI: VID header offset:          512 (aligned 512)
> UBI: data offset:                2048
> UBI error: process_eb: DEBUG! found volume table at peb: 3926
>
> UBI error: process_eb: DEBUG! found volume table at peb: 3927
>
> UBI error: attach_by_scanning: DEBUG! peb_count: 3928 bad_peb_count: 1
>
> UBI error: ubi_read_volume_table: DEBUG!
>         reserved_pebs: 755957760
>         alignment: 16777216
>         data_pad: 0
>         vol_type: 1
>         upd_marker: 0
>         name_len: 2816
>         name: nand-rootfs
>         flags: 0
>
> UBI error: ubi_read_volume_table: DEBUG!: setting avail_pebs = 3927
> UBI error: init_volumes: DEBUG! subtracting 3887 from avail_pebs.  Now 40
> UBI error: ubi_eba_init_scan: DEBUG! subtracting 1 from avail_pebs.  Now 39
> UBI error: ubi_eba_init_scan: DEBUG! subtracting 39 from avail_pebs.  Now 0
> UBI error: ubi_wl_init_scan: no enough physical eraseblocks (0, need 1)
> UBI error: ubi_init: cannot attach mtd1
> UBI error: ubi_init: UBI error: cannot initialize UBI, error -12
> UBI init error 12
> idexx> nand bad
>
> Device 0 bad blocks:
>   05f40000
>   2c120000
>   3ff80000
>   3ffa0000
>   3ffc0000
>   3ffe0000
> idexx>
>
>
>
> Why (seeing there is a bad PEB does eba_init_scan still allocate 39 PEBs for bad blocks?   Shouldn't one of those be consumed by the bad PEB?    Do you see anything else that might point to this being a bug vs. incorrect usage?

I'd like to know how many PEBs are reserved for bad block handling.
On Linux you can query this using /sys/class/ubi/ubiX/reserved_for_bad

To me this looks like you've reserved too few PEBs.

--
Thanks,
//richard



More information about the linux-mtd mailing list