1. 29 Sep, 2020 40 commits
    • David S. Miller's avatar
      Merge branch 'net-in_interrupt-cleanup-and-fixes' · e6b6be53
      David S. Miller authored
      Thomas Gleixner says:
      
      ====================
      net: in_interrupt() cleanup and fixes
      
      in the discussion about preempt count consistency accross kernel configurations:
      
        https://lore.kernel.org/r/20200914204209.256266093@linutronix.de/
      
      Linus clearly requested that code in drivers and libraries which changes
      behaviour based on execution context should either be split up so that
      e.g. task context invocations and BH invocations have different interfaces
      or if that's not possible the context information has to be provided by the
      caller which knows in which context it is executing.
      
      This includes conditional locking, allocation mode (GFP_*) decisions and
      avoidance of code paths which might sleep.
      
      In the long run, usage of 'preemptible, in_*irq etc.' should be banned from
      driver code completely.
      
      This is the second version of the first batch of related changes. V1 can be
      found here:
      
           https://lore.kernel.org/r/20200927194846.045411263@linutronix.de
      
      Changes vs. V1:
      
        - Rebased to net-next
      
        - Fixed the half done rename sillyness in the ENIC patch.
      
        - Fixed the IONIC driver fallout.
      
        - Picked up the SFC fix from Edward and adjusted the GFP_KERNEL change
          accordingly.
      
        - Addressed the review comments vs. BCRFMAC.
      
        - Collected Reviewed/Acked-by tags as appropriate.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e6b6be53
    • 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
    • Sebastian Andrzej Siewior's avatar
      net: rtlwifi: Remove in_interrupt() from debug macro · e741751b
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt() in drivers in is phased out.
      
      rtl_dbg() a printk based debug aid is using in_interrupt() in the
      underlying C function _rtl_dbg_out() which is almost identical to
      _rtl_dbg_print(). The only difference is the printout of in_interrupt().
      
      The decoding of in_interrupt() as hexvalue is non-trivial and aside of
      being phased out for driver usage the return value is just by chance the
      masked preempt count value and not a boolean.
      
      These home brewn printk debug aids are tedious to work with and provide
      only minimal context.  They should be replaced by trace_printk() or a debug
      tracepoint which automatically records all context information.
      
      To make progress on the in_interrupt() cleanup, make rtl_dbg() use
      _rtl_dbg_print() and remove _rtl_dbg_out().
      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>
      e741751b
    • Sebastian Andrzej Siewior's avatar
      net: rtlwifi: Remove void* casts related to delayed work · a3b7b227
      Sebastian Andrzej Siewior authored
      INIT_DELAYED_WORK() takes two arguments: A pointer to the delayed work and
      a function reference for the callback.
      
      The rtl code casts all function references to (void *) because the
      callbacks in use are not matching the required function signature. That's
      error prone and bad pratice.
      
      Some of the callback functions are also global, but only used in a single
      file.
      
      Clean the mess up by:
      
        - Adding the proper arguments to the callback functions and using them in
          the container_of() constructs correctly which removes the hideous
          container_of_dwork_rtl() macro as well.
      
        - Removing the type cast at the initializers
      
        - Making the unnecessary global functions static
      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>
      a3b7b227
    • Sebastian Andrzej Siewior's avatar
      net: libertas: Use netif_rx_any_context() · 021b58ef
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt() in non-core code is phased out. Ideally the
      information of the calling context should be passed by the callers or the
      functions be split as appropriate.
      
      libertas uses in_interupt() to select the netif_rx*() variant which matches
      the calling context. The attempt to consolidate the code by passing an
      arguemnt or by distangling it failed due lack of knowledge about this
      driver and because the call chains are hard to follow.
      
      As a stop gap use netif_rx_any_context() which invokes the correct code
      path depending on context and confines the in_interrupt() usage to core
      code.
      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>
      021b58ef
    • Sebastian Andrzej Siewior's avatar
      net: libertas libertas_tf: Remove in_interrupt() from debug macro. · 8faee701
      Sebastian Andrzej Siewior authored
      The debug macro prints (INT) when in_interrupt() returns true. The value of
      this information is dubious as it does not distinguish between the various
      contexts which are covered by in_interrupt().
      
      As the usage of in_interrupt() in drivers is phased out and the same
      information can be more precisely obtained with tracing, remove the
      in_interrupt() conditional from this debug printk.
      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>
      8faee701
    • Sebastian Andrzej Siewior's avatar
      net: mwifiex: Use netif_rx_any_context(). · d36981e0
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt() in non-core code is phased out. Ideally the
      information of the calling context should be passed by the callers or the
      functions be split as appropriate.
      
      mwifiex uses in_interupt() to select the netif_rx*() variant which matches
      the calling context. The attempt to consolidate the code by passing an
      arguemnt or by distangling it failed due lack of knowledge about this
      driver and because the call chains are hard to follow.
      
      As a stop gap use netif_rx_any_context() which invokes the correct code
      path depending on context and confines the in_interrupt() usage to core
      code.
      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>
      d36981e0
    • Sebastian Andrzej Siewior's avatar
      net: hostap: Remove in_interrupt() usage · 75fd2963
      Sebastian Andrzej Siewior authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and a tree wide
      effort to clean up and consolidate the (ab)usage of in_interrupt() and
      related checks is happening.
      
      hfa384x_cmd() and prism2_hw_reset() check in_interrupt() at function entry
      and if true emit a printk at debug loglevel and return. This is clearly debug
      code.
      
      Both functions invoke functions which can sleep. These functions already
      have appropriate debug checks which cover all invalid contexts, while
      in_interrupt() fails to detect context which just has preemption or
      interrupts disabled.
      
      Remove both checks as they are incomplete, debug only and already covered
      by the subsequently invoked functions properly. If called from invalid
      context the resulting back trace is definitely more helpful to analyze the
      problem than a printk at debug loglevel.
      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>
      75fd2963
    • Sebastian Andrzej Siewior's avatar
      net: iwlwifi: Remove in_interrupt() from tracing macro. · bd63bca5
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt) in driver code is phased out.
      
      The iwlwifi_dbg tracepoint records in_interrupt() seperately, but that's
      superfluous because the trace header already records all kind of state and
      context information like hardirq status, softirq status, preemption count
      etc.
      
      Aside of that the recording of in_interrupt() as boolean does not allow to
      distinguish between the possible contexts (hard interrupt, soft interrupt,
      bottom half disabled) while the trace header gives precise information.
      
      Remove the duplicate information from the tracepoint and fixup the caller.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Acked-by: default avatarLuca Coelho <luca@coelho.fi>
      Acked-by: default avatarKalle Valo <kvalo@codeaurora.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      bd63bca5
    • Sebastian Andrzej Siewior's avatar
      net: ipw2x00,iwlegacy,iwlwifi: Remove in_interrupt() from debug macros · e4ff7d6b
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt() in non-core code is phased out.
      
      The debugging macros in these drivers use in_interrupt() to print 'I' or
      'U' depending on the return value of in_interrupt(). While 'U' is confusing
      at best and 'I' is not really describing the actual context (hard interupt,
      soft interrupt, bottom half disabled section) these debug macros originate
      from the pre ftrace kernel era and their value today is questionable. They
      probably should be removed completely.
      
      The macros weere added initially for ipw2100 and then spreaded when the
      driver was forked.
      
      Remove the in_interrupt() usage at least..
      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>
      e4ff7d6b
    • Sebastian Andrzej Siewior's avatar
      net: brcmfmac: Convey allocation mode as argument · c597ede4
      Sebastian Andrzej Siewior authored
      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.
      
      brcmf_fweh_process_event() uses in_interrupt() to select the allocation
      mode GFP_KERNEL/GFP_ATOMIC. Aside of the above reasons this check is
      incomplete as it cannot detect contexts which just have preemption or
      interrupts disabled.
      
      All callchains leading to brcmf_fweh_process_event() can clearly identify
      the calling context. Convey a 'gfp' argument through the callchains and let
      the callers hand in the appropriate GFP mode.
      
      This has also the advantage that any change of execution context or
      preemption/interrupt state in these callchains will be detected by the
      memory allocator for all GFP_KERNEL allocations.
      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>
      c597ede4
    • Thomas Gleixner's avatar
      net: brcmfmac: Convey execution context via argument to brcmf_netif_rx() · 687006e2
      Thomas Gleixner authored
      bcrmgf_netif_rx() uses in_interrupt to chose between netif_rx() and
      netif_rx_ni(). in_interrupt() usage in drivers is phased out.
      
      Convey the execution mode via an 'inirq' argument through the various
      callchains leading to brcmf_netif_rx():
      
      brcmf_pcie_isr_thread()		    <- Task context
        brcmf_proto_msgbuf_rx_trigger()
          brcmf_msgbuf_process_rx()
            brcmf_msgbuf_process_msgtype()
              brcmf_msgbuf_process_rx_complete()
      	  brcmf_netif_mon_rx()
      	     brcmf_netif_rx(isirq = false)
      	  brcmf_netif_rx(isirq = false)
      
      brcmf_sdio_readframes()  <- Task context sdio_claim_host() might sleep
        brcmf_rx_frame(isirq = false)
      
      brcmf_sdio_rxglom()      <- Task context sdio_claim_host() might sleep
        brcmf_rx_frame(isirq = false)
      
      brcmf_usb_rx_complete()  <- Interrupt context
        brcmf_rx_frame(isirq = true)
      
      brcmf_rx_frame()
        brcmf_proto_rxreorder()
          brcmf_proto_bcdc_rxreorder()
            brcmf_fws_rxreorder()
              brcmf_netif_rx()
            brcmf_netif_rx()
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: Arend van Spriel <arend.vanspriel@broadcom.com>
      Cc: Kalle Valo <kvalo@codeaurora.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      687006e2
    • Sebastian Andrzej Siewior's avatar
      net: brcmfmac: Replace in_interrupt() · d067c0fa
      Sebastian Andrzej Siewior authored
      brcmf_sdio_isr() is using in_interrupt() to distinguish if it is called
      from a interrupt service routine or from a worker thread.
      
      Passing such information from the calling context is preferred and
      requested by Linus, so add an argument `in_isr' to brcmf_sdio_isr() and let
      the callers pass the information about the calling context.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
      Acked-by: default avatarKalle Valo <kvalo@codeaurora.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d067c0fa
    • Sebastian Andrzej Siewior's avatar
      net: wan/lmc: Remove lmc_trace() · c2f8c900
      Sebastian Andrzej Siewior authored
      lmc_trace() was first introduced in commit e7a392d5 ("Import
      2.3.99pre6-5") and was not touched ever since.
      
      The reason for looking at this was to get rid of the in_interrupt() usage,
      but while looking at it the following observations were made:
      
       - At least lmc_get_stats() (->ndo_get_stats()) is invoked with disabled
         preemption which is not detected by the in_interrupt() check, which
         would cause schedule() to be called from invalid context.
      
       - The code is hidden behind #ifdef LMC_TRACE which is not defined within
         the kernel and wasn't at the time it was introduced.
      
       - Three jiffies don't match 50ms. msleep() would be a better match which
         would also avoid the schedule() invocation. But why have it to begin
         with?
      
       - Nobody would do something like this today. Either netdev_dbg() or
         trace_printk() or a trace event would be used.  If only the functions
         related to this driver are interesting then ftrace can be used with
         filtering.
      
      As it is obviously broken for years, simply remove it.
      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>
      c2f8c900
    • Sebastian Andrzej Siewior's avatar
      net: usb: net1080: Remove in_interrupt() comment · cfa1b493
      Sebastian Andrzej Siewior authored
      The comment above nc_vendor_write() suggests that the function could become
      async so that is usable in `in_interrupt()' context or that it already is
      safe to be called from such a context.
      
      Eitherway: The function did not become async since v2.4.9.2 (2002) and it
      must be not be called from `in_interrupt()' context because it sleeps on
      mutltiple occations.
      
      Remove the misleading comment.
      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>
      cfa1b493
    • Sebastian Andrzej Siewior's avatar
      net: usb: kaweth: Remove last user of kaweth_control() · a19c2619
      Sebastian Andrzej Siewior authored
      kaweth_async_set_rx_mode() invokes kaweth_contol() and has two callers:
      
      - kaweth_open() which is invoked from preemptible context
      .
      - kaweth_start_xmit() which holds a spinlock and has bottom halfs disabled.
      
      If called from kaweth_start_xmit() kaweth_async_set_rx_mode() obviously
      cannot block, which means it can't call kaweth_control(). This is detected
      with an in_interrupt() check.
      
      Replace the in_interrupt() check in kaweth_async_set_rx_mode() with an
      argument which is set true by the caller if the context is safe to sleep,
      otherwise false.
      
      Now kaweth_control() is only called from preemptible context which means
      there is no need for GFP_ATOMIC allocations anymore. Replace it with
      usb_control_msg(). Cleanup the code a bit while at it.
      
      Finally remove kaweth_control() since the last user is gone.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a19c2619
    • Sebastian Andrzej Siewior's avatar
      net: usb: kaweth: Replace kaweth_control() with usb_control_msg() · af3563be
      Sebastian Andrzej Siewior authored
      kaweth_control() is almost the same as usb_control_msg() except for the
      memory allocation mode (GFP_ATOMIC vs GFP_NOIO) and the in_interrupt()
      check.
      
      All the invocations of kaweth_control() are within the probe function in
      fully preemtible context so there is no reason to use atomic allocations,
      GFP_NOIO which is used by usb_control_msg() is perfectly fine.
      
      Replace kaweth_control() invocations from probe with usb_control_msg().
      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>
      af3563be
    • Sebastian Andrzej Siewior's avatar
      net: zd1211rw: Remove ZD_ASSERT(in_interrupt()) · 911b8eac
      Sebastian Andrzej Siewior authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and
      a tree wide effort to clean up and consolidate the (ab)usage of
      in_interrupt() and related checks is happening.
      
      handle_regs_int() is always invoked as part of URB callback which is either
      invoked from hard or soft interrupt context.
      
      Remove the magic assertion.
      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>
      911b8eac
    • Sebastian Andrzej Siewior's avatar
      net: vxge: Remove in_interrupt() conditionals · 77afca29
      Sebastian Andrzej Siewior authored
      vxge_os_dma_malloc() and vxge_os_dma_malloc_async() are both called from
      callchains which use GFP_KERNEL allocations unconditionally or have other
      requirements to be called from fully preemptible task context..
      
      vxge_os_dma_malloc():
        1)  __vxge_hw_blockpool_create() <- GFP_KERNEL
      
        2)  __vxge_hw_mempool_grow() <- vzalloc()
              __vxge_hw_blockpool_malloc()
      
      vxge_os_dma_malloc_async():
        1  __vxge_hw_mempool_grow() <- vzalloc()
            __vxge_hw_blockpool_malloc()
      	__vxge_hw_blockpool_blocks_add()
      
        2)  vxge_hw_vpath_open()	<- vzalloc()
      	__vxge_hw_blockpool_block_allocate()
      
      That means neither of these functions needs a conditional allocation mode.
      
      Remove the in_interrupt() conditional and use GFP_KERNEL.
      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>
      77afca29
    • Sebastian Andrzej Siewior's avatar
      net: sun3lance: Remove redundant checks in interrupt handler · a1f46746
      Sebastian Andrzej Siewior authored
      lance_interrupt() contains two pointless checks:
      
       - A check whether the 'dev_id' argument is NULL. 'dev_id' is the pointer
         which was handed in to request_irq() and the interrupt handler will
         always be invoked with that pointer as 'dev_id' argument by the core
         code.
      
       - A check for interrupt reentrancy. The core code already guarantees
         non-reentrancy of interrupt handlers.
      
      Remove these check.
      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>
      a1f46746
    • Sebastian Andrzej Siewior's avatar
      net: sunbmac: Replace in_interrupt() usage · d08749ea
      Sebastian Andrzej Siewior authored
      bigmac_init_rings() has an argument signaling if it is called from the
      interrupt handler. This is used to decide between GFP_KERNEL and GFP_ATOMIC
      for memory allocations.
      
      But it also checks in_interrupt() to handle invocations which come from the
      timer callback bigmac_timer() via bigmac_hw_init(), which is invoked with
      'in_irq = 0'. While the timer callback is clearly not in hard interrupt
      context it is still not sleepable context.
      
      Rename the argument to `non_blocking' and set it to true if invoked from
      the timer callback or the interrupt handler which allows to remove the
      in_interrupt() check and makes the code consistent.
      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>
      d08749ea
    • Sebastian Andrzej Siewior's avatar
      net: sfc: Use GFP_KERNEL in efx_ef10_try_update_nic_stats() · caa241f0
      Sebastian Andrzej Siewior authored
      efx_ef10_try_update_nic_stats_vf() is now only invoked from thread context
      and can sleep after efx::stats_lock is dropped.
      
      Change the allocation mode from GFP_ATOMIC to GFP_KERNEL.
      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>
      caa241f0
    • Edward Cree's avatar
      net: sfc: Replace in_interrupt() usage · 623b9988
      Edward Cree authored
      efx_ef10_try_update_nic_stats_vf() used in_interrupt() to figure out
      whether it is safe to sleep (for MCDI) or not.
      
      The only caller from which it was not is efx_net_stats(), which can be
      invoked under dev_base_lock from net-sysfs::netstat_show().
      
      So add a new update_stats_atomic() method to struct efx_nic_type, and call
      it from efx_net_stats(), removing the need for
      efx_ef10_try_update_nic_stats_vf() to behave differently for this case
      (which it wasn't doing correctly anyway).
      
      For all nic_types other than EF10 VF, this method is NULL so the the
      regular update_stats() methods are invoked , which are happy with being
      called from atomic contexts.
      
      Fixes: f00bf230 ("sfc: don't update stats on VF when called in atomic context")
      Reported-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarMartin Habets <mhabets@solarflare.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      623b9988
    • Thomas Gleixner's avatar
      net: natsemi: Replace in_interrupt() usage. · 606dbf8d
      Thomas Gleixner authored
      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.
      
      sonic_quiesce() uses 'in_interrupt() || irqs_disabled()' to chose either
      udelay() or usleep_range() in the wait loop.
      
      In all callchains leading to it the context is well defined and known.
      
      Add a 'may_sleep' argument and pass it through the various callchains
      leading to this function.
      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>
      606dbf8d
    • Sebastian Andrzej Siewior's avatar
      net: mdiobus: Remove WARN_ON_ONCE(in_interrupt()) · 85bdebd1
      Sebastian Andrzej Siewior authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and a tree wide
      effort to clean up and consolidate the (ab)usage of in_interrupt() and
      related checks is happening.
      
      In this case the check covers only parts of the contexts in which these
      functions cannot be called. It fails to detect preemption or interrupt
      disabled invocations.
      
      As the functions which contain these warnings invoke mutex_lock() which
      contains a broad variety of checks (always enabled or debug option
      dependent) and therefore covers all invalid conditions already, there is no
      point in having inconsistent warnings in those drivers. The conditional
      return is not really valuable in practice either.
      
      Just remove them.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      85bdebd1
    • Sebastian Andrzej Siewior's avatar
      net: ionic: Remove WARN_ON(in_interrupt()). · f5fc6e85
      Sebastian Andrzej Siewior authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and a tree wide
      effort to clean up and consolidate the (ab)usage of in_interrupt() and
      related checks is happening.
      
      In this case the check covers only parts of the contexts in which these
      functions cannot be called. It fails to detect preemption or interrupt
      disabled invocations.
      
      As the functions which are invoked from ionic_adminq_post() and
      ionic_dev_cmd_wait() contain a broad variety of checks (always enabled or
      debug option dependent) which cover all invalid conditions already, there
      is no point in having inconsistent warnings in those drivers.
      
      Just remove them.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Acked-by: default avatarShannon Nelson <snelson@pensando.io>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f5fc6e85
    • Sebastian Andrzej Siewior's avatar
      net: ionic: Replace in_interrupt() usage. · 1800eee1
      Sebastian Andrzej Siewior authored
      The in_interrupt() usage in this driver tries to figure out which context
      may sleep and which context may not sleep. in_interrupt() is not really
      suitable as it misses both preemption disabled and interrupt disabled
      invocations from task context.
      
      Conditionals like that in driver code are frowned upon in general because
      invocations of functions from invalid contexts might not be detected
      as the conditional papers over it.
      
      ionic_lif_addr() and _ionoc_lif_rx_mode() can be called from:
      
       1) ->ndo_set_rx_mode() which is under netif_addr_lock_bh()) so it must not
          sleep.
      
       2) Init and setup functions which are in fully preemptible task context.
      
      ionic_link_status_check_request() has two call paths:
      
       1) NAPI which obviously cannot sleep
      
       2) Setup which is again fully preemptible task context
      
      Add arguments which convey the execution context to the affected functions
      and let the callers provide the context instead of letting the functions
      deduce it.
      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>
      1800eee1
    • Sebastian Andrzej Siewior's avatar
      net: intel: Remove in_interrupt() warnings · 0171f4e8
      Sebastian Andrzej Siewior authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and a tree wide
      effort to clean up and consolidate the (ab)usage of in_interrupt() and
      related checks is happening.
      
      In this case the checks cover only parts of the contexts in which these
      functions cannot be called. They fail to detect preemption or interrupt
      disabled invocations.
      
      As the functions which are invoked from the various places contain already
      a broad variety of checks (always enabled or debug option dependent) cover
      all invalid conditions already, there is no point in having inconsistent
      warnings in those drivers.
      
      Just remove them.
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarAlexander Duyck <alexander.h.duyck@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0171f4e8
    • Sebastian Andrzej Siewior's avatar
      net: fec_mpc52xx: Replace in_interrupt() usage · c35a0824
      Sebastian Andrzej Siewior authored
      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.
      
      mpc52xx_fec_stop() uses in_interrupt() to check if it is safe to sleep. All
      callers run in well defined contexts.
      
      Pass an argument from the callers indicating whether it is safe to sleep.
      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>
      c35a0824
    • 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
    • Thomas Gleixner's avatar
      net: cxbg4: Remove pointless in_interrupt() check · 8aed9064
      Thomas Gleixner authored
      t4_sge_stop() is only ever called from task context and the in_interrupt()
      check is presumably a leftover from copying t3_sge_stop().
      
      Aside of in_interrupt() being deprecated because it's not providing what it
      claims to provide, this check would paper over illegitimate callers.
      
      The functions invoked from t4_sge_stop() contain already warnings to catch
      invocations from invalid contexts.
      
      Remove it.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8aed9064
    • Thomas Gleixner's avatar
      net: cxgb3: Cleanup in_interrupt() usage · a17409e7
      Thomas Gleixner authored
      t3_sge_stop() is called from task context and from error handlers in
      interrupt context. It relies on in_interrupt() to differentiate the
      contexts.
      
      in_interrupt() is deprecated as it is ill defined and does not provide what
      it suggests.
      
      Instead of replacing it with some other construct, simply split the
      function into t3_sge_stop_dma(), which can be called from any context, and
      t3_sge_stop() which can be only called from task context.
      
      This has the advantage that any bogus invocation of t3_sge_stop() from
      wrong contexts can be caught by debug kernels instead of being papered over
      by the conditional.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a17409e7
    • Thomas Gleixner's avatar
      net: atheros: Remove WARN_ON(in_interrupt()) · 453590a8
      Thomas Gleixner authored
      in_interrupt() is ill defined and does not provide what the name
      suggests. The usage especially in driver code is deprecated and a tree wide
      effort to clean up and consolidate the (ab)usage of in_interrupt() and
      related checks is happening.
      
      In this case the check covers only parts of the contexts in which these
      functions cannot be called. It fails to detect preemption or interrupt
      disabled invocations.
      
      As the functions which are invoked from at*_reinit_locked() contain a broad
      variety of checks (always enabled or debug option dependent) which cover
      all invalid conditions already, there is no point in having inconsistent
      warnings in those drivers.
      
      Just remove them.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      453590a8
    • Sebastian Andrzej Siewior's avatar
      net: caif: Use netif_rx_any_context() · f773c765
      Sebastian Andrzej Siewior authored
      The usage of in_interrupt() in non-core code is phased out. Ideally the
      information of the calling context should be passed by the callers or the
      functions be split as appropriate.
      
      cfhsi_rx_desc() and cfhsi_rx_pld() use in_interrupt() to distinguish if
      they should use netif_rx() or netif_rx_ni() for receiving packets.
      
      The attempt to consolidate the code by passing an arguemnt or by
      distangling it failed due lack of knowledge about this driver and because
      the call chains are hard to follow.
      
      As a stop gap use netif_rx_any_context() which invokes the correct code path
      depending on context and confines the in_interrupt() usage to core code.
      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>
      f773c765
    • Sebastian Andrzej Siewior's avatar
      net: Add netif_rx_any_context() · c11171a4
      Sebastian Andrzej Siewior authored
      Quite some drivers make conditional decisions based on in_interrupt() to
      invoke either netif_rx() or netif_rx_ni().
      
      Conditionals based on in_interrupt() or other variants of preempt count
      checks in drivers should not exist for various reasons and Linus clearly
      requested to either split the code pathes or pass an argument to the
      common functions which provides the context.
      
      This is obviously the correct solution, but for some of the affected
      drivers this needs a major rewrite due to their convoluted structure.
      
      As in_interrupt() usage in drivers needs to be phased out, provide
      netif_rx_any_context() as a stop gap for these drivers.
      
      This confines the in_interrupt() conditional to core code which in turn
      allows to remove the access to this check for driver code and provides one
      central place to do further modifications once the driver maze is cleaned
      up.
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      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>
      c11171a4
    • Thomas Gleixner's avatar
      net: caif: Remove unused caif SPI driver · f2bf88c4
      Thomas Gleixner authored
      While chasing in_interrupt() (ab)use in drivers it turned out that the
      caif_spi driver has never been in use since the driver was merged 10 years
      ago. There never was any matching code which provides a platform device.
      
      The driver has not seen any update (asided of treewide changes and
      cleanups) since 8 years and the maintainers vanished from the planet.
      
      So analysing the potential contexts and the (in)correctness of
      in_interrupt() usage is just a pointless exercise.
      
      Remove the cruft.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f2bf88c4
    • Thomas Gleixner's avatar
      net: enic: Cure the enic api locking trainwreck · a53b59ec
      Thomas Gleixner authored
      enic_dev_wait() has a BUG_ON(in_interrupt()).
      
      Chasing the callers of enic_dev_wait() revealed the gems of enic_reset()
      and enic_tx_hang_reset() which are both invoked through work queues in
      order to be able to call rtnl_lock(). So far so good.
      
      After locking rtnl both functions acquire enic::enic_api_lock which
      serializes against the (ab)use from infiniband. This is where the
      trainwreck starts.
      
      enic::enic_api_lock is a spin_lock() which implicitly disables preemption,
      but both functions invoke a ton of functions under that lock which can
      sleep. The BUG_ON(in_interrupt()) does not trigger in that case because it
      can't detect the preempt disabled condition.
      
      This clearly has never been tested with any of the mandatory debug options
      for 7+ years, which would have caught that for sure.
      
      Cure it by adding a enic_api_busy member to struct enic, which is modified
      and evaluated with enic::enic_api_lock held.
      
      If enic_api_devcmd_proxy_by_index() observes enic::enic_api_busy as true,
      it drops enic::enic_api_lock and busy waits for enic::enic_api_busy to
      become false.
      
      It would be smarter to wait for a completion of that busy period, but
      enic_api_devcmd_proxy_by_index() is called with other spin locks held which
      obviously can't sleep.
      
      Remove the BUG_ON(in_interrupt()) check as well because it's incomplete and
      with proper debugging enabled the problem would have been caught from the
      debug checks in schedule_timeout().
      
      Fixes: 0b038566 ("drivers/net: enic: Add an interface for USNIC to interact with firmware")
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a53b59ec
    • Jacob Keller's avatar
      devlink: include <linux/const.h> for _BITUL · 2ec13cbc
      Jacob Keller authored
      Commit 5d5b4128 ("devlink: introduce flash update overwrite mask")
      added a usage of _BITUL to the UAPI <linux/devlink.h> header, but failed
      to include the header file where it was defined. It happens that this
      does not break any existing kernel include chains because it gets
      included through other sources. However, when including the UAPI headers
      in a userspace application (such as devlink in iproute2), _BITUL is not
      defined.
      
      Fixes: 5d5b4128 ("devlink: introduce flash update overwrite mask")
      Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2ec13cbc
    • David S. Miller's avatar
      Merge branch 'cxgb4-ch_ktls-updates-in-net-next' · 902c2a31
      David S. Miller authored
      Rohit Maheshwari says:
      
      ====================
      cxgb4/ch_ktls: updates in net-next
      
      This series of patches improves connections setup and statistics.
      
      This series is broken down as follows:
      
      Patch 1 fixes the handling of connection setup failure in HW. Driver
      shouldn't return success to tls_dev_add, until HW returns success.
      
      Patch 2 avoids the log flood.
      
      Patch 3 adds ktls statistics at port level.
      
      v1->v2:
      - removed conn_up from all places.
      
      v2->v3:
      - Corrected timeout handling.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      902c2a31
    • Rohit Maheshwari's avatar
      cxgb4/ch_ktls: ktls stats are added at port level · 3427e13e
      Rohit Maheshwari authored
      All the ktls stats were at adapter level, but now changing it
      to port level.
      
      Fixes: 62370a4f ("cxgb4/chcr: Add ipv6 support and statistics")
      Signed-off-by: default avatarRohit Maheshwari <rohitm@chelsio.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3427e13e