• Sebastian Andrzej Siewior's avatar
    net: rtlwifi: Replace in_interrupt() for context detection · 920872e0
    Sebastian Andrzej Siewior authored
    rtl_lps_enter() and rtl_lps_leave() are using in_interrupt() to detect
    whether it is safe to acquire a mutex or if it is required to defer to a
    workqueue.
    
    The usage of in_interrupt() in drivers is phased out and Linus clearly
    requested that code which changes behaviour depending on context should
    either be seperated or the context be conveyed in an argument passed by the
    caller, which usually knows the context.
    
    in_interrupt() also is only partially correct because it fails to chose the
    correct code path when just preemption or interrupts are disabled.
    
    Add an argument 'may_block' to both functions and adjust the callers to
    pass the context information.
    
    The following call chains were analyzed to be safe to block:
    
        rtl_watchdog_wq_callback()
          rlf_lps_leave/enter()
    
        rtl_op_suspend()
          rtl_lps_leave()
    
        rtl_op_bss_info_changed()
          rtl_lps_leave()
    
        rtl_op_sw_scan_start()
          rtl_lps_leave()
    
    The following call chains were analyzed to be unsafe to block:
    
        _rtl_pci_interrupt()
          _rtl_pci_rx_interrupt()
    	  rtl_lps_leave()
    
        _rtl_pci_interrupt()
          _rtl_pci_rx_interrupt()
            rtl_is_special_data()
    	  rtl_lps_leave()
    
        _rtl_pci_interrupt()
          _rtl_pci_rx_interrupt()
            rtl_is_special_data()
    	  setup_special_tx()
    	    rtl_lps_leave()
    
        _rtl_pci_interrupt()
          _rtl_pci_tx_isr
            rtl_lps_leave()
    
          halbtc_leave_lps()
            rtl_lps_leave()
    
    This leaves four callers of rtl_lps_enter/leave() where the analyzis
    stopped dead in the maze of several nested pointer based callchains and
    lack of rtlwifi hardware to debug this via tracing:
    
         halbtc_leave_lps(), halbtc_enter_lps(), halbtc_normal_lps(),
         halbtc_pre_normal_lps()
    
    These four have been cautionally marked to be unable to block which is the
    safe option, but the rtwifi wizards should be able to clarify that.
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    920872e0
ps.c 25.4 KB