• Peter Xu's avatar
    x86/vector: Remove warning on managed interrupt migration · 469ff207
    Peter Xu authored
    The vector management code assumes that managed interrupts cannot be
    migrated away from an online CPU. free_moved_vector() has a WARN_ON_ONCE()
    which triggers when a managed interrupt vector association on a online CPU
    is cleared. The CPU offline code uses a different mechanism which cannot
    trigger this.
    
    This assumption is not longer correct because the new CPU isolation feature
    which affects the placement of managed interrupts must be able to move a
    managed interrupt away from an online CPU.
    
    There are two reasons why this can happen:
    
      1) When the interrupt is activated the affinity mask which was
         established in irq_create_affinity_masks() is handed in to
         the vector allocation code. This mask contains all CPUs to which
         the interrupt can be made affine to, but this does not take the
         CPU isolation 'managed_irq' mask into account.
    
         When the interrupt is finally requested by the device driver then the
         affinity is checked again and the CPU isolation 'managed_irq' mask is
         taken into account, which moves the interrupt to a non-isolated CPU if
         possible.
    
      2) The interrupt can be affine to an isolated CPU because the
         non-isolated CPUs in the calculated affinity mask are not online.
    
         Once a non-isolated CPU which is in the mask comes online the
         interrupt is migrated to this non-isolated CPU
    
    In both cases the regular online migration mechanism is used which triggers
    the WARN_ON_ONCE() in free_moved_vector().
    
    Case #1 could have been addressed by taking the isolation mask into
    account, but that would require a massive code change in the activation
    logic and the eventual migration event was accepted as a reasonable
    tradeoff when the isolation feature was developed. But even if #1 would be
    addressed, #2 would still trigger it.
    
    Of course the warning in free_moved_vector() was overlooked at that time
    and the above two cases which have been discussed during patch review have
    obviously never been tested before the final submission.
    
    So keep it simple and remove the warning.
    
    [ tglx: Rewrote changelog and added a comment to free_moved_vector() ]
    
    Fixes: 11ea68f5 ("genirq, sched/isolation: Isolate from handling managed interrupts")
    Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>                                                                                                                                                                       
    Link: https://lkml.kernel.org/r/20200312205830.81796-1-peterx@redhat.com
    469ff207
vector.c 33.1 KB