Re: [PATCH 2/5] ubi: Limit amount of reserved eraseblocks for bad PEB handling

Artem Bityutskiy
2012-07-18T10:34:23Z

[-- Attachment #1: Type: text/plain, Size: 1800 bytes --]

On Wed, 2012-07-04 at 11:06 +0300, Shmulik Ladkani wrote:
> @@ -1045,20 +1046,14 @@ static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
> }
>
> spin_lock(&ubi->volumes_lock);
> - need = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs + 1;
> - if (need > 0) {
> - need = ubi->avail_pebs >= need ? need : ubi->avail_pebs;
> - ubi->avail_pebs -= need;
> - ubi->rsvd_pebs += need;
> - ubi->beb_rsvd_pebs += need;
> - if (need > 0)
> - ubi_msg("reserve more %d PEBs", need);
> - }
> -
> if (ubi->beb_rsvd_pebs == 0) {
> - spin_unlock(&ubi->volumes_lock);
> - ubi_err("no reserved physical eraseblocks");
> - goto out_ro;
> + if (ubi->avail_pebs == 0) {
> + spin_unlock(&ubi->volumes_lock);
> + ubi_err("no reserved/available physical eraseblocks");
> + goto out_ro;
> + }
> + ubi->avail_pebs -= 1;
> + available_consumed = 1;
> }
> spin_unlock(&ubi->volumes_lock);

The whole thing will become simpler if we first mark the PEB as bad
unconditionally (because it _is_ bad), then grab the lock and do all the
re-calculations.

>
> @@ -1068,11 +1063,23 @@ static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
> goto out_ro;
>
> spin_lock(&ubi->volumes_lock);
> - ubi->beb_rsvd_pebs -= 1;
> + if (ubi->beb_rsvd_pebs > 0) {
> + if (available_consumed) {
> + /*
> + * Some PEBs were added to the reserved pool since we
> + * last checked. Use a PEB from the reserved pool.
> + */
> + ubi->avail_pebs += 1;
> + available_consumed = 0;
> + }
> + ubi->beb_rsvd_pebs -= 1;
> + }
> ubi->bad_peb_count += 1;
> ubi->good_peb_count -= 1;
> ubi_calculate_reserved(ubi);

We do not need to call this function from here, right?

--
Best Regards,
Artem Bityutskiy

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]