Commit 8bb89666 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull power management fixes from Rafael Wysocki:
 "These fix a recently introduced build issue related to cpuidle and two
  bugs in the PM core, update cpuidle documentation and clean up memory
  allocations in the operating performance points (OPP) framework.

  Specifics:

   - Fix a recently introduced build issue related to cpuidle by
     covering all of the relevant combinations of Kconfig options
     in its header (Rafael Wysocki).

   - Add missing invocation of pm_runtime_drop_link() to the
     !CONFIG_SRCU variant of __device_link_del() (Lukas Wunner).

   - Fix unbalanced IRQ enable in the wakeup interrupts framework
     (Tony Lindgren).

   - Update cpuidle sysfs ABI documentation (Aishwarya Pant).

   - Use GFP_KERNEL instead of GFP_ATOMIC for allocating memory
     in dev_pm_opp_init_cpufreq_table() (Jia-Ju Bai)"

* tag 'pm-4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  PM: cpuidle: Fix cpuidle_poll_state_init() prototype
  PM / runtime: Update links_count also if !CONFIG_SRCU
  PM / wakeirq: Fix unbalanced IRQ enable for wakeirq
  Documentation/ABI: update cpuidle sysfs documentation
  opp: cpu: Replace GFP_ATOMIC with GFP_KERNEL in dev_pm_opp_init_cpufreq_table
parents 3e9f4df0 822ffaa5
Loading
Loading
Loading
Loading
+75 −2
Original line number Diff line number Diff line
@@ -108,6 +108,8 @@ Description: CPU topology files that describe a logical CPU's relationship

What:		/sys/devices/system/cpu/cpuidle/current_driver
		/sys/devices/system/cpu/cpuidle/current_governer_ro
		/sys/devices/system/cpu/cpuidle/available_governors
		/sys/devices/system/cpu/cpuidle/current_governor
Date:		September 2007
Contact:	Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description:	Discover cpuidle policy and mechanism
@@ -119,13 +121,84 @@ Description: Discover cpuidle policy and mechanism
		Idle policy (governor) is differentiated from idle mechanism
		(driver)

		current_driver: displays current idle mechanism
		current_driver: (RO) displays current idle mechanism

		current_governor_ro: displays current idle policy
		current_governor_ro: (RO) displays current idle policy

		With the cpuidle_sysfs_switch boot option enabled (meant for
		developer testing), the following three attributes are visible
		instead:

		current_driver: same as described above

		available_governors: (RO) displays a space separated list of
		available governors

		current_governor: (RW) displays current idle policy. Users can
		switch the governor at runtime by writing to this file.

		See files in Documentation/cpuidle/ for more information.


What:		/sys/devices/system/cpu/cpuX/cpuidle/stateN/name
		/sys/devices/system/cpu/cpuX/cpuidle/stateN/latency
		/sys/devices/system/cpu/cpuX/cpuidle/stateN/power
		/sys/devices/system/cpu/cpuX/cpuidle/stateN/time
		/sys/devices/system/cpu/cpuX/cpuidle/stateN/usage
Date:		September 2007
KernelVersion:	v2.6.24
Contact:	Linux power management list <linux-pm@vger.kernel.org>
Description:
		The directory /sys/devices/system/cpu/cpuX/cpuidle contains per
		logical CPU specific cpuidle information for each online cpu X.
		The processor idle states which are available for use have the
		following attributes:

		name: (RO) Name of the idle state (string).

		latency: (RO) The latency to exit out of this idle state (in
		microseconds).

		power: (RO) The power consumed while in this idle state (in
		milliwatts).

		time: (RO) The total time spent in this idle state (in microseconds).

		usage: (RO) Number of times this state was entered (a count).


What:		/sys/devices/system/cpu/cpuX/cpuidle/stateN/desc
Date:		February 2008
KernelVersion:	v2.6.25
Contact:	Linux power management list <linux-pm@vger.kernel.org>
Description:
		(RO) A small description about the idle state (string).


What:		/sys/devices/system/cpu/cpuX/cpuidle/stateN/disable
Date:		March 2012
KernelVersion:	v3.10
Contact:	Linux power management list <linux-pm@vger.kernel.org>
Description:
		(RW) Option to disable this idle state (bool). The behavior and
		the effect of the disable variable depends on the implementation
		of a particular governor. In the ladder governor, for example,
		it is not coherent, i.e. if one is disabling a light state, then
		all deeper states are disabled as well, but the disable variable
		does not reflect it. Likewise, if one enables a deep state but a
		lighter state still is disabled, then this has no effect.


What:		/sys/devices/system/cpu/cpuX/cpuidle/stateN/residency
Date:		March 2014
KernelVersion:	v3.15
Contact:	Linux power management list <linux-pm@vger.kernel.org>
Description:
		(RO) Display the target residency i.e. the minimum amount of
		time (in microseconds) this cpu should spend in this idle state
		to make the transition worth the effort.


What:		/sys/devices/system/cpu/cpu#/cpufreq/*
Date:		pre-git history
Contact:	linux-pm@vger.kernel.org
+3 −0
Original line number Diff line number Diff line
@@ -310,6 +310,9 @@ static void __device_link_del(struct device_link *link)
	dev_info(link->consumer, "Dropping the link to %s\n",
		 dev_name(link->supplier));

	if (link->flags & DL_FLAG_PM_RUNTIME)
		pm_runtime_drop_link(link->consumer);

	list_del(&link->s_node);
	list_del(&link->c_node);
	device_link_free(link);
+4 −2
Original line number Diff line number Diff line
@@ -321,7 +321,8 @@ void dev_pm_arm_wake_irq(struct wake_irq *wirq)
		return;

	if (device_may_wakeup(wirq->dev)) {
		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED)
		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED &&
		    !pm_runtime_status_suspended(wirq->dev))
			enable_irq(wirq->irq);

		enable_irq_wake(wirq->irq);
@@ -343,7 +344,8 @@ void dev_pm_disarm_wake_irq(struct wake_irq *wirq)
	if (device_may_wakeup(wirq->dev)) {
		disable_irq_wake(wirq->irq);

		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED)
		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED &&
		    !pm_runtime_status_suspended(wirq->dev))
			disable_irq_nosync(wirq->irq);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ int dev_pm_opp_init_cpufreq_table(struct device *dev,
	if (max_opps <= 0)
		return max_opps ? max_opps : -ENODATA;

	freq_table = kcalloc((max_opps + 1), sizeof(*freq_table), GFP_ATOMIC);
	freq_table = kcalloc((max_opps + 1), sizeof(*freq_table), GFP_KERNEL);
	if (!freq_table)
		return -ENOMEM;

+1 −1
Original line number Diff line number Diff line
@@ -225,7 +225,7 @@ static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev,
}
#endif

#ifdef CONFIG_ARCH_HAS_CPU_RELAX
#if defined(CONFIG_CPU_IDLE) && defined(CONFIG_ARCH_HAS_CPU_RELAX)
void cpuidle_poll_state_init(struct cpuidle_driver *drv);
#else
static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {}