linux/arch/powerpc/kernel
Benjamin Herrenschmidt 7230c56441 powerpc: Rework lazy-interrupt handling
The current implementation of lazy interrupts handling has some
issues that this tries to address.

We don't do the various workarounds we need to do when re-enabling
interrupts in some cases such as when returning from an interrupt
and thus we may still lose or get delayed decrementer or doorbell
interrupts.

The current scheme also makes it much harder to handle the external
"edge" interrupts provided by some BookE processors when using the
EPR facility (External Proxy) and the Freescale Hypervisor.

Additionally, we tend to keep interrupts hard disabled in a number
of cases, such as decrementer interrupts, external interrupts, or
when a masked decrementer interrupt is pending. This is sub-optimal.

This is an attempt at fixing it all in one go by reworking the way
we do the lazy interrupt disabling from the ground up.

The base idea is to replace the "hard_enabled" field with a
"irq_happened" field in which we store a bit mask of what interrupt
occurred while soft-disabled.

When re-enabling, either via arch_local_irq_restore() or when returning
from an interrupt, we can now decide what to do by testing bits in that
field.

We then implement replaying of the missed interrupts either by
re-using the existing exception frame (in exception exit case) or via
the creation of a new one from an assembly trampoline (in the
arch_local_irq_enable case).

This removes the need to play with the decrementer to try to create
fake interrupts, among others.

In addition, this adds a few refinements:

 - We no longer  hard disable decrementer interrupts that occur
while soft-disabled. We now simply bump the decrementer back to max
(on BookS) or leave it stopped (on BookE) and continue with hard interrupts
enabled, which means that we'll potentially get better sample quality from
performance monitor interrupts.

 - Timer, decrementer and doorbell interrupts now hard-enable
shortly after removing the source of the interrupt, which means
they no longer run entirely hard disabled. Again, this will improve
perf sample quality.

 - On Book3E 64-bit, we now make the performance monitor interrupt
act as an NMI like Book3S (the necessary C code for that to work
appear to already be present in the FSL perf code, notably calling
nmi_enter instead of irq_enter). (This also fixes a bug where BookE
perfmon interrupts could clobber r14 ... oops)

 - We could make "masked" decrementer interrupts act as NMIs when doing
timer-based perf sampling to improve the sample quality.

Signed-off-by-yet: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

v2:

- Add hard-enable to decrementer, timer and doorbells
- Fix CR clobber in masked irq handling on BookE
- Make embedded perf interrupt act as an NMI
- Add a PACA_HAPPENED_EE_EDGE for use by FSL if they want
  to retrigger an interrupt without preventing hard-enable

v3:

 - Fix or vs. ori bug on Book3E
 - Fix enabling of interrupts for some exceptions on Book3E

v4:

 - Fix resend of doorbells on return from interrupt on Book3E

v5:

 - Rebased on top of my latest series, which involves some significant
rework of some aspects of the patch.

v6:
 - 32-bit compile fix
 - more compile fixes with various .config combos
 - factor out the asm code to soft-disable interrupts
 - remove the C wrapper around preempt_schedule_irq

v7:
 - Fix a bug with hard irq state tracking on native power7
2012-03-09 13:25:06 +11:00
..
vdso32 Fix common misspellings 2011-03-31 11:26:23 -03:00
vdso64 Fix common misspellings 2011-03-31 11:26:23 -03:00
.gitignore
align.c powerpc: Remove fpscr use from [kvm_]cvt_{fd,df} 2010-09-02 14:07:32 +10:00
asm-offsets.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
audit.c
btext.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
cacheinfo.c cpu: convert 'cpu' and 'machinecheck' sysdev_class to a regular subsystem 2011-12-21 14:29:42 -08:00
cacheinfo.h
clock.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
compat_audit.c
cpu_setup_6xx.S powerpc: Fix some 6xx/7xxx CPU setup functions 2011-02-07 12:57:11 +11:00
cpu_setup_44x.S powerpc/44x: Add support for the AMCC APM821xx SoC 2010-10-13 08:47:09 -04:00
cpu_setup_a2.S powerpc/book3e: Add ICSWX/ACOP support to Book3e cores like A2 2011-11-25 14:11:28 +11:00
cpu_setup_fsl_booke.S powerpc/e5500: set non-base IVORs 2011-05-19 00:36:43 -05:00
cpu_setup_pa6t.S
cpu_setup_power7.S powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits 2011-07-12 13:16:58 +03:00
cpu_setup_ppc970.S powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits 2011-07-12 13:16:58 +03:00
cputable.c powerpc/476fpe: Add 476fpe SoC code 2011-12-09 07:51:02 -05:00
crash_dump.c powerpc: Rename mapping based RELOCATABLE to DYNAMIC_MEMSTART for BookE 2011-12-20 10:20:19 -05:00
crash.c powerpc/crash: Fix build error without SMP 2012-01-25 09:47:45 +11:00
dbell.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
dma-iommu.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
dma-swiotlb.c powerpc: Use the newly added get_required_mask dma_map_ops hook 2011-09-20 09:19:35 +10:00
dma.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
entry_32.S powerpc: Fix various issues with return to userspace 2012-02-22 16:48:53 +11:00
entry_64.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
exceptions-64e.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
exceptions-64s.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
fadump.c fadump: Invalidate registration and release reserved memory for general use. 2012-02-23 10:50:02 +11:00
firmware.c powerpc: fix implicit use of cache.h in kernel/firmware.c 2011-10-31 19:30:41 -04:00
fpu.S powerpc: Remove second definition of STACK_FRAME_OVERHEAD 2010-11-29 15:48:23 +11:00
fsl_booke_entry_mapping.S powerpc/fsl-booke: Fix address issue when using relocatable kernels 2010-07-11 11:04:08 -05:00
ftrace.c powerpc/ftrace: Implement raw syscall tracepoints on PowerPC 2011-05-26 13:38:57 +10:00
head_8xx.S powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
head_32.S powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
head_40x.S powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
head_44x.S powerpc/44x: Enable CONFIG_RELOCATABLE for PPC44x 2011-12-20 10:21:57 -05:00
head_64.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
head_booke.h powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
head_fsl_booke.S powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
hw_breakpoint.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
ibmebus.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
idle_6xx.S
idle_book3e.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
idle_e500.S powerpc: e500mc: Fix: use CONFIG_PPC_E500MC in idle_e500.S 2011-10-11 23:23:24 -05:00
idle_power4.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
idle_power7.S powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
idle.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
init_task.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
io-workarounds.c powerpc: io-workarounds.c was implicitly getting init_mm 2011-10-31 19:30:37 -04:00
io.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
iomap.c powerpc: switch to GENERIC_PCI_IOMAP 2011-11-28 21:13:18 +02:00
iommu.c fadump: Register for firmware assisted dump. 2012-02-23 10:50:01 +11:00
irq.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
isa-bridge.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
jump_label.c powerpc: Fix build breakage in jump_label.c 2011-11-16 14:25:19 +11:00
kgdb.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2011-05-23 09:12:26 -07:00
kprobes.c powerpc/kprobes: Remove resume_execution() in kprobes 2010-06-02 17:50:37 +10:00
kvm_emul.S KVM: PPC: Make PV mtmsrd L=1 work with r30 and r31 2010-10-24 10:52:14 +02:00
kvm.c powerpc: Copy down exception vectors after feature fixups 2011-11-16 14:47:54 +11:00
l2cr_6xx.S Fix common misspellings 2011-03-31 11:26:23 -03:00
legacy_serial.c powerpc: Fix build on some non-freescale platforms 2012-01-25 13:33:22 +11:00
lparcfg.c switch procfs to umode_t use 2012-01-03 22:54:56 -05:00
machine_kexec_32.c treewide: convert uses of ATTRIB_NORETURN to __noreturn 2012-01-12 20:13:03 -08:00
machine_kexec_64.c treewide: convert uses of ATTRIB_NORETURN to __noreturn 2012-01-12 20:13:03 -08:00
machine_kexec.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc 2012-01-06 17:58:22 -08:00
Makefile powerpc/perf: Move perf core & PMU code into a subdirectory 2012-02-23 10:50:04 +11:00
misc_32.S powerpc/4xx: Fix typos in kexec config dependencies 2011-11-16 14:47:54 +11:00
misc_64.S powerpc/maple: Enable scom access functions on Maple 2011-06-29 17:48:20 +10:00
misc.S powerpc: Remove legacy iSeries bits from assembly files 2012-03-09 10:54:59 +11:00
module_32.c modules: make arch's use default loader hooks 2011-07-24 22:06:04 +09:30
module_64.c modules: make arch's use default loader hooks 2011-07-24 22:06:04 +09:30
module.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
msi.c
nvram_64.c powerpc/nvram: Generalize code for OS partitions in NVRAM 2011-03-04 18:19:04 +11:00
of_platform.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
paca.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
pci_32.c powerpc: include export.h for files using EXPORT_SYMBOL/THIS_MODULE 2011-10-31 19:30:38 -04:00
pci_64.c powerpc/PCI: split PHB part out of pcibios_map_io_space() 2012-01-06 12:11:08 -08:00
pci_dn.c powerpc/powernv: PCI support for p7IOC under OPAL v2 2011-11-25 14:53:15 +11:00
pci_of_scan.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
pci-common.c Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci 2012-01-11 18:50:26 -08:00
pmc.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
ppc32.h
ppc_ksyms.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
ppc_save_regs.S Fix common misspellings 2011-03-31 11:26:23 -03:00
proc_powerpc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
process.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
prom_init_check.sh powerpc/powernv: Get kernel command line accross OPAL takeover 2011-09-20 16:09:48 +10:00
prom_init.c powerpc/prom: Remove limit on maximum size of properties 2012-03-07 17:06:10 +11:00
prom_parse.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
prom.c fadump: Remove the phyp assisted dump code. 2012-02-23 10:50:03 +11:00
ptrace32.c powerpc: Update compat_arch_ptrace 2010-12-09 15:35:32 +11:00
ptrace.c audit: inline audit_syscall_entry to reduce burden on archs 2012-01-17 16:16:56 -05:00
reloc_32.S powerpc: Process dynamic relocations for kernel 2011-12-20 10:21:08 -05:00
reloc_64.S
rtas_flash.c powerpc/pseries: Cancel RTAS event scan before firmware flash 2011-11-25 14:11:29 +11:00
rtas_pci.c powerpc: rename ppc_pci_*_flags to pci_*_flags 2011-07-12 09:28:04 -05:00
rtas-proc.c powerpc: Move /proc/ppc64 to /proc/powerpc update 2010-01-15 13:26:17 +11:00
rtas-rtc.c powerpc/rtas-rtc: remove sideeffects of printk_ratelimit 2011-06-29 15:30:43 +10:00
rtas.c powerpc/pseries: Fix partition migration hang in stop_topology_update 2012-02-14 15:01:39 +11:00
rtasd.c powerpc/pseries: Cancel RTAS event scan before firmware flash 2011-11-25 14:11:29 +11:00
setup_32.c powerpc: Copy down exception vectors after feature fixups 2011-11-16 14:47:54 +11:00
setup_64.c powerpc: Add gpages reservation code for 64-bit FSL BOOKE 2011-12-07 16:26:23 +11:00
setup-common.c fadump: Invalidate the fadump registration during machine shutdown. 2012-02-23 10:50:03 +11:00
setup.h
signal_32.c powerpc: Use set_current_blocked() and block_sigmask() 2012-03-07 17:06:09 +11:00
signal_64.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
signal.c powerpc: Use set_current_blocked() and block_sigmask() 2012-03-07 17:06:09 +11:00
signal.h powerpc: Fix various issues with return to userspace 2012-02-22 16:48:53 +11:00
smp-tbsync.c atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
smp.c Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core 2012-01-07 12:03:30 -08:00
softemu8xx.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
stacktrace.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
suspend.c update email address 2010-07-19 10:56:54 +02:00
swsusp_32.S Fix common misspellings 2011-03-31 11:26:23 -03:00
swsusp_64.c powerpc: Fix up implicit sched.h users 2011-10-31 19:30:40 -04:00
swsusp_asm64.S
swsusp_booke.S powerpc/fsl-booke: Add hibernation support for FSL BookE processors 2010-05-21 07:41:53 -05:00
swsusp.c powerpc/mm: Fix the call trace when resumed from hibernation 2011-09-20 09:19:58 +10:00
sys_ppc32.c BKL: remove extraneous #include <smp_lock.h> 2010-11-17 08:59:32 -08:00
syscalls.c Add generic sys_olduname() 2010-03-12 15:52:32 -08:00
sysfs.c Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core 2012-01-07 12:03:30 -08:00
systbl_chk.c
systbl_chk.sh
systbl.S
tau_6xx.c tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
time.c powerpc: Rework lazy-interrupt handling 2012-03-09 13:25:06 +11:00
traps.c powerpc: Disable interrupts in 64-bit kernel FP and vector faults 2012-03-09 10:55:10 +11:00
udbg_16550.c powerpc: Add early debug for WSP platforms 2011-05-06 13:32:41 +10:00
udbg.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc 2011-11-06 17:12:03 -08:00
vdso.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
vecemu.c
vector.S powerpc: Remove static branch hint in giveup_altivec 2011-05-19 14:30:42 +10:00
vio.c powerpc: clean up vio.c 2012-03-09 10:35:23 +11:00
vmlinux.lds.S powerpc: Remove legacy iSeries bits from assembly files 2012-03-09 10:54:59 +11:00