Skip to content
  • Heiko Carstens's avatar
    s390/udelay: make udelay have busy loop semantics · db7e007f
    Heiko Carstens authored
    
    
    When using systemtap it was observed that our udelay implementation is
    rather suboptimal if being called from a kprobe handler installed by
    systemtap.
    
    The problem observed when a kprobe was installed on lock_acquired().
    When the probe was hit the kprobe handler did call udelay, which set
    up an (internal) timer and reenabled interrupts (only the clock comparator
    interrupt) and waited for the interrupt.
    This is an optimization to avoid that the cpu is busy looping while waiting
    that enough time passes. The problem is that the interrupt handler still
    does call irq_enter()/irq_exit() which then again can lead to a deadlock,
    since some accounting functions may take locks as well.
    
    If one of these locks is the same, which caused lock_acquired() to be
    called, we have a nice deadlock.
    
    This patch reworks the udelay code for the interrupts disabled case to
    immediately leave the low level interrupt handler when the clock
    comparator interrupt happens. That way no C code is being called and the
    deadlock cannot happen anymore.
    
    Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Reviewed-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    db7e007f