PM: domains: Move the next_wakeup variable into the struct gpd_timing_data
authorUlf Hansson <ulf.hansson@linaro.org>
Wed, 11 May 2022 14:56:57 +0000 (16:56 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 19 May 2022 18:16:05 +0000 (20:16 +0200)
If the corresponding genpd for the device doesn't use a governor, the
variable next_wakeup within the struct generic_pm_domain_data becomes
superfluous.

To avoid wasting memory, let's move it into the struct gpd_timing_data,
which is already being allocated based upon if there is governor assigned.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/domain.c
drivers/base/power/domain_governor.c
include/linux/pm_domain.h

index ca86fb3..4c059a8 100644 (file)
@@ -478,15 +478,16 @@ EXPORT_SYMBOL_GPL(dev_pm_genpd_set_performance_state);
  */
 void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next)
 {
-       struct generic_pm_domain_data *gpd_data;
        struct generic_pm_domain *genpd;
+       struct gpd_timing_data *td;
 
        genpd = dev_to_genpd_safe(dev);
        if (!genpd)
                return;
 
-       gpd_data = to_gpd_data(dev->power.subsys_data->domain_data);
-       gpd_data->next_wakeup = next;
+       td = to_gpd_data(dev->power.subsys_data->domain_data)->td;
+       if (td)
+               td->next_wakeup = next;
 }
 EXPORT_SYMBOL_GPL(dev_pm_genpd_set_next_wakeup);
 
@@ -1518,7 +1519,6 @@ static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev,
 
        gpd_data->base.dev = dev;
        gpd_data->nb.notifier_call = genpd_dev_pm_qos_notifier;
-       gpd_data->next_wakeup = KTIME_MAX;
 
        /* Allocate data used by a governor. */
        if (has_governor) {
@@ -1530,6 +1530,7 @@ static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev,
 
                td->constraint_changed = true;
                td->effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS;
+               td->next_wakeup = KTIME_MAX;
                gpd_data->td = td;
        }
 
index 62be9b3..599b390 100644 (file)
@@ -139,7 +139,7 @@ static void update_domain_next_wakeup(struct generic_pm_domain *genpd, ktime_t n
         * is able to enter its optimal idle state.
         */
        list_for_each_entry(pdd, &genpd->dev_list, list_node) {
-               next_wakeup = to_gpd_data(pdd)->next_wakeup;
+               next_wakeup = to_gpd_data(pdd)->td->next_wakeup;
                if (next_wakeup != KTIME_MAX && !ktime_before(next_wakeup, now))
                        if (ktime_before(next_wakeup, domain_wakeup))
                                domain_wakeup = next_wakeup;
index 126a4b9..1f370f0 100644 (file)
@@ -182,6 +182,7 @@ struct gpd_timing_data {
        s64 suspend_latency_ns;
        s64 resume_latency_ns;
        s64 effective_constraint_ns;
+       ktime_t next_wakeup;
        bool constraint_changed;
        bool cached_suspend_ok;
 };
@@ -200,7 +201,6 @@ struct generic_pm_domain_data {
        unsigned int performance_state;
        unsigned int default_pstate;
        unsigned int rpm_pstate;
-       ktime_t next_wakeup;
        void *data;
 };