13 Mar, 2013

2 commits


24 Jan, 2013

2 commits

  • Async kept single global pending list and per-domain running lists.
    When an async item is queued, it's put on the global pending list.
    The item is moved to the per-domain running list when its execution
    starts.

    At this point, this design complicates execution and synchronization
    without bringing any benefit. The list only matters for
    synchronization which doesn't care whether a given async item is
    pending or executing. Also, global synchronization is done by
    iterating through all active registered async_domains, so the global
    async_pending list doesn't help anything either.

    Rename async_domain->running to async_domain->pending and put async
    items directly there and remove when execution completes. This
    simplifies lowest_in_progress() a lot - the first item on the pending
    list is the one with the lowest cookie, and async_run_entry_fn()
    doesn't have to mess with moving the item from pending to running.

    After the change, whether a domain is empty or not can be trivially
    determined by looking at async_domain->pending. Remove
    async_domain->count and use list_empty() on pending instead.

    Signed-off-by: Tejun Heo
    Cc: Arjan van de Ven
    Cc: Dan Williams
    Cc: Linus Torvalds

    Tejun Heo
     
  • In the beginning, running lists were literal struct list_heads. Later
    on, struct async_domain was added. For some reason, while the
    conversion substituted list_heads with async_domains, the variable
    names weren't fully converted. In more places, "running" was used for
    struct async_domain while other places adopted new "domain" name.

    The situation is made much worse by having async_domain's running list
    named "domain" and async_entry's field pointing to async_domain named
    "running".

    So, we end up with mix of "running" and "domain" for variable names
    for async_domain, with the field names of async_domain and async_entry
    swapped between "running" and "domain".

    It feels almost intentionally made to be as confusing as possible.
    Bring some sanity by

    * Renaming all async_domain variables "domain".

    * s/async_running/async_dfl_domain/

    * s/async_domain->domain/async_domain->running/

    * s/async_entry->running/async_entry->domain/

    Signed-off-by: Tejun Heo
    Cc: Arjan van de Ven
    Cc: Dan Williams
    Cc: Linus Torvalds

    Tejun Heo
     

19 Jan, 2013

1 commit


20 Jul, 2012

2 commits

  • In response to an async related regression James noted:

    "My theory is that this is an init problem: The assumption in a lot of
    our code is that async_synchronize_full() waits for everything ... even
    the domain specific async schedules, which isn't true."

    ...so make this assumption true.

    Each domain, including the default one, registers itself on a global domain
    list when work is scheduled. Once all entries complete it exits that
    list. Waiting for the list to be empty syncs all in-flight work across
    all domains.

    Domains can opt-out of global syncing if they are declared as exclusive
    ASYNC_DOMAIN_EXCLUSIVE(). All stack-based domains have been declared
    exclusive since the domain may go out of scope as soon as the last work
    item completes.

    Statically declared domains are mostly ok, but async_unregister_domain()
    is there to close any theoretical races with pending
    async_synchronize_full waiters at module removal time.

    Signed-off-by: Dan Williams
    Acked-by: Arjan van de Ven
    Reported-by: Meelis Roos
    Reported-by: Eldad Zack
    Tested-by: Eldad Zack
    Signed-off-by: James Bottomley

    Dan Williams
     
  • This is in preparation for teaching async_synchronize_full() to sync all
    pending async work, and not just on the async_running domain. This
    conversion is functionally equivalent, just embedding the existing list
    in a new async_domain type.

    The .registered attribute is used in a later patch to distinguish
    between domains that want to be flushed by async_synchronize_full()
    versus those that only expect async_synchronize_{full|cookie}_domain to
    be used for flushing.

    [jejb: add async.h to scsi_priv.h for struct async_domain]
    Signed-off-by: Dan Williams
    Acked-by: Arjan van de Ven
    Acked-by: Mark Brown
    Tested-by: Eldad Zack
    Signed-off-by: James Bottomley

    Dan Williams
     

09 Feb, 2009

1 commit


08 Jan, 2009

1 commit

  • Right now, most of the kernel boot is strictly synchronous, such that
    various hardware delays are done sequentially.

    In order to make the kernel boot faster, this patch introduces
    infrastructure to allow doing some of the initialization steps
    asynchronously, which will hide significant portions of the hardware delays
    in practice.

    In order to not change device order and other similar observables, this
    patch does NOT do full parallel initialization.

    Rather, it operates more in the way an out of order CPU does; the work may
    be done out of order and asynchronous, but the observable effects
    (instruction retiring for the CPU) are still done in the original sequence.

    Signed-off-by: Arjan van de Ven

    Arjan van de Ven