Reboot logic in kernel/reboot will avoid calling kernel_power_off
when pm_power_off is null, and instead uses kernel_halt. Change
hibernate's power_down to follow the behavior in the reboot call.
Calling the notifier twice (once for SYS_POWER_OFF and again for
SYS_HALT) causes a panic during hibernation on Kirkwood
Openblocks A6 board.
Signed-off-by: Sebastian Capella <sebastian.capella(a)linaro.org>
Reported-by: Ezequiel Garcia <ezequiel.garcia(a)free-electrons.com>
Cc: Len Brown <len.brown(a)intel.com>
Cc: Pavel Machek <pavel(a)ucw.cz>
Cc: "Rafael J. Wysocki" <rjw(a)rjwysocki.net>
Cc: Russell King <linux(a)arm.linux.org.uk>
Cc: One Thousand Gnomes <gnomes(a)lxorguk.ukuu.org.uk>
---
kernel/power/hibernate.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index f4f2073..7642932 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -595,7 +595,8 @@ static void power_down(void)
case HIBERNATION_PLATFORM:
hibernation_platform_enter();
case HIBERNATION_SHUTDOWN:
- kernel_power_off();
+ if (pm_power_off)
+ kernel_power_off();
break;
#ifdef CONFIG_SUSPEND
case HIBERNATION_SUSPEND:
@@ -623,7 +624,8 @@ static void power_down(void)
* corruption after resume.
*/
printk(KERN_CRIT "PM: Please power down manually\n");
- while(1);
+ while (1)
+ cpu_relax();
}
/**
--
1.7.9.5
Hi:
arch64's Multi-cluster power management code is not available in the current lsk release while cpu suspend is in . when will the MCPM upstream to LSK? thanks
peter
ARMv8 allows AArch64-EL0 to execute cache maintenance instructions (eg, by setting SCTLR_EL1.UCI). It looks like the current ARMv8 kernel doesn't support the above feature.
Is there any plan in Linux for allowing AArch64_EL0 to perform cache-line operations?
Regards,
Rajan
Currently, KVM ARM/ARM64 only provides in-kernel emulation of Power State
and Coordination Interface (PSCI) v0.1.
This patchset aims at providing newer PSCI v0.2 for KVM ARM/ARM64 VCPUs
such that it does not break current KVM ARM/ARM64 ABI.
The user space tools (i.e. QEMU or KVMTOOL) will have to explicitly enable
KVM_ARM_VCPU_PSCI_0_2 feature using KVM_ARM_VCPU_INIT ioctl for providing
PSCI v0.2 to VCPUs.
Changlog:
V11:
- Added more comments to uapi/linux/psci.h
- Added comment about why we store INTERNAL_FAILURE in r0 (or x0)
for SYSTEM_OFF and SYSTEM_RESET emulation
V10:
- Updated PSCI_VERSION_xxx defines in uapi/linux/psci.h
- Added PSCI_0_2_AFFINITY_LEVEL_xxxx defines in uapi/linux/psci.h
- Removed PSCI v0.1 related defines from uapi/linux/psci.h
- Inject undefined exception for all types of errors in PSCI
emulation (i.e kvm_psci_call(vcpu) < 0)
- Removed "inline" attribute of kvm_prepare_system_event()
- Store INTERNAL_FAILURE in r0 (or x0) before exiting to userspace
- Use MPIDR_LEVEL_BITS in AFFINITY_MASK define
- Updated comment in kvm_psci_vcpu_suspend() as-per Marc's suggestion
V9:
- Rename undefined PSCI_VER_xxx defines to PSCI_VERSION_xxx defines
V8:
- Add #define for possible values of migrate type in uapi/linux/psci.h
- Simplified psci_affinity_mask() in psci.c
- Update comments in kvm_psci_vcpu_suspend() to indicate that for KVM
wakeup events are interrupts.
- Unconditionally update r0 (or x0) in kvm_psci_vcpu_on()
V7:
- Make uapi/linux/psci.h inline with Ashwin's patch
http://www.spinics.net/lists/arm-kernel/msg319090.html
- Incorporate Rob's suggestions for uapi/linux/psci.h
- Treat CPU_SUSPEND power-down request to be same as standby
request. This further simplifies CPU_SUSPEND emulation.
V6:
- Introduce uapi/linux/psci.h for sharing PSCI defines between
ARM kernel, ARM64 kernel, KVM ARM/ARM64 and user space
- Make CPU_SUSPEND emulation similar to WFI emulation
V5:
- Have separate last patch to advertise KVM_CAP_ARM_PSCI_0_2
- Use kvm_psci_version() in kvm_psci_vcpu_on()
- Return ALREADY_ON for PSCI v0.2 CPU_ON if VCPU is not paused
- Remove per-VCPU suspend context
- As-per PSCI v0.2 spec, only current CPU can suspend itself
V4:
- Implement all mandatory functions required by PSCI v0.2
V3:
- Make KVM_ARM_VCPU_PSCI_0_2 feature experiementatl for now so that
it fails for user space till all mandatory PSCI v0.2 functions are
emulated by KVM ARM/ARM64
- Have separate patch for making KVM_ARM_VCPU_PSCI_0_2 feature available
to user space. This patch can be defferred for now
V2:
- Don't rename PSCI return values KVM_PSCI_RET_NI and KVM_PSCI_RET_INVAL
- Added kvm_psci_version() to get PSCI version available to VCPU
- Fixed grammer in Documentation/virtual/kvm/api.txt
V1:
- Initial RFC PATCH
Anup Patel (12):
KVM: Add capability to advertise PSCI v0.2 support
ARM/ARM64: KVM: Add common header for PSCI related defines
ARM/ARM64: KVM: Add base for PSCI v0.2 emulation
KVM: Documentation: Add info regarding KVM_ARM_VCPU_PSCI_0_2 feature
ARM/ARM64: KVM: Make kvm_psci_call() return convention more flexible
KVM: Add KVM_EXIT_SYSTEM_EVENT to user space API header
ARM/ARM64: KVM: Emulate PSCI v0.2 SYSTEM_OFF and SYSTEM_RESET
ARM/ARM64: KVM: Emulate PSCI v0.2 AFFINITY_INFO
ARM/ARM64: KVM: Emulate PSCI v0.2 MIGRATE_INFO_TYPE and related
functions
ARM/ARM64: KVM: Fix CPU_ON emulation for PSCI v0.2
ARM/ARM64: KVM: Emulate PSCI v0.2 CPU_SUSPEND
ARM/ARM64: KVM: Advertise KVM_CAP_ARM_PSCI_0_2 to user space
Documentation/virtual/kvm/api.txt | 17 +++
arch/arm/include/asm/kvm_host.h | 2 +-
arch/arm/include/asm/kvm_psci.h | 6 +-
arch/arm/include/uapi/asm/kvm.h | 10 +-
arch/arm/kvm/arm.c | 1 +
arch/arm/kvm/handle_exit.c | 10 +-
arch/arm/kvm/psci.c | 235 ++++++++++++++++++++++++++++++++++---
arch/arm64/include/asm/kvm_host.h | 2 +-
arch/arm64/include/asm/kvm_psci.h | 6 +-
arch/arm64/include/uapi/asm/kvm.h | 10 +-
arch/arm64/kvm/handle_exit.c | 10 +-
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/kvm.h | 9 ++
include/uapi/linux/psci.h | 90 ++++++++++++++
14 files changed, 372 insertions(+), 37 deletions(-)
create mode 100644 include/uapi/linux/psci.h
--
1.7.9.5
Hi Thomas,
I know you are not going to look at these before end of this merge window and
you wanted to have a look at V1 before me posting these. But I am reposting them
now due to these reasons:
- Need to resend my cpu isolation (cpuset.quiesce) patches which are based of
these
- Few patches are dropped/merged/fixed/updated and so all the patches from V1
wouldn't have made sense
- There were some new patches as well which I wanted to send
These have gone through fair bit of testing via kbuild system maintained by
Fengguang Wu.
These are some minor cleanups and potential bug fixes in there. These are based
of tip/timers-core-for-linus ..
V1 of most of these patches (~28) were posted here:
https://lkml.org/lkml/2014/3/26/107https://lkml.org/lkml/2014/3/28/148
V1->V2:
- few new patches:
- patches around for_each_active_base()
- hrtimer: call switch_hrtimer_base() after setting new expiry time
- Some other minor cleanups
- few patches are dropped
- few are merged together as they covered same stuff
- rebased all patches and moved the patches removing parameters or return values
at the bottom, so that others can be applied easily. Though as per my last
mail, it doesn't look like they are making the 'text' segments any bigger.
Viresh Kumar (36):
hrtimer: replace 'tab' with 'space' after 'comma'
hrtimer: Fix comment mistake over hrtimer_force_reprogram()
hrtimer: fix routine names in comments
hrtimer: remove {} around a single liner 'for' loop in
migrate_hrtimers()
hrtimer: Coalesce format fragments in printk()
hrtimer: remove dummy definition of hrtimer_force_reprogram()
hrtimer: replace sizeof(struct hrtimer) with sizeof(*timer)
hrtimer: move unlock_hrtimer_base() upwards
hrtimer: call hrtimer_set_expires_range() from
hrtimer_set_expires_range_ns()
hrtimer: use base->index instead of basenum in switch_hrtimer_base()
hrtimer: no need to rewrite '1' to hrtimer_hres_enabled
hrtimer: use base->hres_active directly instead of
hrtimer_hres_active()
hrtimer: don't check state of base->hres_active in
hrtimer_switch_to_hres()
hrtimer: reorder code in __remove_hrtimer()
hrtimer: don't emulate notifier call to initialize timer base
hrtimer: Create hrtimer_get_monoexpires()
hrtimer: don't check if timer is queued in __remove_hrtimer()
hrtimer: rewrite switch_hrtimer_base() to remove extra indentation
level
hrtimer: rewrite remove_hrtimer() to remove extra indentation level
hrtimer: replace base by new_base to get resolution:
__hrtimer_start_range_ns()
hrtimer: create base_on_this_cpu()
hrtimer: clear active_bases as soon as the timer is removed
hrtimer: create for_each_active_base()
hrtimer: Use for_each_active_base() to iterate over active clock
bases
hrtimer: call hrtimer_get_softirq_time() only if
cpu_base->active_bases is set
hrtimer: take lock only once for a cpu_base in hrtimer_run_queues()
hrtimer: call switch_hrtimer_base() after setting new expiry time
hrtimer: remove 'base' parameter from remove_timer() and
__remove_timer()
hrtimer: remove 'base' parameter from switch_hrtimer_base()
hrtimer: remove 'base' parameter from enqueue_hrtimer()
hrtimer: remove 'base' parameter from hrtimer_{enqueue_}reprogram()
hrtimer: make switch_hrtimer_base() return void
hrtimer: make lock_hrtimer_base() return void
hrtimer: make enqueue_hrtimer() return void
timer: simplify CPU_UP_PREPARE notifier code path
timer: don't emulate notifier call to initialize timer base
include/linux/hrtimer.h | 14 +-
kernel/hrtimer.c | 365 ++++++++++++++++++++++--------------------------
kernel/timer.c | 12 +-
3 files changed, 179 insertions(+), 212 deletions(-)
--
1.7.12.rc2.18.g61b472e
As suggested by you (https://lkml.org/lkml/2014/4/14/797), this is the second
lot of changes I have. I have divided the earlier patchset into three parts:
- Bugfixes, already merged
- Code cleanups which shouldn't have any functional change
- Code cleanups which may have any functional change
This patchset is targeting the second part now. Its just about moving the code
around to make it more readable and obvious. Not removing any code at all, that
will be addressed in next series.
V1->V2: Actually V1 was never reviewed and so it is mostly a resend of V1. Some
rearrangement of patches is done though.
Viresh Kumar (19):
tick: trivial cleanups
tick: update doc style comments for 'struct tick_sched'
tick: rearrange members of 'struct tick_sched'
tick: move declaration of 'tick_cpu_device' to tick.h
tick: move definition of tick_get_device() to tick.h
tick: create tick_get_cpu_device() to get tick_cpu_device on this cpu
tick: initialize variables during their definitions
tick-oneshot: move tick_is_oneshot_available() to tick-oneshot.c
tick-oneshot: remove tick_resume_oneshot()
tick-common: call tick_check_percpu() from tick_check_preferred()
tick-common: remove tick_check_replacement()
tick-common: don't pass 'cpu' & 'cpumask' to tick_setup_device()
tick-common: remove local variable 'broadcast' from tick_resume()
tick-sched: add comment about 'idle_active' in tick_nohz_idle_exit()
tick-sched: define 'delta' inside 'if' block in
update_ts_time_stats()
tick-sched: remove parameters to {__}tick_nohz_task_switch() routines
tick-sched: remove local variable 'now' from tick_setup_sched_timer()
tick-sched: invert parameter of tick_check_oneshot_change()
tick-sched: rearrange code in tick_do_update_jiffies64()
include/linux/hrtimer.h | 3 --
include/linux/tick.h | 62 +++++++++++++++++++-----------
kernel/hrtimer.c | 4 +-
kernel/sched/core.c | 2 +-
kernel/time/clockevents.c | 12 +++---
kernel/time/clocksource.c | 14 +++----
kernel/time/tick-broadcast.c | 48 +++++++++--------------
kernel/time/tick-common.c | 90 ++++++++++++++------------------------------
kernel/time/tick-internal.h | 15 ++++----
kernel/time/tick-oneshot.c | 34 +++++++++--------
kernel/time/tick-sched.c | 80 +++++++++++++++++++++++----------------
kernel/time/timekeeping.c | 10 ++---
12 files changed, 177 insertions(+), 197 deletions(-)
--
1.7.12.rc2.18.g61b472e