On Thu, Jun 20, 2019 at 3:28 PM Mikhail Kshevetskiy <mikhail.kshevetskiy@xxxxxxxxx> wrote: > > during ubi initialization we have a following calling sequence > > 1) ubi_attach() > > ---------------------------------------------------------------- > err = ubi_wl_init(ubi, ai); > if (err) goto out_vtbl; > > err = ubi_eba_init(ubi, ai); > if (err) goto out_wl; > ---------------------------------------------------------------- > > As we can see "eba" subsytem is NOT initialized at the moment of > initializing of "wl" subsystem > > 2) ubi_wl_init() > > it call ensure_wear_leveling() at some moment > > 3) ensure_wear_leveling() > > --------------------------------------------------------------- > e1 = rb_entry(rb_first(&ubi->used), struct ubi_wl_entry, u.rb); > e2 = find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF); > if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)) goto out_unlock; > dbg_wl("schedule wear-leveling"); > --------------------------------------------------------------- > > so, if no wear-leveling is scheduled than everything is OK > > and a little bit below > > --------------------------------------------------------------- > wrk->anchor = 0; > wrk->func = &wear_leveling_worker; > if (nested) __schedule_ubi_work(ubi, wrk); > else schedule_ubi_work(ubi, wrk); > --------------------------------------------------------------- > > as result we enter to wear_leveling_worker() function Well, we schedule work, but don't execute it since the ubi-thread is still disabled. Can you please share a little more about the problem you are facing? Also produce_free_peb() should not get called at this point. So before we flip the order of initialization I'd like to understand the problem better. Thanks, //richard ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/