Hello, I revised the patch based on comments from Jon. Attached patch should work on the version of mark_region which may block. Thanks, Jun'ichi Nomura wrote: > Jonathan E Brassow wrote: > > could this be solved by doing your patch in rh_dec and just moving the > > atomic_inc in rh_inc? The reason I ask is that the mark_region log > > call can block. > > No. > Unless they are serialized, it's possible that rh_inc() will see the > state RH_DIRTY, while rh_dec change it to RH_CLEAN. > As a result, the region which has I/O in-flight may be freed. > > Is it reasonable to call mark_region() unconditionally? > Then we can call it outside of the lock. > > >> CPU0 CPU1 > >> > >> ----------------------------------------------------------------------- > >> ------- > >> rh_dec() > >> if (atomic_dec_and_test(pending)) > >> > if (atomic_read(pending)==0) > >> rh_inc() > >> atomic_inc(pending) > >> if the region is clean > >> mark the region dirty > >> and remove from clean > list > else do nothing > >> mark the region clean > >> and move to clean list