diff options
| -rw-r--r-- | arch/arm/mach-shmobile/pm-r8a7779.c | 3 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/pm-rmobile.c | 3 | ||||
| -rw-r--r-- | drivers/base/power/domain.c | 113 | ||||
| -rw-r--r-- | include/linux/pm.h | 6 | ||||
| -rw-r--r-- | include/linux/pm_domain.h | 9 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 14 | ||||
| -rw-r--r-- | kernel/power/power.h | 3 | ||||
| -rw-r--r-- | kernel/power/snapshot.c | 9 | ||||
| -rw-r--r-- | kernel/power/swap.c | 43 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/cpuidle-info.c | 8 |
10 files changed, 120 insertions, 91 deletions
diff --git a/arch/arm/mach-shmobile/pm-r8a7779.c b/arch/arm/mach-shmobile/pm-r8a7779.c index 82fe3d7f9662..44a74c4c5a01 100644 --- a/arch/arm/mach-shmobile/pm-r8a7779.c +++ b/arch/arm/mach-shmobile/pm-r8a7779.c | |||
| @@ -83,9 +83,8 @@ static void r8a7779_init_pm_domain(struct r8a7779_pm_domain *r8a7779_pd) | |||
| 83 | { | 83 | { |
| 84 | struct generic_pm_domain *genpd = &r8a7779_pd->genpd; | 84 | struct generic_pm_domain *genpd = &r8a7779_pd->genpd; |
| 85 | 85 | ||
| 86 | genpd->flags = GENPD_FLAG_PM_CLK; | ||
| 86 | pm_genpd_init(genpd, NULL, false); | 87 | pm_genpd_init(genpd, NULL, false); |
| 87 | genpd->dev_ops.stop = pm_clk_suspend; | ||
| 88 | genpd->dev_ops.start = pm_clk_resume; | ||
| 89 | genpd->dev_ops.active_wakeup = pd_active_wakeup; | 88 | genpd->dev_ops.active_wakeup = pd_active_wakeup; |
| 90 | genpd->power_off = pd_power_down; | 89 | genpd->power_off = pd_power_down; |
| 91 | genpd->power_on = pd_power_up; | 90 | genpd->power_on = pd_power_up; |
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c index 717e6413d29c..6f7d56ecf969 100644 --- a/arch/arm/mach-shmobile/pm-rmobile.c +++ b/arch/arm/mach-shmobile/pm-rmobile.c | |||
| @@ -106,9 +106,8 @@ static void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd) | |||
| 106 | struct generic_pm_domain *genpd = &rmobile_pd->genpd; | 106 | struct generic_pm_domain *genpd = &rmobile_pd->genpd; |
| 107 | struct dev_power_governor *gov = rmobile_pd->gov; | 107 | struct dev_power_governor *gov = rmobile_pd->gov; |
| 108 | 108 | ||
| 109 | genpd->flags = GENPD_FLAG_PM_CLK; | ||
| 109 | pm_genpd_init(genpd, gov ? : &simple_qos_governor, false); | 110 | pm_genpd_init(genpd, gov ? : &simple_qos_governor, false); |
| 110 | genpd->dev_ops.stop = pm_clk_suspend; | ||
| 111 | genpd->dev_ops.start = pm_clk_resume; | ||
| 112 | genpd->dev_ops.active_wakeup = rmobile_pd_active_wakeup; | 111 | genpd->dev_ops.active_wakeup = rmobile_pd_active_wakeup; |
| 113 | genpd->power_off = rmobile_pd_power_down; | 112 | genpd->power_off = rmobile_pd_power_down; |
| 114 | genpd->power_on = rmobile_pd_power_up; | 113 | genpd->power_on = rmobile_pd_power_up; |
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index fb83d4acd400..5d7b7548873a 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/pm_runtime.h> | 12 | #include <linux/pm_runtime.h> |
| 13 | #include <linux/pm_domain.h> | 13 | #include <linux/pm_domain.h> |
| 14 | #include <linux/pm_qos.h> | 14 | #include <linux/pm_qos.h> |
| 15 | #include <linux/pm_clock.h> | ||
| 15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
| 16 | #include <linux/err.h> | 17 | #include <linux/err.h> |
| 17 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
| @@ -151,6 +152,59 @@ static void genpd_recalc_cpu_exit_latency(struct generic_pm_domain *genpd) | |||
| 151 | genpd->cpuidle_data->idle_state->exit_latency = usecs64; | 152 | genpd->cpuidle_data->idle_state->exit_latency = usecs64; |
| 152 | } | 153 | } |
| 153 | 154 | ||
| 155 | static int genpd_power_on(struct generic_pm_domain *genpd) | ||
| 156 | { | ||
| 157 | ktime_t time_start; | ||
| 158 | s64 elapsed_ns; | ||
| 159 | int ret; | ||
| 160 | |||
| 161 | if (!genpd->power_on) | ||
| 162 | return 0; | ||
| 163 | |||
| 164 | time_start = ktime_get(); | ||
| 165 | ret = genpd->power_on(genpd); | ||
| 166 | if (ret) | ||
| 167 | return ret; | ||
| 168 | |||
| 169 | elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); | ||
| 170 | if (elapsed_ns <= genpd->power_on_latency_ns) | ||
| 171 | return ret; | ||
| 172 | |||
| 173 | genpd->power_on_latency_ns = elapsed_ns; | ||
| 174 | genpd->max_off_time_changed = true; | ||
| 175 | genpd_recalc_cpu_exit_latency(genpd); | ||
| 176 | pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", | ||
| 177 | genpd->name, "on", elapsed_ns); | ||
| 178 | |||
| 179 | return ret; | ||
| 180 | } | ||
| 181 | |||
| 182 | static int genpd_power_off(struct generic_pm_domain *genpd) | ||
| 183 | { | ||
| 184 | ktime_t time_start; | ||
| 185 | s64 elapsed_ns; | ||
| 186 | int ret; | ||
| 187 | |||
| 188 | if (!genpd->power_off) | ||
| 189 | return 0; | ||
| 190 | |||
| 191 | time_start = ktime_get(); | ||
| 192 | ret = genpd->power_off(genpd); | ||
| 193 | if (ret == -EBUSY) | ||
| 194 | return ret; | ||
| 195 | |||
| 196 | elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); | ||
| 197 | if (elapsed_ns <= genpd->power_off_latency_ns) | ||
| 198 | return ret; | ||
| 199 | |||
| 200 | genpd->power_off_latency_ns = elapsed_ns; | ||
| 201 | genpd->max_off_time_changed = true; | ||
| 202 | pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", | ||
| 203 | genpd->name, "off", elapsed_ns); | ||
| 204 | |||
| 205 | return ret; | ||
| 206 | } | ||
| 207 | |||
| 154 | /** | 208 | /** |
| 155 | * __pm_genpd_poweron - Restore power to a given PM domain and its masters. | 209 | * __pm_genpd_poweron - Restore power to a given PM domain and its masters. |
| 156 | * @genpd: PM domain to power up. | 210 | * @genpd: PM domain to power up. |
| @@ -222,25 +276,9 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd) | |||
| 222 | } | 276 | } |
| 223 | } | 277 | } |
| 224 | 278 | ||
| 225 | if (genpd->power_on) { | 279 | ret = genpd_power_on(genpd); |
| 226 | ktime_t time_start = ktime_get(); | 280 | if (ret) |
| 227 | s64 elapsed_ns; | 281 | goto err; |
| 228 | |||
| 229 | ret = genpd->power_on(genpd); | ||
| 230 | if (ret) | ||
| 231 | goto err; | ||
| 232 | |||
| 233 | elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); | ||
| 234 | if (elapsed_ns > genpd->power_on_latency_ns) { | ||
| 235 | genpd->power_on_latency_ns = elapsed_ns; | ||
| 236 | genpd->max_off_time_changed = true; | ||
| 237 | genpd_recalc_cpu_exit_latency(genpd); | ||
| 238 | if (genpd->name) | ||
| 239 | pr_warning("%s: Power-on latency exceeded, " | ||
| 240 | "new value %lld ns\n", genpd->name, | ||
| 241 | elapsed_ns); | ||
| 242 | } | ||
| 243 | } | ||
| 244 | 282 | ||
| 245 | out: | 283 | out: |
| 246 | genpd_set_active(genpd); | 284 | genpd_set_active(genpd); |
| @@ -544,16 +582,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) | |||
| 544 | } | 582 | } |
| 545 | 583 | ||
| 546 | if (genpd->power_off) { | 584 | if (genpd->power_off) { |
| 547 | ktime_t time_start; | ||
| 548 | s64 elapsed_ns; | ||
| 549 | |||
| 550 | if (atomic_read(&genpd->sd_count) > 0) { | 585 | if (atomic_read(&genpd->sd_count) > 0) { |
| 551 | ret = -EBUSY; | 586 | ret = -EBUSY; |
| 552 | goto out; | 587 | goto out; |
| 553 | } | 588 | } |
| 554 | 589 | ||
| 555 | time_start = ktime_get(); | ||
| 556 | |||
| 557 | /* | 590 | /* |
| 558 | * If sd_count > 0 at this point, one of the subdomains hasn't | 591 | * If sd_count > 0 at this point, one of the subdomains hasn't |
| 559 | * managed to call pm_genpd_poweron() for the master yet after | 592 | * managed to call pm_genpd_poweron() for the master yet after |
| @@ -562,21 +595,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) | |||
| 562 | * the pm_genpd_poweron() restore power for us (this shouldn't | 595 | * the pm_genpd_poweron() restore power for us (this shouldn't |
| 563 | * happen very often). | 596 | * happen very often). |
| 564 | */ | 597 | */ |
| 565 | ret = genpd->power_off(genpd); | 598 | ret = genpd_power_off(genpd); |
| 566 | if (ret == -EBUSY) { | 599 | if (ret == -EBUSY) { |
| 567 | genpd_set_active(genpd); | 600 | genpd_set_active(genpd); |
| 568 | goto out; | 601 | goto out; |
| 569 | } | 602 | } |
| 570 | |||
| 571 | elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); | ||
| 572 | if (elapsed_ns > genpd->power_off_latency_ns) { | ||
| 573 | genpd->power_off_latency_ns = elapsed_ns; | ||
| 574 | genpd->max_off_time_changed = true; | ||
| 575 | if (genpd->name) | ||
| 576 | pr_warning("%s: Power-off latency exceeded, " | ||
| 577 | "new value %lld ns\n", genpd->name, | ||
| 578 | elapsed_ns); | ||
| 579 | } | ||
| 580 | } | 603 | } |
| 581 | 604 | ||
| 582 | genpd->status = GPD_STATE_POWER_OFF; | 605 | genpd->status = GPD_STATE_POWER_OFF; |
| @@ -779,9 +802,9 @@ static inline void genpd_power_off_work_fn(struct work_struct *work) {} | |||
| 779 | * pm_genpd_present - Check if the given PM domain has been initialized. | 802 | * pm_genpd_present - Check if the given PM domain has been initialized. |
| 780 | * @genpd: PM domain to check. | 803 | * @genpd: PM domain to check. |
| 781 | */ | 804 | */ |
| 782 | static bool pm_genpd_present(struct generic_pm_domain *genpd) | 805 | static bool pm_genpd_present(const struct generic_pm_domain *genpd) |
| 783 | { | 806 | { |
| 784 | struct generic_pm_domain *gpd; | 807 | const struct generic_pm_domain *gpd; |
| 785 | 808 | ||
| 786 | if (IS_ERR_OR_NULL(genpd)) | 809 | if (IS_ERR_OR_NULL(genpd)) |
| 787 | return false; | 810 | return false; |
| @@ -822,8 +845,7 @@ static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) | |||
| 822 | || atomic_read(&genpd->sd_count) > 0) | 845 | || atomic_read(&genpd->sd_count) > 0) |
| 823 | return; | 846 | return; |
| 824 | 847 | ||
| 825 | if (genpd->power_off) | 848 | genpd_power_off(genpd); |
| 826 | genpd->power_off(genpd); | ||
| 827 | 849 | ||
| 828 | genpd->status = GPD_STATE_POWER_OFF; | 850 | genpd->status = GPD_STATE_POWER_OFF; |
| 829 | 851 | ||
| @@ -854,8 +876,7 @@ static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd) | |||
| 854 | genpd_sd_counter_inc(link->master); | 876 | genpd_sd_counter_inc(link->master); |
| 855 | } | 877 | } |
| 856 | 878 | ||
| 857 | if (genpd->power_on) | 879 | genpd_power_on(genpd); |
| 858 | genpd->power_on(genpd); | ||
| 859 | 880 | ||
| 860 | genpd->status = GPD_STATE_ACTIVE; | 881 | genpd->status = GPD_STATE_ACTIVE; |
| 861 | } | 882 | } |
| @@ -1277,8 +1298,7 @@ static int pm_genpd_restore_noirq(struct device *dev) | |||
| 1277 | * If the domain was off before the hibernation, make | 1298 | * If the domain was off before the hibernation, make |
| 1278 | * sure it will be off going forward. | 1299 | * sure it will be off going forward. |
| 1279 | */ | 1300 | */ |
| 1280 | if (genpd->power_off) | 1301 | genpd_power_off(genpd); |
| 1281 | genpd->power_off(genpd); | ||
| 1282 | 1302 | ||
| 1283 | return 0; | 1303 | return 0; |
| 1284 | } | 1304 | } |
| @@ -1929,6 +1949,12 @@ void pm_genpd_init(struct generic_pm_domain *genpd, | |||
| 1929 | genpd->domain.ops.complete = pm_genpd_complete; | 1949 | genpd->domain.ops.complete = pm_genpd_complete; |
| 1930 | genpd->dev_ops.save_state = pm_genpd_default_save_state; | 1950 | genpd->dev_ops.save_state = pm_genpd_default_save_state; |
| 1931 | genpd->dev_ops.restore_state = pm_genpd_default_restore_state; | 1951 | genpd->dev_ops.restore_state = pm_genpd_default_restore_state; |
| 1952 | |||
| 1953 | if (genpd->flags & GENPD_FLAG_PM_CLK) { | ||
| 1954 | genpd->dev_ops.stop = pm_clk_suspend; | ||
| 1955 | genpd->dev_ops.start = pm_clk_resume; | ||
| 1956 | } | ||
| 1957 | |||
| 1932 | mutex_lock(&gpd_list_lock); | 1958 | mutex_lock(&gpd_list_lock); |
| 1933 | list_add(&genpd->gpd_list_node, &gpd_list); | 1959 | list_add(&genpd->gpd_list_node, &gpd_list); |
| 1934 | mutex_unlock(&gpd_list_lock); | 1960 | mutex_unlock(&gpd_list_lock); |
| @@ -2216,6 +2242,7 @@ int genpd_dev_pm_attach(struct device *dev) | |||
| 2216 | } | 2242 | } |
| 2217 | 2243 | ||
| 2218 | dev->pm_domain->detach = genpd_dev_pm_detach; | 2244 | dev->pm_domain->detach = genpd_dev_pm_detach; |
| 2245 | pm_genpd_poweron(pd); | ||
| 2219 | 2246 | ||
| 2220 | return 0; | 2247 | return 0; |
| 2221 | } | 2248 | } |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 383fd68aaee1..45e3e78c1e3a 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -538,11 +538,7 @@ enum rpm_request { | |||
| 538 | }; | 538 | }; |
| 539 | 539 | ||
| 540 | struct wakeup_source; | 540 | struct wakeup_source; |
| 541 | 541 | struct pm_domain_data; | |
| 542 | struct pm_domain_data { | ||
| 543 | struct list_head list_node; | ||
| 544 | struct device *dev; | ||
| 545 | }; | ||
| 546 | 542 | ||
| 547 | struct pm_subsys_data { | 543 | struct pm_subsys_data { |
| 548 | spinlock_t lock; | 544 | spinlock_t lock; |
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 2e0e06daf8c0..1dd6c7f64166 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h | |||
| @@ -17,6 +17,9 @@ | |||
| 17 | #include <linux/notifier.h> | 17 | #include <linux/notifier.h> |
| 18 | #include <linux/cpuidle.h> | 18 | #include <linux/cpuidle.h> |
| 19 | 19 | ||
| 20 | /* Defines used for the flags field in the struct generic_pm_domain */ | ||
| 21 | #define GENPD_FLAG_PM_CLK (1U << 0) /* PM domain uses PM clk */ | ||
| 22 | |||
| 20 | enum gpd_status { | 23 | enum gpd_status { |
| 21 | GPD_STATE_ACTIVE = 0, /* PM domain is active */ | 24 | GPD_STATE_ACTIVE = 0, /* PM domain is active */ |
| 22 | GPD_STATE_WAIT_MASTER, /* PM domain's master is being waited for */ | 25 | GPD_STATE_WAIT_MASTER, /* PM domain's master is being waited for */ |
| @@ -76,6 +79,7 @@ struct generic_pm_domain { | |||
| 76 | struct device *dev); | 79 | struct device *dev); |
| 77 | void (*detach_dev)(struct generic_pm_domain *domain, | 80 | void (*detach_dev)(struct generic_pm_domain *domain, |
| 78 | struct device *dev); | 81 | struct device *dev); |
| 82 | unsigned int flags; /* Bit field of configs for genpd */ | ||
| 79 | }; | 83 | }; |
| 80 | 84 | ||
| 81 | static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) | 85 | static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) |
| @@ -100,6 +104,11 @@ struct gpd_timing_data { | |||
| 100 | bool cached_stop_ok; | 104 | bool cached_stop_ok; |
| 101 | }; | 105 | }; |
| 102 | 106 | ||
| 107 | struct pm_domain_data { | ||
| 108 | struct list_head list_node; | ||
| 109 | struct device *dev; | ||
| 110 | }; | ||
| 111 | |||
| 103 | struct generic_pm_domain_data { | 112 | struct generic_pm_domain_data { |
| 104 | struct pm_domain_data base; | 113 | struct pm_domain_data base; |
| 105 | struct gpd_timing_data td; | 114 | struct gpd_timing_data td; |
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 1f35a3478f3c..2329daae5255 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/syscore_ops.h> | 28 | #include <linux/syscore_ops.h> |
| 29 | #include <linux/ctype.h> | 29 | #include <linux/ctype.h> |
| 30 | #include <linux/genhd.h> | 30 | #include <linux/genhd.h> |
| 31 | #include <linux/ktime.h> | ||
| 31 | #include <trace/events/power.h> | 32 | #include <trace/events/power.h> |
| 32 | 33 | ||
| 33 | #include "power.h" | 34 | #include "power.h" |
| @@ -232,20 +233,17 @@ static void platform_recover(int platform_mode) | |||
| 232 | * @nr_pages: Number of memory pages processed between @start and @stop. | 233 | * @nr_pages: Number of memory pages processed between @start and @stop. |
| 233 | * @msg: Additional diagnostic message to print. | 234 | * @msg: Additional diagnostic message to print. |
| 234 | */ | 235 | */ |
| 235 | void swsusp_show_speed(struct timeval *start, struct timeval *stop, | 236 | void swsusp_show_speed(ktime_t start, ktime_t stop, |
| 236 | unsigned nr_pages, char *msg) | 237 | unsigned nr_pages, char *msg) |
| 237 | { | 238 | { |
| 239 | ktime_t diff; | ||
| 238 | u64 elapsed_centisecs64; | 240 | u64 elapsed_centisecs64; |
| 239 | unsigned int centisecs; | 241 | unsigned int centisecs; |
| 240 | unsigned int k; | 242 | unsigned int k; |
| 241 | unsigned int kps; | 243 | unsigned int kps; |
| 242 | 244 | ||
| 243 | elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start); | 245 | diff = ktime_sub(stop, start); |
| 244 | /* | 246 | elapsed_centisecs64 = ktime_divns(diff, 10*NSEC_PER_MSEC); |
| 245 | * If "(s64)elapsed_centisecs64 < 0", it will print long elapsed time, | ||
| 246 | * it is obvious enough for what went wrong. | ||
| 247 | */ | ||
| 248 | do_div(elapsed_centisecs64, NSEC_PER_SEC / 100); | ||
| 249 | centisecs = elapsed_centisecs64; | 247 | centisecs = elapsed_centisecs64; |
| 250 | if (centisecs == 0) | 248 | if (centisecs == 0) |
| 251 | centisecs = 1; /* avoid div-by-zero */ | 249 | centisecs = 1; /* avoid div-by-zero */ |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 2df883a9d3cb..ce9b8328a689 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
| @@ -174,8 +174,7 @@ extern int hib_wait_on_bio_chain(struct bio **bio_chain); | |||
| 174 | 174 | ||
| 175 | struct timeval; | 175 | struct timeval; |
| 176 | /* kernel/power/swsusp.c */ | 176 | /* kernel/power/swsusp.c */ |
| 177 | extern void swsusp_show_speed(struct timeval *, struct timeval *, | 177 | extern void swsusp_show_speed(ktime_t, ktime_t, unsigned int, char *); |
| 178 | unsigned int, char *); | ||
| 179 | 178 | ||
| 180 | #ifdef CONFIG_SUSPEND | 179 | #ifdef CONFIG_SUSPEND |
| 181 | /* kernel/power/suspend.c */ | 180 | /* kernel/power/suspend.c */ |
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 791a61892bb5..0c40c16174b4 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/list.h> | 28 | #include <linux/list.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <linux/compiler.h> | 30 | #include <linux/compiler.h> |
| 31 | #include <linux/ktime.h> | ||
| 31 | 32 | ||
| 32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
| 33 | #include <asm/mmu_context.h> | 34 | #include <asm/mmu_context.h> |
| @@ -1576,11 +1577,11 @@ int hibernate_preallocate_memory(void) | |||
| 1576 | struct zone *zone; | 1577 | struct zone *zone; |
| 1577 | unsigned long saveable, size, max_size, count, highmem, pages = 0; | 1578 | unsigned long saveable, size, max_size, count, highmem, pages = 0; |
| 1578 | unsigned long alloc, save_highmem, pages_highmem, avail_normal; | 1579 | unsigned long alloc, save_highmem, pages_highmem, avail_normal; |
| 1579 | struct timeval start, stop; | 1580 | ktime_t start, stop; |
| 1580 | int error; | 1581 | int error; |
| 1581 | 1582 | ||
| 1582 | printk(KERN_INFO "PM: Preallocating image memory... "); | 1583 | printk(KERN_INFO "PM: Preallocating image memory... "); |
| 1583 | do_gettimeofday(&start); | 1584 | start = ktime_get(); |
| 1584 | 1585 | ||
| 1585 | error = memory_bm_create(&orig_bm, GFP_IMAGE, PG_ANY); | 1586 | error = memory_bm_create(&orig_bm, GFP_IMAGE, PG_ANY); |
| 1586 | if (error) | 1587 | if (error) |
| @@ -1709,9 +1710,9 @@ int hibernate_preallocate_memory(void) | |||
| 1709 | free_unnecessary_pages(); | 1710 | free_unnecessary_pages(); |
| 1710 | 1711 | ||
| 1711 | out: | 1712 | out: |
| 1712 | do_gettimeofday(&stop); | 1713 | stop = ktime_get(); |
| 1713 | printk(KERN_CONT "done (allocated %lu pages)\n", pages); | 1714 | printk(KERN_CONT "done (allocated %lu pages)\n", pages); |
| 1714 | swsusp_show_speed(&start, &stop, pages, "Allocated"); | 1715 | swsusp_show_speed(start, stop, pages, "Allocated"); |
| 1715 | 1716 | ||
| 1716 | return 0; | 1717 | return 0; |
| 1717 | 1718 | ||
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index aaa3261dea5d..570aff817543 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/atomic.h> | 30 | #include <linux/atomic.h> |
| 31 | #include <linux/kthread.h> | 31 | #include <linux/kthread.h> |
| 32 | #include <linux/crc32.h> | 32 | #include <linux/crc32.h> |
| 33 | #include <linux/ktime.h> | ||
| 33 | 34 | ||
| 34 | #include "power.h" | 35 | #include "power.h" |
| 35 | 36 | ||
| @@ -445,8 +446,8 @@ static int save_image(struct swap_map_handle *handle, | |||
| 445 | int nr_pages; | 446 | int nr_pages; |
| 446 | int err2; | 447 | int err2; |
| 447 | struct bio *bio; | 448 | struct bio *bio; |
| 448 | struct timeval start; | 449 | ktime_t start; |
| 449 | struct timeval stop; | 450 | ktime_t stop; |
| 450 | 451 | ||
| 451 | printk(KERN_INFO "PM: Saving image data pages (%u pages)...\n", | 452 | printk(KERN_INFO "PM: Saving image data pages (%u pages)...\n", |
| 452 | nr_to_write); | 453 | nr_to_write); |
| @@ -455,7 +456,7 @@ static int save_image(struct swap_map_handle *handle, | |||
| 455 | m = 1; | 456 | m = 1; |
| 456 | nr_pages = 0; | 457 | nr_pages = 0; |
| 457 | bio = NULL; | 458 | bio = NULL; |
| 458 | do_gettimeofday(&start); | 459 | start = ktime_get(); |
| 459 | while (1) { | 460 | while (1) { |
| 460 | ret = snapshot_read_next(snapshot); | 461 | ret = snapshot_read_next(snapshot); |
| 461 | if (ret <= 0) | 462 | if (ret <= 0) |
| @@ -469,12 +470,12 @@ static int save_image(struct swap_map_handle *handle, | |||
| 469 | nr_pages++; | 470 | nr_pages++; |
| 470 | } | 471 | } |
| 471 | err2 = hib_wait_on_bio_chain(&bio); | 472 | err2 = hib_wait_on_bio_chain(&bio); |
| 472 | do_gettimeofday(&stop); | 473 | stop = ktime_get(); |
| 473 | if (!ret) | 474 | if (!ret) |
| 474 | ret = err2; | 475 | ret = err2; |
| 475 | if (!ret) | 476 | if (!ret) |
| 476 | printk(KERN_INFO "PM: Image saving done.\n"); | 477 | printk(KERN_INFO "PM: Image saving done.\n"); |
| 477 | swsusp_show_speed(&start, &stop, nr_to_write, "Wrote"); | 478 | swsusp_show_speed(start, stop, nr_to_write, "Wrote"); |
| 478 | return ret; | 479 | return ret; |
| 479 | } | 480 | } |
| 480 | 481 | ||
| @@ -580,8 +581,8 @@ static int save_image_lzo(struct swap_map_handle *handle, | |||
| 580 | int nr_pages; | 581 | int nr_pages; |
| 581 | int err2; | 582 | int err2; |
| 582 | struct bio *bio; | 583 | struct bio *bio; |
| 583 | struct timeval start; | 584 | ktime_t start; |
| 584 | struct timeval stop; | 585 | ktime_t stop; |
| 585 | size_t off; | 586 | size_t off; |
| 586 | unsigned thr, run_threads, nr_threads; | 587 | unsigned thr, run_threads, nr_threads; |
| 587 | unsigned char *page = NULL; | 588 | unsigned char *page = NULL; |
| @@ -674,7 +675,7 @@ static int save_image_lzo(struct swap_map_handle *handle, | |||
| 674 | m = 1; | 675 | m = 1; |
| 675 | nr_pages = 0; | 676 | nr_pages = 0; |
| 676 | bio = NULL; | 677 | bio = NULL; |
| 677 | do_gettimeofday(&start); | 678 | start = ktime_get(); |
| 678 | for (;;) { | 679 | for (;;) { |
| 679 | for (thr = 0; thr < nr_threads; thr++) { | 680 | for (thr = 0; thr < nr_threads; thr++) { |
| 680 | for (off = 0; off < LZO_UNC_SIZE; off += PAGE_SIZE) { | 681 | for (off = 0; off < LZO_UNC_SIZE; off += PAGE_SIZE) { |
| @@ -759,12 +760,12 @@ static int save_image_lzo(struct swap_map_handle *handle, | |||
| 759 | 760 | ||
| 760 | out_finish: | 761 | out_finish: |
| 761 | err2 = hib_wait_on_bio_chain(&bio); | 762 | err2 = hib_wait_on_bio_chain(&bio); |
| 762 | do_gettimeofday(&stop); | 763 | stop = ktime_get(); |
| 763 | if (!ret) | 764 | if (!ret) |
| 764 | ret = err2; | 765 | ret = err2; |
| 765 | if (!ret) | 766 | if (!ret) |
| 766 | printk(KERN_INFO "PM: Image saving done.\n"); | 767 | printk(KERN_INFO "PM: Image saving done.\n"); |
| 767 | swsusp_show_speed(&start, &stop, nr_to_write, "Wrote"); | 768 | swsusp_show_speed(start, stop, nr_to_write, "Wrote"); |
| 768 | out_clean: | 769 | out_clean: |
| 769 | if (crc) { | 770 | if (crc) { |
| 770 | if (crc->thr) | 771 | if (crc->thr) |
| @@ -965,8 +966,8 @@ static int load_image(struct swap_map_handle *handle, | |||
| 965 | { | 966 | { |
| 966 | unsigned int m; | 967 | unsigned int m; |
| 967 | int ret = 0; | 968 | int ret = 0; |
| 968 | struct timeval start; | 969 | ktime_t start; |
| 969 | struct timeval stop; | 970 | ktime_t stop; |
| 970 | struct bio *bio; | 971 | struct bio *bio; |
| 971 | int err2; | 972 | int err2; |
| 972 | unsigned nr_pages; | 973 | unsigned nr_pages; |
| @@ -978,7 +979,7 @@ static int load_image(struct swap_map_handle *handle, | |||
| 978 | m = 1; | 979 | m = 1; |
| 979 | nr_pages = 0; | 980 | nr_pages = 0; |
| 980 | bio = NULL; | 981 | bio = NULL; |
| 981 | do_gettimeofday(&start); | 982 | start = ktime_get(); |
| 982 | for ( ; ; ) { | 983 | for ( ; ; ) { |
| 983 | ret = snapshot_write_next(snapshot); | 984 | ret = snapshot_write_next(snapshot); |
| 984 | if (ret <= 0) | 985 | if (ret <= 0) |
| @@ -996,7 +997,7 @@ static int load_image(struct swap_map_handle *handle, | |||
| 996 | nr_pages++; | 997 | nr_pages++; |
| 997 | } | 998 | } |
| 998 | err2 = hib_wait_on_bio_chain(&bio); | 999 | err2 = hib_wait_on_bio_chain(&bio); |
| 999 | do_gettimeofday(&stop); | 1000 | stop = ktime_get(); |
| 1000 | if (!ret) | 1001 | if (!ret) |
| 1001 | ret = err2; | 1002 | ret = err2; |
| 1002 | if (!ret) { | 1003 | if (!ret) { |
| @@ -1005,7 +1006,7 @@ static int load_image(struct swap_map_handle *handle, | |||
| 1005 | if (!snapshot_image_loaded(snapshot)) | 1006 | if (!snapshot_image_loaded(snapshot)) |
| 1006 | ret = -ENODATA; | 1007 | ret = -ENODATA; |
| 1007 | } | 1008 | } |
| 1008 | swsusp_show_speed(&start, &stop, nr_to_read, "Read"); | 1009 | swsusp_show_speed(start, stop, nr_to_read, "Read"); |
| 1009 | return ret; | 1010 | return ret; |
| 1010 | } | 1011 | } |
| 1011 | 1012 | ||
| @@ -1067,8 +1068,8 @@ static int load_image_lzo(struct swap_map_handle *handle, | |||
| 1067 | int ret = 0; | 1068 | int ret = 0; |
| 1068 | int eof = 0; | 1069 | int eof = 0; |
| 1069 | struct bio *bio; | 1070 | struct bio *bio; |
| 1070 | struct timeval start; | 1071 | ktime_t start; |
| 1071 | struct timeval stop; | 1072 | ktime_t stop; |
| 1072 | unsigned nr_pages; | 1073 | unsigned nr_pages; |
| 1073 | size_t off; | 1074 | size_t off; |
| 1074 | unsigned i, thr, run_threads, nr_threads; | 1075 | unsigned i, thr, run_threads, nr_threads; |
| @@ -1190,7 +1191,7 @@ static int load_image_lzo(struct swap_map_handle *handle, | |||
| 1190 | m = 1; | 1191 | m = 1; |
| 1191 | nr_pages = 0; | 1192 | nr_pages = 0; |
| 1192 | bio = NULL; | 1193 | bio = NULL; |
| 1193 | do_gettimeofday(&start); | 1194 | start = ktime_get(); |
| 1194 | 1195 | ||
| 1195 | ret = snapshot_write_next(snapshot); | 1196 | ret = snapshot_write_next(snapshot); |
| 1196 | if (ret <= 0) | 1197 | if (ret <= 0) |
| @@ -1343,7 +1344,7 @@ out_finish: | |||
| 1343 | wait_event(crc->done, atomic_read(&crc->stop)); | 1344 | wait_event(crc->done, atomic_read(&crc->stop)); |
| 1344 | atomic_set(&crc->stop, 0); | 1345 | atomic_set(&crc->stop, 0); |
| 1345 | } | 1346 | } |
| 1346 | do_gettimeofday(&stop); | 1347 | stop = ktime_get(); |
| 1347 | if (!ret) { | 1348 | if (!ret) { |
| 1348 | printk(KERN_INFO "PM: Image loading done.\n"); | 1349 | printk(KERN_INFO "PM: Image loading done.\n"); |
| 1349 | snapshot_write_finalize(snapshot); | 1350 | snapshot_write_finalize(snapshot); |
| @@ -1359,7 +1360,7 @@ out_finish: | |||
| 1359 | } | 1360 | } |
| 1360 | } | 1361 | } |
| 1361 | } | 1362 | } |
| 1362 | swsusp_show_speed(&start, &stop, nr_to_read, "Read"); | 1363 | swsusp_show_speed(start, stop, nr_to_read, "Read"); |
| 1363 | out_clean: | 1364 | out_clean: |
| 1364 | for (i = 0; i < ring_size; i++) | 1365 | for (i = 0; i < ring_size; i++) |
| 1365 | free_page((unsigned long)page[i]); | 1366 | free_page((unsigned long)page[i]); |
| @@ -1374,7 +1375,7 @@ out_clean: | |||
| 1374 | kthread_stop(data[thr].thr); | 1375 | kthread_stop(data[thr].thr); |
| 1375 | vfree(data); | 1376 | vfree(data); |
| 1376 | } | 1377 | } |
| 1377 | if (page) vfree(page); | 1378 | vfree(page); |
| 1378 | 1379 | ||
| 1379 | return ret; | 1380 | return ret; |
| 1380 | } | 1381 | } |
diff --git a/tools/power/cpupower/utils/cpuidle-info.c b/tools/power/cpupower/utils/cpuidle-info.c index 75e66de7e7a7..458d69b444ad 100644 --- a/tools/power/cpupower/utils/cpuidle-info.c +++ b/tools/power/cpupower/utils/cpuidle-info.c | |||
| @@ -22,13 +22,13 @@ | |||
| 22 | 22 | ||
| 23 | static void cpuidle_cpu_output(unsigned int cpu, int verbose) | 23 | static void cpuidle_cpu_output(unsigned int cpu, int verbose) |
| 24 | { | 24 | { |
| 25 | unsigned int idlestates, idlestate; | 25 | int idlestates, idlestate; |
| 26 | char *tmp; | 26 | char *tmp; |
| 27 | 27 | ||
| 28 | printf(_ ("Analyzing CPU %d:\n"), cpu); | 28 | printf(_ ("Analyzing CPU %d:\n"), cpu); |
| 29 | 29 | ||
| 30 | idlestates = sysfs_get_idlestate_count(cpu); | 30 | idlestates = sysfs_get_idlestate_count(cpu); |
| 31 | if (idlestates == 0) { | 31 | if (idlestates < 1) { |
| 32 | printf(_("CPU %u: No idle states\n"), cpu); | 32 | printf(_("CPU %u: No idle states\n"), cpu); |
| 33 | return; | 33 | return; |
| 34 | } | 34 | } |
| @@ -100,10 +100,10 @@ static void cpuidle_general_output(void) | |||
| 100 | static void proc_cpuidle_cpu_output(unsigned int cpu) | 100 | static void proc_cpuidle_cpu_output(unsigned int cpu) |
| 101 | { | 101 | { |
| 102 | long max_allowed_cstate = 2000000000; | 102 | long max_allowed_cstate = 2000000000; |
| 103 | unsigned int cstate, cstates; | 103 | int cstate, cstates; |
| 104 | 104 | ||
| 105 | cstates = sysfs_get_idlestate_count(cpu); | 105 | cstates = sysfs_get_idlestate_count(cpu); |
| 106 | if (cstates == 0) { | 106 | if (cstates < 1) { |
| 107 | printf(_("CPU %u: No C-states info\n"), cpu); | 107 | printf(_("CPU %u: No C-states info\n"), cpu); |
| 108 | return; | 108 | return; |
| 109 | } | 109 | } |
