Messages in this thread | | | Date | Mon, 7 Apr 2014 15:02:04 +0200 | Subject | Re: [RFC/PATCH] mtd: ubi: Free peb's synchronously for fastmap | From | Richard Weinberger <> |
| |
On Tue, Apr 1, 2014 at 10:01 AM, Tanya Brokhman <tlinder@codeaurora.org> wrote: > At first mount it's possible that there are not enough free PEBs since > there are PEB's pending to be erased. In such scenario, fm_pool (which is > the pool from which user required PEBs are allocated) will be empty. > Try fixing the above described situation by synchronously performing > pending erase work, thus produce another free PEB. > > Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org> > > diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c > index 457ead3..9a36f78 100644 > --- a/drivers/mtd/ubi/wl.c > +++ b/drivers/mtd/ubi/wl.c > @@ -595,10 +595,29 @@ static void refill_wl_pool(struct ubi_device *ubi) > static void refill_wl_user_pool(struct ubi_device *ubi) > { > struct ubi_fm_pool *pool = &ubi->fm_pool; > + int err; > > return_unused_pool_pebs(ubi, pool); > > for (pool->size = 0; pool->size < pool->max_size; pool->size++) { > +retry: > + if (!ubi->free.rb_node || > + (ubi->free_count - ubi->beb_rsvd_pebs < 1)) { > + /* > + * There are no available PEBs. Try to free > + * PEB by means of synchronous execution of > + * pending works. > + */ > + if (ubi->works_count == 0) > + break; > + spin_unlock(&ubi->wl_lock); > + err = do_work(ubi); > + spin_lock(&ubi->wl_lock);
This is basically what produce_free_peb() does.
> + if (err < 0) > + break; > + goto retry; > + } > + > pool->pebs[pool->size] = __wl_get_peb(ubi);
__wl_get_peb() already calls produce_free_peb() when we run out of free PEBs.
Does your patch really fix a problem you encounter or did you find the issue by reviewing the code?
-- Thanks, //richard
| |