• Sebastian Andrzej Siewior's avatar
    net: e100: Remove in_interrupt() usage and pointless GFP_ATOMIC allocation · f127bab4
    Sebastian Andrzej Siewior authored
    e100_hw_init() invokes e100_self_test() only if in_interrupt() returns
    false as e100_self_test() uses msleep() which requires sleepable task
    context. The in_interrupt() check is incomplete because in_interrupt()
    cannot catch callers from contexts which have just preemption or interrupts
    disabled.
    
    e100_hw_init() is invoked from:
    
      - e100_loopback_test() which clearly is sleepable task context as the
        function uses msleep() itself.
    
      - e100_up() which clearly is sleepable task context as well because it
        invokes e100_alloc_cbs() abd request_irq() which both require sleepable
        task context due to GFP_KERNEL allocations and mutex_lock() operations.
    
    Remove the pointless in_interrupt() check.
    
    As a side effect of this analysis it turned out that e100_rx_alloc_list()
    which is only invoked from e100_loopback_test() and e100_up() pointlessly
    uses a GFP_ATOMIC allocation. The next invoked function e100_alloc_cbs() is
    using GFP_KERNEL already.
    
    Change the allocation mode in e100_rx_alloc_list() to GFP_KERNEL as well.
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f127bab4
e100.c 90 KB