Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
  • Tejun Heo's avatar
    async: fix __lowest_in_progress() · f56c3196
    Tejun Heo authored
    Commit 083b804c ("async: use workqueue for worker pool") made it
    possible that async jobs are moved from pending to running out-of-order.
    While pending async jobs will be queued and dispatched for execution in
    the same order, nothing guarantees they'll enter "1) move self to the
    running queue" of async_run_entry_fn() in the same order.
    
    Before the conversion, async implemented its own worker pool.  An async
    worker, upon being woken up, fetches the first item from the pending
    list, which kept the executing lists sorted.  The conversion to
    workqueue was done by adding work_struct to each async_entry and async
    just schedules the work item.  The queueing and dispatching of such work
    items are still in order but now each worker thread is associated with a
    specific async_entry and moves that specific async_entry to the
    executing list.  So, depending on which worker reaches that point
    earlier, which is non-deterministic, we may end up moving an async_entry
    with larger cookie...
    f56c3196