lkml.org 
[lkml]   [2011]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7 v2] PM / Domains: Queue up power off work only if it is not pending
    Date
    From: Rafael J. Wysocki <rjw@sisk.pl>

    In theory it is possible that pm_genpd_poweroff() for two different
    subdomains of the same parent domain will attempt to queue up the
    execution of pm_genpd_poweroff() for the parent twice in a row. This
    would lead to unpleasant consequences, so prevent it from happening
    by checking if genpd->power_off_work is pending before attempting to
    queue it up.

    Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
    ---

    One more patch to the "PM / Domains: Generic PM domains improvements" series,
    the changelog should explain everything. :-)

    Thanks,
    Rafael

    ---
    drivers/base/power/domain.c | 15 ++++++++++++++-
    1 file changed, 14 insertions(+), 1 deletion(-)

    Index: linux-2.6/drivers/base/power/domain.c
    ===================================================================
    --- linux-2.6.orig/drivers/base/power/domain.c
    +++ linux-2.6/drivers/base/power/domain.c
    @@ -213,6 +213,19 @@ static bool genpd_abort_poweroff(struct
    }

    /**
    + * genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff().
    + * @genpd: PM domait to power off.
    + *
    + * Queue up the execution of pm_genpd_poweroff() unless it's already been done
    + * before.
    + */
    +static void genpd_queue_power_off_work(struct generic_pm_domain *genpd)
    +{
    + if (!work_pending(&genpd->power_off_work))
    + queue_work(pm_wq, &genpd->power_off_work);
    +}
    +
    +/**
    * pm_genpd_poweroff - Remove power from a given PM domain.
    * @genpd: PM domain to power down.
    *
    @@ -304,7 +317,7 @@ static int pm_genpd_poweroff(struct gene
    if (parent) {
    genpd_sd_counter_dec(parent);
    if (parent->sd_count == 0)
    - queue_work(pm_wq, &parent->power_off_work);
    + genpd_queue_power_off_work(parent);

    genpd_release_lock(parent);
    }

    \
     
     \ /
      Last update: 2011-07-10 14:31    [W:2.676 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site