• Jeff Dike's avatar
    [PATCH] uml: implement soft interrupts · 1d7173ba
    Jeff Dike authored
    This patch implements soft interrupts.  Interrupt enabling and disabling no
    longer map to sigprocmask.  Rather, a flag is set indicating whether
    interrupts may be handled.  If a signal comes in and interrupts are marked as
    OK, then it is handled normally.  If interrupts are marked as off, then the
    signal handler simply returns after noting that a signal needs handling.  When
    interrupts are enabled later on, this pending signals flag is checked, and the
    IRQ handlers are called at that point.
    
    The point of this is to reduce the cost of local_irq_save et al, since they
    are very much more common than the signals that they are enabling and
    disabling.  Soft interrupts produce a speed-up of ~25% on a kernel build.
    
    Subtleties -
    
        UML uses sigsetjmp/siglongjmp to switch contexts.  sigsetjmp has been
        wrapped in a save_flags-like macro which remembers the interrupt state at
        setjmp time, and restores it when it is longjmp-ed back to.
    
        The enable_signals function has to loop because the IRQ handler
        disables interrupts before returning.  enable_signals has to return with
        signals enabled, and signals may come in between the disabling and the
        return to enable_signals.  So, it loops for as long as there are pending
        signals, ensuring that signals are enabled when it finally returns, and
        that there are no pending signals that need to be dealt with.
    Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
    Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    1d7173ba
longjmp.h 323 Bytes