Skip to content
  • Mika Westerberg's avatar
    genirq: Allow migration of chained interrupts by installing default action · e509bd7d
    Mika Westerberg authored
    
    
    When a CPU is offlined all interrupts that have an action are migrated to
    other still online CPUs. However, if the interrupt has chained handler
    installed this is not done. Chained handlers are used by GPIO drivers which
    support interrupts, for instance.
    
    When the affinity is not corrected properly we end up in situation where
    most interrupts are not arriving to the online CPUs anymore. For example on
    Intel Braswell system which has SD-card card detection signal connected to
    a GPIO the IO-APIC routing entries look like below after CPU1 is offlined:
    
      pin30, enabled , level, low , V(52), IRR(0), S(0), logical , D(03), M(1)
      pin31, enabled , level, low , V(42), IRR(0), S(0), logical , D(03), M(1)
      pin32, enabled , level, low , V(62), IRR(0), S(0), logical , D(03), M(1)
      pin5b, enabled , level, low , V(72), IRR(0), S(0), logical , D(03), M(1)
    
    The problem here is that the destination mask still contains both CPUs even
    if CPU1 is already offline. This means that the IO-APIC still routes
    interrupts to the other CPU as well.
    
    We solve the problem by providing a default action for chained interrupts.
    This action allows the migration code to correct affinity (as it finds
    desc->action != NULL).
    
    Also make the default action handler to emit a warning if for some reason a
    chained handler ends up calling it.
    
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Cc: Jiang Liu <jiang.liu@linux.intel.com>
    Link: http://lkml.kernel.org/r/1444039935-30475-1-git-send-email-mika.westerberg@linux.intel.com
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    e509bd7d