Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PM / Domains: Don't measure latency of ->power_on|off() during system PM

Measure latency does by itself contribute to an increased latency, thus we
should avoid it when it isn't needed.

Currently genpd measures latencies in the system PM phase for the
->power_on|off() callbacks, except in the syscore case when it's not
allowed to use ktime_get() as timekeeping may be suspended.

Since there should be plenty of occasions during runtime PM to perform
these measurements, let's rely on that and drop them from system PM. This
will also make it consistent for how measurements are done of the runtime
PM callbacks (as those may be invoked during system PM).

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Ulf Hansson and committed by
Rafael J. Wysocki
adb560b3 294f47ff

+11 -15
+11 -15
drivers/base/power/domain.c
··· 619 619 /** 620 620 * pm_genpd_sync_poweroff - Synchronously power off a PM domain and its masters. 621 621 * @genpd: PM domain to power off, if possible. 622 - * @timed: True if latency measurements are allowed. 623 622 * 624 623 * Check if the given PM domain can be powered off (during system suspend or 625 624 * hibernation) and do that if so. Also, in that case propagate to its masters. ··· 628 629 * executed sequentially, so it is guaranteed that it will never run twice in 629 630 * parallel). 630 631 */ 631 - static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd, 632 - bool timed) 632 + static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) 633 633 { 634 634 struct gpd_link *link; 635 635 ··· 641 643 642 644 /* Choose the deepest state when suspending */ 643 645 genpd->state_idx = genpd->state_count - 1; 644 - genpd_power_off(genpd, timed); 646 + genpd_power_off(genpd, false); 645 647 646 648 genpd->status = GPD_STATE_POWER_OFF; 647 649 648 650 list_for_each_entry(link, &genpd->slave_links, slave_node) { 649 651 genpd_sd_counter_dec(link->master); 650 - pm_genpd_sync_poweroff(link->master, timed); 652 + pm_genpd_sync_poweroff(link->master); 651 653 } 652 654 } 653 655 654 656 /** 655 657 * pm_genpd_sync_poweron - Synchronously power on a PM domain and its masters. 656 658 * @genpd: PM domain to power on. 657 - * @timed: True if latency measurements are allowed. 658 659 * 659 660 * This function is only called in "noirq" and "syscore" stages of system power 660 661 * transitions, so it need not acquire locks (all of the "noirq" callbacks are 661 662 * executed sequentially, so it is guaranteed that it will never run twice in 662 663 * parallel). 663 664 */ 664 - static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd, 665 - bool timed) 665 + static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd) 666 666 { 667 667 struct gpd_link *link; 668 668 ··· 668 672 return; 669 673 670 674 list_for_each_entry(link, &genpd->slave_links, slave_node) { 671 - pm_genpd_sync_poweron(link->master, timed); 675 + pm_genpd_sync_poweron(link->master); 672 676 genpd_sd_counter_inc(link->master); 673 677 } 674 678 675 - genpd_power_on(genpd, timed); 679 + genpd_power_on(genpd, false); 676 680 677 681 genpd->status = GPD_STATE_ACTIVE; 678 682 } ··· 784 788 * the same PM domain, so it is not necessary to use locking here. 785 789 */ 786 790 genpd->suspended_count++; 787 - pm_genpd_sync_poweroff(genpd, true); 791 + pm_genpd_sync_poweroff(genpd); 788 792 789 793 return 0; 790 794 } ··· 814 818 * guaranteed that this function will never run twice in parallel for 815 819 * the same PM domain, so it is not necessary to use locking here. 816 820 */ 817 - pm_genpd_sync_poweron(genpd, true); 821 + pm_genpd_sync_poweron(genpd); 818 822 genpd->suspended_count--; 819 823 820 824 if (genpd->dev_ops.stop && genpd->dev_ops.start) ··· 907 911 */ 908 912 genpd->status = GPD_STATE_POWER_OFF; 909 913 910 - pm_genpd_sync_poweron(genpd, true); 914 + pm_genpd_sync_poweron(genpd); 911 915 912 916 if (genpd->dev_ops.stop && genpd->dev_ops.start) 913 917 ret = pm_runtime_force_resume(dev); ··· 962 966 963 967 if (suspend) { 964 968 genpd->suspended_count++; 965 - pm_genpd_sync_poweroff(genpd, false); 969 + pm_genpd_sync_poweroff(genpd); 966 970 } else { 967 - pm_genpd_sync_poweron(genpd, false); 971 + pm_genpd_sync_poweron(genpd); 968 972 genpd->suspended_count--; 969 973 } 970 974 }