• Eric W. Biederman's avatar
    [PATCH] genirq: irq: add moved_masked_irq · e7b946e9
    Eric W. Biederman authored
    Currently move_native_irq disables and renables the irq we are migrating to
    ensure we don't take that irq when we are actually doing the migration
    operation.  Disabling the irq needs to happen but sometimes doing the work is
    move_native_irq is too late.
    
    On x86 with ioapics the irq move sequences needs to be:
    edge_triggered:
      mask irq.
      move irq.
      unmask irq.
      ack irq.
    level_triggered:
      mask irq.
      ack irq.
      move irq.
      unmask irq.
    
    We can easily perform the edge triggered sequence, with the current defintion
    of move_native_irq.  However the level triggered case does not map well.  For
    that I have added move_masked_irq, to allow me to disable the irqs around both
    the ack and the move.
    
    Q: Why have we not seen this problem earlier?
    
    A: The only symptom I have been able to reproduce is that if we change
       the vector before acknowleding an irq the wrong irq is acknowledged.
       Since we currently are not reprogramming the irq vector during
       migration no problems show up.
    
       We have to mask the irq before we acknowledge the irq or else we could
       hit a window where an irq is asserted just before we acknowledge it.
    
       Edge triggered irqs do not have this problem because acknowledgements
       do not propogate in the same way.
    Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Rajesh Shah <rajesh.shah@intel.com>
    Cc: Andi Kleen <ak@muc.de>
    Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
    Cc: "Luck, Tony" <tony.luck@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    e7b946e9
migration.c 1.66 KB