• Philippe Gerum's avatar
    ipipe: work around: force all interrupts to unlazy disable mode · a1bd0cc7
    Philippe Gerum authored
    We don't cope well with lazy disabling simply because we neither track
    nor update the descriptor state bits for reflecting the state of the
    irqchip regarding interrupts channels. Which is definitely wrong for
    multiple reasons.
    
    Since proper lazy disabling relies on the masked/unmasked interrupt
    state flag advertised by the descriptor, which is not updated by the
    pipeline entry code when masking before event deferral, we may end up
    with IRQ lines permanently masked.
    
    Such bug is typically triggered by drivers which disable IRQs on the
    fly directly from the interrupt handler as part of their PM logic,
    e.g.:
    
    <irq> (edge-triggered, lazy disable)
       __ipipe_ack_fasteoi_irq()
           irqchip.irq_hold()
              <irq masked in controller>
       ...
       handle_fasteoi_irq()
          handle_irq_event()
             driver: disable_irq(irq), schedule PM resume
    	    <irq lazily disabled, not set as masked>
          cond_unmask_eoi_irq()
             <irq disabled, no unmask>
    ...
    PM runtime resume
       enable_irq(irq)
         <irq seen as disabled but unmasked due to laziness, nop>
    
    irq is now permantenly masked: BUG.
    
    This change is a limited workaround, forcing all interrupts to unlazy
    disable mode when the pipeline is built in. The only sane fix would be
    to overhaul the pipelined interrupt flow handling entirely, in order
    to fully integrate that logic into the regular flow handlers, sharing
    the locking, descriptor state and status management with them.
    
    This is basically what dovetail is aiming at:
    http://lab.xenomai.org/linux-dovetail.git/
    a1bd0cc7
Name
Last commit
Last update
..
bpf Loading commit data...
cgroup Loading commit data...
configs Loading commit data...
debug Loading commit data...
events Loading commit data...
gcov Loading commit data...
ipipe Loading commit data...
irq Loading commit data...
livepatch Loading commit data...
locking Loading commit data...
power Loading commit data...
printk Loading commit data...
rcu Loading commit data...
sched Loading commit data...
time Loading commit data...
trace Loading commit data...
.gitignore Loading commit data...
Kconfig.freezer Loading commit data...
Kconfig.hz Loading commit data...
Kconfig.locks Loading commit data...
Kconfig.preempt Loading commit data...
Makefile Loading commit data...
acct.c Loading commit data...
async.c Loading commit data...
audit.c Loading commit data...
audit.h Loading commit data...
audit_fsnotify.c Loading commit data...
audit_tree.c Loading commit data...
audit_watch.c Loading commit data...
auditfilter.c Loading commit data...
auditsc.c Loading commit data...
backtracetest.c Loading commit data...
bounds.c Loading commit data...
capability.c Loading commit data...
compat.c Loading commit data...
configs.c Loading commit data...
context_tracking.c Loading commit data...
cpu.c Loading commit data...
cpu_pm.c Loading commit data...
crash_core.c Loading commit data...
crash_dump.c Loading commit data...
cred.c Loading commit data...
delayacct.c Loading commit data...
dma.c Loading commit data...
elfcore.c Loading commit data...
exec_domain.c Loading commit data...
exit.c Loading commit data...
extable.c Loading commit data...
fork.c Loading commit data...
freezer.c Loading commit data...
futex.c Loading commit data...
futex_compat.c Loading commit data...
groups.c Loading commit data...
hung_task.c Loading commit data...
irq_work.c Loading commit data...
jump_label.c Loading commit data...
kallsyms.c Loading commit data...
kcmp.c Loading commit data...
kcov.c Loading commit data...
kexec.c Loading commit data...
kexec_core.c Loading commit data...
kexec_file.c Loading commit data...
kexec_internal.h Loading commit data...
kmod.c Loading commit data...
kprobes.c Loading commit data...
ksysfs.c Loading commit data...
kthread.c Loading commit data...
latencytop.c Loading commit data...
memremap.c Loading commit data...
module-internal.h Loading commit data...
module.c Loading commit data...
module_signing.c Loading commit data...
notifier.c Loading commit data...
nsproxy.c Loading commit data...
padata.c Loading commit data...
panic.c Loading commit data...
params.c Loading commit data...
pid.c Loading commit data...
pid_namespace.c Loading commit data...
profile.c Loading commit data...
ptrace.c Loading commit data...
range.c Loading commit data...
reboot.c Loading commit data...
relay.c Loading commit data...
resource.c Loading commit data...
seccomp.c Loading commit data...
signal.c Loading commit data...
smp.c Loading commit data...
smpboot.c Loading commit data...
smpboot.h Loading commit data...
softirq.c Loading commit data...
stacktrace.c Loading commit data...
stop_machine.c Loading commit data...
sys.c Loading commit data...
sys_ni.c Loading commit data...
sysctl.c Loading commit data...
sysctl_binary.c Loading commit data...
task_work.c Loading commit data...
taskstats.c Loading commit data...
test_kprobes.c Loading commit data...
torture.c Loading commit data...
tracepoint.c Loading commit data...
tsacct.c Loading commit data...
ucount.c Loading commit data...
uid16.c Loading commit data...
umh.c Loading commit data...
up.c Loading commit data...
user-return-notifier.c Loading commit data...
user.c Loading commit data...
user_namespace.c Loading commit data...
utsname.c Loading commit data...
utsname_sysctl.c Loading commit data...
watchdog.c Loading commit data...
watchdog_hld.c Loading commit data...
workqueue.c Loading commit data...
workqueue_internal.h Loading commit data...