• Grant Grundler's avatar
    [PARISC] remove global_ack_eiem · 462b529f
    Grant Grundler authored
    Kudos to Thibaut Varene for spotting the (mis)use of appropriately named
    global_ack_eiem. This took a long time to figure out and both insight
    from myself, Kyle McMartin, and James Bottomley were required to narrow
    down which bit of code could have this race condition.
    
    The symptom was interrupts stopped getting delivered while some workload
    was generating IO interrupts on two different CPUs. One of the interrupt
    sources would get masked off and stay unmasked. Problem was global_ack_eiem
    was accessed with read/modified/write sequence and not protected by
    a spinlock.
    
    PA-RISC doesn't need a global ack flag though. External Interrupts
    are _always_ delivered to a single CPU (except for "global broadcast
    interrupt" which AFAIK currently is not used.) So we don't have to worry
    about any given IRQ vector getting delivered to more than one CPU.
    
    Tested on a500 and rp34xx boxen. rsync to/from gsyprf11 (a500)
    would lock up the box since NIC (tg3) interrupt and SCSI (sym2)
    were on "opposite" CPUs (2 CPU system). Put them on the same CPU
    or apply this patch and 10GB of data would rsync completely.
    
    Please apply the following critical patch.
    
    thanks,
    grant
    Signed-off-by: default avatarGrant Grundler <grundler@parisc-linux.org>
    Acked-by: default avatarThibaut VARENE <T-Bone@parisc-linux.org>
    Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
    462b529f
irq.c 10.1 KB