LCOV - code coverage report
Current view: top level - kernel - softirq.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 111 204 54.4 %
Date: 2023-03-27 20:00:47 Functions: 17 34 50.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  *      linux/kernel/softirq.c
       4             :  *
       5             :  *      Copyright (C) 1992 Linus Torvalds
       6             :  *
       7             :  *      Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
       8             :  */
       9             : 
      10             : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      11             : 
      12             : #include <linux/export.h>
      13             : #include <linux/kernel_stat.h>
      14             : #include <linux/interrupt.h>
      15             : #include <linux/init.h>
      16             : #include <linux/local_lock.h>
      17             : #include <linux/mm.h>
      18             : #include <linux/notifier.h>
      19             : #include <linux/percpu.h>
      20             : #include <linux/cpu.h>
      21             : #include <linux/freezer.h>
      22             : #include <linux/kthread.h>
      23             : #include <linux/rcupdate.h>
      24             : #include <linux/ftrace.h>
      25             : #include <linux/smp.h>
      26             : #include <linux/smpboot.h>
      27             : #include <linux/tick.h>
      28             : #include <linux/irq.h>
      29             : #include <linux/wait_bit.h>
      30             : 
      31             : #include <asm/softirq_stack.h>
      32             : 
      33             : #define CREATE_TRACE_POINTS
      34             : #include <trace/events/irq.h>
      35             : 
      36             : /*
      37             :    - No shared variables, all the data are CPU local.
      38             :    - If a softirq needs serialization, let it serialize itself
      39             :      by its own spinlocks.
      40             :    - Even if softirq is serialized, only local cpu is marked for
      41             :      execution. Hence, we get something sort of weak cpu binding.
      42             :      Though it is still not clear, will it result in better locality
      43             :      or will not.
      44             : 
      45             :    Examples:
      46             :    - NET RX softirq. It is multithreaded and does not require
      47             :      any global serialization.
      48             :    - NET TX softirq. It kicks software netdevice queues, hence
      49             :      it is logically serialized per device, but this serialization
      50             :      is invisible to common code.
      51             :    - Tasklets: serialized wrt itself.
      52             :  */
      53             : 
      54             : #ifndef __ARCH_IRQ_STAT
      55             : DEFINE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat);
      56             : EXPORT_PER_CPU_SYMBOL(irq_stat);
      57             : #endif
      58             : 
      59             : static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
      60             : 
      61             : DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
      62             : 
      63             : const char * const softirq_to_name[NR_SOFTIRQS] = {
      64             :         "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL",
      65             :         "TASKLET", "SCHED", "HRTIMER", "RCU"
      66             : };
      67             : 
      68             : /*
      69             :  * we cannot loop indefinitely here to avoid userspace starvation,
      70             :  * but we also don't want to introduce a worst case 1/HZ latency
      71             :  * to the pending events, so lets the scheduler to balance
      72             :  * the softirq load for us.
      73             :  */
      74             : static void wakeup_softirqd(void)
      75             : {
      76             :         /* Interrupts are disabled: no need to stop preemption */
      77         666 :         struct task_struct *tsk = __this_cpu_read(ksoftirqd);
      78             : 
      79         666 :         if (tsk)
      80         666 :                 wake_up_process(tsk);
      81             : }
      82             : 
      83             : /*
      84             :  * If ksoftirqd is scheduled, we do not want to process pending softirqs
      85             :  * right now. Let ksoftirqd handle this at its own rate, to get fairness,
      86             :  * unless we're doing some of the synchronous softirqs.
      87             :  */
      88             : #define SOFTIRQ_NOW_MASK ((1 << HI_SOFTIRQ) | (1 << TASKLET_SOFTIRQ))
      89          88 : static bool ksoftirqd_running(unsigned long pending)
      90             : {
      91          88 :         struct task_struct *tsk = __this_cpu_read(ksoftirqd);
      92             : 
      93          88 :         if (pending & SOFTIRQ_NOW_MASK)
      94             :                 return false;
      95          88 :         return tsk && task_is_running(tsk) && !__kthread_should_park(tsk);
      96             : }
      97             : 
      98             : #ifdef CONFIG_TRACE_IRQFLAGS
      99             : DEFINE_PER_CPU(int, hardirqs_enabled);
     100             : DEFINE_PER_CPU(int, hardirq_context);
     101             : EXPORT_PER_CPU_SYMBOL_GPL(hardirqs_enabled);
     102             : EXPORT_PER_CPU_SYMBOL_GPL(hardirq_context);
     103             : #endif
     104             : 
     105             : /*
     106             :  * SOFTIRQ_OFFSET usage:
     107             :  *
     108             :  * On !RT kernels 'count' is the preempt counter, on RT kernels this applies
     109             :  * to a per CPU counter and to task::softirqs_disabled_cnt.
     110             :  *
     111             :  * - count is changed by SOFTIRQ_OFFSET on entering or leaving softirq
     112             :  *   processing.
     113             :  *
     114             :  * - count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET)
     115             :  *   on local_bh_disable or local_bh_enable.
     116             :  *
     117             :  * This lets us distinguish between whether we are currently processing
     118             :  * softirq and whether we just have bh disabled.
     119             :  */
     120             : #ifdef CONFIG_PREEMPT_RT
     121             : 
     122             : /*
     123             :  * RT accounts for BH disabled sections in task::softirqs_disabled_cnt and
     124             :  * also in per CPU softirq_ctrl::cnt. This is necessary to allow tasks in a
     125             :  * softirq disabled section to be preempted.
     126             :  *
     127             :  * The per task counter is used for softirq_count(), in_softirq() and
     128             :  * in_serving_softirqs() because these counts are only valid when the task
     129             :  * holding softirq_ctrl::lock is running.
     130             :  *
     131             :  * The per CPU counter prevents pointless wakeups of ksoftirqd in case that
     132             :  * the task which is in a softirq disabled section is preempted or blocks.
     133             :  */
     134             : struct softirq_ctrl {
     135             :         local_lock_t    lock;
     136             :         int             cnt;
     137             : };
     138             : 
     139             : static DEFINE_PER_CPU(struct softirq_ctrl, softirq_ctrl) = {
     140             :         .lock   = INIT_LOCAL_LOCK(softirq_ctrl.lock),
     141             : };
     142             : 
     143             : /**
     144             :  * local_bh_blocked() - Check for idle whether BH processing is blocked
     145             :  *
     146             :  * Returns false if the per CPU softirq::cnt is 0 otherwise true.
     147             :  *
     148             :  * This is invoked from the idle task to guard against false positive
     149             :  * softirq pending warnings, which would happen when the task which holds
     150             :  * softirq_ctrl::lock was the only running task on the CPU and blocks on
     151             :  * some other lock.
     152             :  */
     153             : bool local_bh_blocked(void)
     154             : {
     155             :         return __this_cpu_read(softirq_ctrl.cnt) != 0;
     156             : }
     157             : 
     158             : void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
     159             : {
     160             :         unsigned long flags;
     161             :         int newcnt;
     162             : 
     163             :         WARN_ON_ONCE(in_hardirq());
     164             : 
     165             :         /* First entry of a task into a BH disabled section? */
     166             :         if (!current->softirq_disable_cnt) {
     167             :                 if (preemptible()) {
     168             :                         local_lock(&softirq_ctrl.lock);
     169             :                         /* Required to meet the RCU bottomhalf requirements. */
     170             :                         rcu_read_lock();
     171             :                 } else {
     172             :                         DEBUG_LOCKS_WARN_ON(this_cpu_read(softirq_ctrl.cnt));
     173             :                 }
     174             :         }
     175             : 
     176             :         /*
     177             :          * Track the per CPU softirq disabled state. On RT this is per CPU
     178             :          * state to allow preemption of bottom half disabled sections.
     179             :          */
     180             :         newcnt = __this_cpu_add_return(softirq_ctrl.cnt, cnt);
     181             :         /*
     182             :          * Reflect the result in the task state to prevent recursion on the
     183             :          * local lock and to make softirq_count() & al work.
     184             :          */
     185             :         current->softirq_disable_cnt = newcnt;
     186             : 
     187             :         if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && newcnt == cnt) {
     188             :                 raw_local_irq_save(flags);
     189             :                 lockdep_softirqs_off(ip);
     190             :                 raw_local_irq_restore(flags);
     191             :         }
     192             : }
     193             : EXPORT_SYMBOL(__local_bh_disable_ip);
     194             : 
     195             : static void __local_bh_enable(unsigned int cnt, bool unlock)
     196             : {
     197             :         unsigned long flags;
     198             :         int newcnt;
     199             : 
     200             :         DEBUG_LOCKS_WARN_ON(current->softirq_disable_cnt !=
     201             :                             this_cpu_read(softirq_ctrl.cnt));
     202             : 
     203             :         if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && softirq_count() == cnt) {
     204             :                 raw_local_irq_save(flags);
     205             :                 lockdep_softirqs_on(_RET_IP_);
     206             :                 raw_local_irq_restore(flags);
     207             :         }
     208             : 
     209             :         newcnt = __this_cpu_sub_return(softirq_ctrl.cnt, cnt);
     210             :         current->softirq_disable_cnt = newcnt;
     211             : 
     212             :         if (!newcnt && unlock) {
     213             :                 rcu_read_unlock();
     214             :                 local_unlock(&softirq_ctrl.lock);
     215             :         }
     216             : }
     217             : 
     218             : void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
     219             : {
     220             :         bool preempt_on = preemptible();
     221             :         unsigned long flags;
     222             :         u32 pending;
     223             :         int curcnt;
     224             : 
     225             :         WARN_ON_ONCE(in_hardirq());
     226             :         lockdep_assert_irqs_enabled();
     227             : 
     228             :         local_irq_save(flags);
     229             :         curcnt = __this_cpu_read(softirq_ctrl.cnt);
     230             : 
     231             :         /*
     232             :          * If this is not reenabling soft interrupts, no point in trying to
     233             :          * run pending ones.
     234             :          */
     235             :         if (curcnt != cnt)
     236             :                 goto out;
     237             : 
     238             :         pending = local_softirq_pending();
     239             :         if (!pending || ksoftirqd_running(pending))
     240             :                 goto out;
     241             : 
     242             :         /*
     243             :          * If this was called from non preemptible context, wake up the
     244             :          * softirq daemon.
     245             :          */
     246             :         if (!preempt_on) {
     247             :                 wakeup_softirqd();
     248             :                 goto out;
     249             :         }
     250             : 
     251             :         /*
     252             :          * Adjust softirq count to SOFTIRQ_OFFSET which makes
     253             :          * in_serving_softirq() become true.
     254             :          */
     255             :         cnt = SOFTIRQ_OFFSET;
     256             :         __local_bh_enable(cnt, false);
     257             :         __do_softirq();
     258             : 
     259             : out:
     260             :         __local_bh_enable(cnt, preempt_on);
     261             :         local_irq_restore(flags);
     262             : }
     263             : EXPORT_SYMBOL(__local_bh_enable_ip);
     264             : 
     265             : /*
     266             :  * Invoked from ksoftirqd_run() outside of the interrupt disabled section
     267             :  * to acquire the per CPU local lock for reentrancy protection.
     268             :  */
     269             : static inline void ksoftirqd_run_begin(void)
     270             : {
     271             :         __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
     272             :         local_irq_disable();
     273             : }
     274             : 
     275             : /* Counterpart to ksoftirqd_run_begin() */
     276             : static inline void ksoftirqd_run_end(void)
     277             : {
     278             :         __local_bh_enable(SOFTIRQ_OFFSET, true);
     279             :         WARN_ON_ONCE(in_interrupt());
     280             :         local_irq_enable();
     281             : }
     282             : 
     283             : static inline void softirq_handle_begin(void) { }
     284             : static inline void softirq_handle_end(void) { }
     285             : 
     286             : static inline bool should_wake_ksoftirqd(void)
     287             : {
     288             :         return !this_cpu_read(softirq_ctrl.cnt);
     289             : }
     290             : 
     291             : static inline void invoke_softirq(void)
     292             : {
     293             :         if (should_wake_ksoftirqd())
     294             :                 wakeup_softirqd();
     295             : }
     296             : 
     297             : /*
     298             :  * flush_smp_call_function_queue() can raise a soft interrupt in a function
     299             :  * call. On RT kernels this is undesired and the only known functionality
     300             :  * in the block layer which does this is disabled on RT. If soft interrupts
     301             :  * get raised which haven't been raised before the flush, warn so it can be
     302             :  * investigated.
     303             :  */
     304             : void do_softirq_post_smp_call_flush(unsigned int was_pending)
     305             : {
     306             :         if (WARN_ON_ONCE(was_pending != local_softirq_pending()))
     307             :                 invoke_softirq();
     308             : }
     309             : 
     310             : #else /* CONFIG_PREEMPT_RT */
     311             : 
     312             : /*
     313             :  * This one is for softirq.c-internal use, where hardirqs are disabled
     314             :  * legitimately:
     315             :  */
     316             : #ifdef CONFIG_TRACE_IRQFLAGS
     317             : void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
     318             : {
     319             :         unsigned long flags;
     320             : 
     321             :         WARN_ON_ONCE(in_hardirq());
     322             : 
     323             :         raw_local_irq_save(flags);
     324             :         /*
     325             :          * The preempt tracer hooks into preempt_count_add and will break
     326             :          * lockdep because it calls back into lockdep after SOFTIRQ_OFFSET
     327             :          * is set and before current->softirq_enabled is cleared.
     328             :          * We must manually increment preempt_count here and manually
     329             :          * call the trace_preempt_off later.
     330             :          */
     331             :         __preempt_count_add(cnt);
     332             :         /*
     333             :          * Were softirqs turned off above:
     334             :          */
     335             :         if (softirq_count() == (cnt & SOFTIRQ_MASK))
     336             :                 lockdep_softirqs_off(ip);
     337             :         raw_local_irq_restore(flags);
     338             : 
     339             :         if (preempt_count() == cnt) {
     340             : #ifdef CONFIG_DEBUG_PREEMPT
     341             :                 current->preempt_disable_ip = get_lock_parent_ip();
     342             : #endif
     343             :                 trace_preempt_off(CALLER_ADDR0, get_lock_parent_ip());
     344             :         }
     345             : }
     346             : EXPORT_SYMBOL(__local_bh_disable_ip);
     347             : #endif /* CONFIG_TRACE_IRQFLAGS */
     348             : 
     349             : static void __local_bh_enable(unsigned int cnt)
     350             : {
     351             :         lockdep_assert_irqs_disabled();
     352             : 
     353             :         if (preempt_count() == cnt)
     354             :                 trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip());
     355             : 
     356         429 :         if (softirq_count() == (cnt & SOFTIRQ_MASK))
     357         429 :                 lockdep_softirqs_on(_RET_IP_);
     358             : 
     359         858 :         __preempt_count_sub(cnt);
     360             : }
     361             : 
     362             : /*
     363             :  * Special-case - softirqs can safely be enabled by __do_softirq(),
     364             :  * without processing still-pending softirqs:
     365             :  */
     366           0 : void _local_bh_enable(void)
     367             : {
     368           0 :         WARN_ON_ONCE(in_hardirq());
     369           0 :         __local_bh_enable(SOFTIRQ_DISABLE_OFFSET);
     370           0 : }
     371             : EXPORT_SYMBOL(_local_bh_enable);
     372             : 
     373        1666 : void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
     374             : {
     375        1666 :         WARN_ON_ONCE(in_hardirq());
     376             :         lockdep_assert_irqs_enabled();
     377             : #ifdef CONFIG_TRACE_IRQFLAGS
     378             :         local_irq_disable();
     379             : #endif
     380             :         /*
     381             :          * Are softirqs going to be turned on now:
     382             :          */
     383             :         if (softirq_count() == SOFTIRQ_DISABLE_OFFSET)
     384             :                 lockdep_softirqs_on(ip);
     385             :         /*
     386             :          * Keep preemption disabled until we are done with
     387             :          * softirq processing:
     388             :          */
     389        3332 :         __preempt_count_sub(cnt - 1);
     390             : 
     391        1666 :         if (unlikely(!in_interrupt() && local_softirq_pending())) {
     392             :                 /*
     393             :                  * Run softirq if any pending. And do it in its own stack
     394             :                  * as we may be calling this deep in a task call stack already.
     395             :                  */
     396           0 :                 do_softirq();
     397             :         }
     398             : 
     399        1666 :         preempt_count_dec();
     400             : #ifdef CONFIG_TRACE_IRQFLAGS
     401             :         local_irq_enable();
     402             : #endif
     403             :         preempt_check_resched();
     404        1666 : }
     405             : EXPORT_SYMBOL(__local_bh_enable_ip);
     406             : 
     407             : static inline void softirq_handle_begin(void)
     408             : {
     409         858 :         __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
     410             : }
     411             : 
     412         429 : static inline void softirq_handle_end(void)
     413             : {
     414         429 :         __local_bh_enable(SOFTIRQ_OFFSET);
     415         429 :         WARN_ON_ONCE(in_interrupt());
     416         429 : }
     417             : 
     418             : static inline void ksoftirqd_run_begin(void)
     419             : {
     420             :         local_irq_disable();
     421             : }
     422             : 
     423             : static inline void ksoftirqd_run_end(void)
     424             : {
     425             :         local_irq_enable();
     426             : }
     427             : 
     428             : static inline bool should_wake_ksoftirqd(void)
     429             : {
     430             :         return true;
     431             : }
     432             : 
     433          88 : static inline void invoke_softirq(void)
     434             : {
     435          88 :         if (ksoftirqd_running(local_softirq_pending()))
     436             :                 return;
     437             : 
     438             :         if (!force_irqthreads() || !__this_cpu_read(ksoftirqd)) {
     439             : #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
     440             :                 /*
     441             :                  * We can safely execute softirq on the current stack if
     442             :                  * it is the irq stack, because it should be near empty
     443             :                  * at this stage.
     444             :                  */
     445             :                 __do_softirq();
     446             : #else
     447             :                 /*
     448             :                  * Otherwise, irq_exit() is called on the task stack that can
     449             :                  * be potentially deep already. So call softirq in its own stack
     450             :                  * to prevent from any overrun.
     451             :                  */
     452             :                 do_softirq_own_stack();
     453             : #endif
     454             :         } else {
     455             :                 wakeup_softirqd();
     456             :         }
     457             : }
     458             : 
     459           0 : asmlinkage __visible void do_softirq(void)
     460             : {
     461             :         __u32 pending;
     462             :         unsigned long flags;
     463             : 
     464           0 :         if (in_interrupt())
     465             :                 return;
     466             : 
     467           0 :         local_irq_save(flags);
     468             : 
     469           0 :         pending = local_softirq_pending();
     470             : 
     471           0 :         if (pending && !ksoftirqd_running(pending))
     472             :                 do_softirq_own_stack();
     473             : 
     474           0 :         local_irq_restore(flags);
     475             : }
     476             : 
     477             : #endif /* !CONFIG_PREEMPT_RT */
     478             : 
     479             : /*
     480             :  * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times,
     481             :  * but break the loop if need_resched() is set or after 2 ms.
     482             :  * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in
     483             :  * certain cases, such as stop_machine(), jiffies may cease to
     484             :  * increment and so we need the MAX_SOFTIRQ_RESTART limit as
     485             :  * well to make sure we eventually return from this method.
     486             :  *
     487             :  * These limits have been established via experimentation.
     488             :  * The two things to balance is latency against fairness -
     489             :  * we want to handle softirqs as soon as possible, but they
     490             :  * should not be able to lock up the box.
     491             :  */
     492             : #define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
     493             : #define MAX_SOFTIRQ_RESTART 10
     494             : 
     495             : #ifdef CONFIG_TRACE_IRQFLAGS
     496             : /*
     497             :  * When we run softirqs from irq_exit() and thus on the hardirq stack we need
     498             :  * to keep the lockdep irq context tracking as tight as possible in order to
     499             :  * not miss-qualify lock contexts and miss possible deadlocks.
     500             :  */
     501             : 
     502             : static inline bool lockdep_softirq_start(void)
     503             : {
     504             :         bool in_hardirq = false;
     505             : 
     506             :         if (lockdep_hardirq_context()) {
     507             :                 in_hardirq = true;
     508             :                 lockdep_hardirq_exit();
     509             :         }
     510             : 
     511             :         lockdep_softirq_enter();
     512             : 
     513             :         return in_hardirq;
     514             : }
     515             : 
     516             : static inline void lockdep_softirq_end(bool in_hardirq)
     517             : {
     518             :         lockdep_softirq_exit();
     519             : 
     520             :         if (in_hardirq)
     521             :                 lockdep_hardirq_enter();
     522             : }
     523             : #else
     524             : static inline bool lockdep_softirq_start(void) { return false; }
     525             : static inline void lockdep_softirq_end(bool in_hardirq) { }
     526             : #endif
     527             : 
     528         429 : asmlinkage __visible void __softirq_entry __do_softirq(void)
     529             : {
     530         429 :         unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
     531         429 :         unsigned long old_flags = current->flags;
     532         429 :         int max_restart = MAX_SOFTIRQ_RESTART;
     533             :         struct softirq_action *h;
     534             :         bool in_hardirq;
     535             :         __u32 pending;
     536             :         int softirq_bit;
     537             : 
     538             :         /*
     539             :          * Mask out PF_MEMALLOC as the current task context is borrowed for the
     540             :          * softirq. A softirq handled, such as network RX, might set PF_MEMALLOC
     541             :          * again if the socket is related to swapping.
     542             :          */
     543         429 :         current->flags &= ~PF_MEMALLOC;
     544             : 
     545         429 :         pending = local_softirq_pending();
     546             : 
     547         429 :         softirq_handle_begin();
     548         429 :         in_hardirq = lockdep_softirq_start();
     549         429 :         account_softirq_enter(current);
     550             : 
     551             : restart:
     552             :         /* Reset the pending bitmask before enabling irqs */
     553         754 :         set_softirq_pending(0);
     554             : 
     555             :         local_irq_enable();
     556             : 
     557         754 :         h = softirq_vec;
     558             : 
     559        3770 :         while ((softirq_bit = ffs(pending))) {
     560             :                 unsigned int vec_nr;
     561             :                 int prev_count;
     562             : 
     563         754 :                 h += softirq_bit - 1;
     564             : 
     565         754 :                 vec_nr = h - softirq_vec;
     566         754 :                 prev_count = preempt_count();
     567             : 
     568         754 :                 kstat_incr_softirqs_this_cpu(vec_nr);
     569             : 
     570         754 :                 trace_softirq_entry(vec_nr);
     571         754 :                 h->action(h);
     572         754 :                 trace_softirq_exit(vec_nr);
     573         754 :                 if (unlikely(prev_count != preempt_count())) {
     574           0 :                         pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
     575             :                                vec_nr, softirq_to_name[vec_nr], h->action,
     576             :                                prev_count, preempt_count());
     577             :                         preempt_count_set(prev_count);
     578             :                 }
     579         754 :                 h++;
     580         754 :                 pending >>= softirq_bit;
     581             :         }
     582             : 
     583         754 :         if (!IS_ENABLED(CONFIG_PREEMPT_RT) &&
     584        1508 :             __this_cpu_read(ksoftirqd) == current)
     585             :                 rcu_softirq_qs();
     586             : 
     587         754 :         local_irq_disable();
     588             : 
     589         754 :         pending = local_softirq_pending();
     590         754 :         if (pending) {
     591         650 :                 if (time_before(jiffies, end) && !need_resched() &&
     592             :                     --max_restart)
     593             :                         goto restart;
     594             : 
     595             :                 wakeup_softirqd();
     596             :         }
     597             : 
     598         429 :         account_softirq_exit(current);
     599         429 :         lockdep_softirq_end(in_hardirq);
     600         429 :         softirq_handle_end();
     601         429 :         current_restore_flags(old_flags, PF_MEMALLOC);
     602         429 : }
     603             : 
     604             : /**
     605             :  * irq_enter_rcu - Enter an interrupt context with RCU watching
     606             :  */
     607        2723 : void irq_enter_rcu(void)
     608             : {
     609        2723 :         __irq_enter_raw();
     610             : 
     611        5446 :         if (tick_nohz_full_cpu(smp_processor_id()) ||
     612        5446 :             (is_idle_task(current) && (irq_count() == HARDIRQ_OFFSET)))
     613             :                 tick_irq_enter();
     614             : 
     615        2723 :         account_hardirq_enter(current);
     616        2723 : }
     617             : 
     618             : /**
     619             :  * irq_enter - Enter an interrupt context including RCU update
     620             :  */
     621        2723 : void irq_enter(void)
     622             : {
     623             :         ct_irq_enter();
     624        2723 :         irq_enter_rcu();
     625        2723 : }
     626             : 
     627             : static inline void tick_irq_exit(void)
     628             : {
     629             : #ifdef CONFIG_NO_HZ_COMMON
     630             :         int cpu = smp_processor_id();
     631             : 
     632             :         /* Make sure that timer wheel updates are propagated */
     633             :         if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
     634             :                 if (!in_hardirq())
     635             :                         tick_nohz_irq_exit();
     636             :         }
     637             : #endif
     638             : }
     639             : 
     640        2723 : static inline void __irq_exit_rcu(void)
     641             : {
     642             : #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
     643             :         local_irq_disable();
     644             : #else
     645             :         lockdep_assert_irqs_disabled();
     646             : #endif
     647        5446 :         account_hardirq_exit(current);
     648        2723 :         preempt_count_sub(HARDIRQ_OFFSET);
     649        2723 :         if (!in_interrupt() && local_softirq_pending())
     650          88 :                 invoke_softirq();
     651             : 
     652             :         tick_irq_exit();
     653        2723 : }
     654             : 
     655             : /**
     656             :  * irq_exit_rcu() - Exit an interrupt context without updating RCU
     657             :  *
     658             :  * Also processes softirqs if needed and possible.
     659             :  */
     660           0 : void irq_exit_rcu(void)
     661             : {
     662           0 :         __irq_exit_rcu();
     663             :          /* must be last! */
     664             :         lockdep_hardirq_exit();
     665           0 : }
     666             : 
     667             : /**
     668             :  * irq_exit - Exit an interrupt context, update RCU and lockdep
     669             :  *
     670             :  * Also processes softirqs if needed and possible.
     671             :  */
     672        2723 : void irq_exit(void)
     673             : {
     674        2723 :         __irq_exit_rcu();
     675             :         ct_irq_exit();
     676             :          /* must be last! */
     677             :         lockdep_hardirq_exit();
     678        2723 : }
     679             : 
     680             : /*
     681             :  * This function must run with irqs disabled!
     682             :  */
     683        1078 : inline void raise_softirq_irqoff(unsigned int nr)
     684             : {
     685        1078 :         __raise_softirq_irqoff(nr);
     686             : 
     687             :         /*
     688             :          * If we're in an interrupt or softirq, we're done
     689             :          * (this also catches softirq-disabled code). We will
     690             :          * actually run the softirq once we return from
     691             :          * the irq or softirq.
     692             :          *
     693             :          * Otherwise we wake up ksoftirqd to make sure we
     694             :          * schedule the softirq soon.
     695             :          */
     696        1078 :         if (!in_interrupt() && should_wake_ksoftirqd())
     697             :                 wakeup_softirqd();
     698        1078 : }
     699             : 
     700          87 : void raise_softirq(unsigned int nr)
     701             : {
     702             :         unsigned long flags;
     703             : 
     704          87 :         local_irq_save(flags);
     705          87 :         raise_softirq_irqoff(nr);
     706         174 :         local_irq_restore(flags);
     707          87 : }
     708             : 
     709           0 : void __raise_softirq_irqoff(unsigned int nr)
     710             : {
     711             :         lockdep_assert_irqs_disabled();
     712        1078 :         trace_softirq_raise(nr);
     713        1078 :         or_softirq_pending(1UL << nr);
     714           0 : }
     715             : 
     716           4 : void open_softirq(int nr, void (*action)(struct softirq_action *))
     717             : {
     718           6 :         softirq_vec[nr].action = action;
     719           4 : }
     720             : 
     721             : /*
     722             :  * Tasklets
     723             :  */
     724             : struct tasklet_head {
     725             :         struct tasklet_struct *head;
     726             :         struct tasklet_struct **tail;
     727             : };
     728             : 
     729             : static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
     730             : static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
     731             : 
     732           0 : static void __tasklet_schedule_common(struct tasklet_struct *t,
     733             :                                       struct tasklet_head __percpu *headp,
     734             :                                       unsigned int softirq_nr)
     735             : {
     736             :         struct tasklet_head *head;
     737             :         unsigned long flags;
     738             : 
     739           0 :         local_irq_save(flags);
     740           0 :         head = this_cpu_ptr(headp);
     741           0 :         t->next = NULL;
     742           0 :         *head->tail = t;
     743           0 :         head->tail = &(t->next);
     744           0 :         raise_softirq_irqoff(softirq_nr);
     745           0 :         local_irq_restore(flags);
     746           0 : }
     747             : 
     748           0 : void __tasklet_schedule(struct tasklet_struct *t)
     749             : {
     750           0 :         __tasklet_schedule_common(t, &tasklet_vec,
     751             :                                   TASKLET_SOFTIRQ);
     752           0 : }
     753             : EXPORT_SYMBOL(__tasklet_schedule);
     754             : 
     755           0 : void __tasklet_hi_schedule(struct tasklet_struct *t)
     756             : {
     757           0 :         __tasklet_schedule_common(t, &tasklet_hi_vec,
     758             :                                   HI_SOFTIRQ);
     759           0 : }
     760             : EXPORT_SYMBOL(__tasklet_hi_schedule);
     761             : 
     762           0 : static bool tasklet_clear_sched(struct tasklet_struct *t)
     763             : {
     764           0 :         if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) {
     765           0 :                 wake_up_var(&t->state);
     766           0 :                 return true;
     767             :         }
     768             : 
     769           0 :         WARN_ONCE(1, "tasklet SCHED state not set: %s %pS\n",
     770             :                   t->use_callback ? "callback" : "func",
     771             :                   t->use_callback ? (void *)t->callback : (void *)t->func);
     772             : 
     773             :         return false;
     774             : }
     775             : 
     776           0 : static void tasklet_action_common(struct softirq_action *a,
     777             :                                   struct tasklet_head *tl_head,
     778             :                                   unsigned int softirq_nr)
     779             : {
     780             :         struct tasklet_struct *list;
     781             : 
     782             :         local_irq_disable();
     783           0 :         list = tl_head->head;
     784           0 :         tl_head->head = NULL;
     785           0 :         tl_head->tail = &tl_head->head;
     786             :         local_irq_enable();
     787             : 
     788           0 :         while (list) {
     789           0 :                 struct tasklet_struct *t = list;
     790             : 
     791           0 :                 list = list->next;
     792             : 
     793           0 :                 if (tasklet_trylock(t)) {
     794           0 :                         if (!atomic_read(&t->count)) {
     795           0 :                                 if (tasklet_clear_sched(t)) {
     796           0 :                                         if (t->use_callback)
     797           0 :                                                 t->callback(t);
     798             :                                         else
     799           0 :                                                 t->func(t->data);
     800             :                                 }
     801           0 :                                 tasklet_unlock(t);
     802           0 :                                 continue;
     803             :                         }
     804             :                         tasklet_unlock(t);
     805             :                 }
     806             : 
     807             :                 local_irq_disable();
     808           0 :                 t->next = NULL;
     809           0 :                 *tl_head->tail = t;
     810           0 :                 tl_head->tail = &t->next;
     811           0 :                 __raise_softirq_irqoff(softirq_nr);
     812             :                 local_irq_enable();
     813             :         }
     814           0 : }
     815             : 
     816           0 : static __latent_entropy void tasklet_action(struct softirq_action *a)
     817             : {
     818           0 :         tasklet_action_common(a, this_cpu_ptr(&tasklet_vec), TASKLET_SOFTIRQ);
     819           0 : }
     820             : 
     821           0 : static __latent_entropy void tasklet_hi_action(struct softirq_action *a)
     822             : {
     823           0 :         tasklet_action_common(a, this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ);
     824           0 : }
     825             : 
     826           0 : void tasklet_setup(struct tasklet_struct *t,
     827             :                    void (*callback)(struct tasklet_struct *))
     828             : {
     829           0 :         t->next = NULL;
     830           0 :         t->state = 0;
     831           0 :         atomic_set(&t->count, 0);
     832           0 :         t->callback = callback;
     833           0 :         t->use_callback = true;
     834           0 :         t->data = 0;
     835           0 : }
     836             : EXPORT_SYMBOL(tasklet_setup);
     837             : 
     838           0 : void tasklet_init(struct tasklet_struct *t,
     839             :                   void (*func)(unsigned long), unsigned long data)
     840             : {
     841           0 :         t->next = NULL;
     842           0 :         t->state = 0;
     843           0 :         atomic_set(&t->count, 0);
     844           0 :         t->func = func;
     845           0 :         t->use_callback = false;
     846           0 :         t->data = data;
     847           0 : }
     848             : EXPORT_SYMBOL(tasklet_init);
     849             : 
     850             : #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
     851             : /*
     852             :  * Do not use in new code. Waiting for tasklets from atomic contexts is
     853             :  * error prone and should be avoided.
     854             :  */
     855             : void tasklet_unlock_spin_wait(struct tasklet_struct *t)
     856             : {
     857             :         while (test_bit(TASKLET_STATE_RUN, &(t)->state)) {
     858             :                 if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
     859             :                         /*
     860             :                          * Prevent a live lock when current preempted soft
     861             :                          * interrupt processing or prevents ksoftirqd from
     862             :                          * running. If the tasklet runs on a different CPU
     863             :                          * then this has no effect other than doing the BH
     864             :                          * disable/enable dance for nothing.
     865             :                          */
     866             :                         local_bh_disable();
     867             :                         local_bh_enable();
     868             :                 } else {
     869             :                         cpu_relax();
     870             :                 }
     871             :         }
     872             : }
     873             : EXPORT_SYMBOL(tasklet_unlock_spin_wait);
     874             : #endif
     875             : 
     876           0 : void tasklet_kill(struct tasklet_struct *t)
     877             : {
     878           0 :         if (in_interrupt())
     879           0 :                 pr_notice("Attempt to kill tasklet from interrupt\n");
     880             : 
     881           0 :         while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
     882           0 :                 wait_var_event(&t->state, !test_bit(TASKLET_STATE_SCHED, &t->state));
     883             : 
     884           0 :         tasklet_unlock_wait(t);
     885           0 :         tasklet_clear_sched(t);
     886           0 : }
     887             : EXPORT_SYMBOL(tasklet_kill);
     888             : 
     889             : #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
     890             : void tasklet_unlock(struct tasklet_struct *t)
     891             : {
     892             :         smp_mb__before_atomic();
     893             :         clear_bit(TASKLET_STATE_RUN, &t->state);
     894             :         smp_mb__after_atomic();
     895             :         wake_up_var(&t->state);
     896             : }
     897             : EXPORT_SYMBOL_GPL(tasklet_unlock);
     898             : 
     899             : void tasklet_unlock_wait(struct tasklet_struct *t)
     900             : {
     901             :         wait_var_event(&t->state, !test_bit(TASKLET_STATE_RUN, &t->state));
     902             : }
     903             : EXPORT_SYMBOL_GPL(tasklet_unlock_wait);
     904             : #endif
     905             : 
     906           1 : void __init softirq_init(void)
     907             : {
     908             :         int cpu;
     909             : 
     910           2 :         for_each_possible_cpu(cpu) {
     911           2 :                 per_cpu(tasklet_vec, cpu).tail =
     912           1 :                         &per_cpu(tasklet_vec, cpu).head;
     913           2 :                 per_cpu(tasklet_hi_vec, cpu).tail =
     914           1 :                         &per_cpu(tasklet_hi_vec, cpu).head;
     915             :         }
     916             : 
     917           1 :         open_softirq(TASKLET_SOFTIRQ, tasklet_action);
     918           1 :         open_softirq(HI_SOFTIRQ, tasklet_hi_action);
     919           1 : }
     920             : 
     921         685 : static int ksoftirqd_should_run(unsigned int cpu)
     922             : {
     923         685 :         return local_softirq_pending();
     924             : }
     925             : 
     926         342 : static void run_ksoftirqd(unsigned int cpu)
     927             : {
     928         342 :         ksoftirqd_run_begin();
     929         342 :         if (local_softirq_pending()) {
     930             :                 /*
     931             :                  * We can safely run softirq on inline stack, as we are not deep
     932             :                  * in the task stack here.
     933             :                  */
     934         342 :                 __do_softirq();
     935             :                 ksoftirqd_run_end();
     936         342 :                 cond_resched();
     937         342 :                 return;
     938             :         }
     939             :         ksoftirqd_run_end();
     940             : }
     941             : 
     942             : #ifdef CONFIG_HOTPLUG_CPU
     943             : static int takeover_tasklets(unsigned int cpu)
     944             : {
     945             :         /* CPU is dead, so no lock needed. */
     946             :         local_irq_disable();
     947             : 
     948             :         /* Find end, append list for that CPU. */
     949             :         if (&per_cpu(tasklet_vec, cpu).head != per_cpu(tasklet_vec, cpu).tail) {
     950             :                 *__this_cpu_read(tasklet_vec.tail) = per_cpu(tasklet_vec, cpu).head;
     951             :                 __this_cpu_write(tasklet_vec.tail, per_cpu(tasklet_vec, cpu).tail);
     952             :                 per_cpu(tasklet_vec, cpu).head = NULL;
     953             :                 per_cpu(tasklet_vec, cpu).tail = &per_cpu(tasklet_vec, cpu).head;
     954             :         }
     955             :         raise_softirq_irqoff(TASKLET_SOFTIRQ);
     956             : 
     957             :         if (&per_cpu(tasklet_hi_vec, cpu).head != per_cpu(tasklet_hi_vec, cpu).tail) {
     958             :                 *__this_cpu_read(tasklet_hi_vec.tail) = per_cpu(tasklet_hi_vec, cpu).head;
     959             :                 __this_cpu_write(tasklet_hi_vec.tail, per_cpu(tasklet_hi_vec, cpu).tail);
     960             :                 per_cpu(tasklet_hi_vec, cpu).head = NULL;
     961             :                 per_cpu(tasklet_hi_vec, cpu).tail = &per_cpu(tasklet_hi_vec, cpu).head;
     962             :         }
     963             :         raise_softirq_irqoff(HI_SOFTIRQ);
     964             : 
     965             :         local_irq_enable();
     966             :         return 0;
     967             : }
     968             : #else
     969             : #define takeover_tasklets       NULL
     970             : #endif /* CONFIG_HOTPLUG_CPU */
     971             : 
     972             : static struct smp_hotplug_thread softirq_threads = {
     973             :         .store                  = &ksoftirqd,
     974             :         .thread_should_run      = ksoftirqd_should_run,
     975             :         .thread_fn              = run_ksoftirqd,
     976             :         .thread_comm            = "ksoftirqd/%u",
     977             : };
     978             : 
     979           1 : static __init int spawn_ksoftirqd(void)
     980             : {
     981           1 :         cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL,
     982             :                                   takeover_tasklets);
     983           1 :         BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
     984             : 
     985           1 :         return 0;
     986             : }
     987             : early_initcall(spawn_ksoftirqd);
     988             : 
     989             : /*
     990             :  * [ These __weak aliases are kept in a separate compilation unit, so that
     991             :  *   GCC does not inline them incorrectly. ]
     992             :  */
     993             : 
     994           0 : int __init __weak early_irq_init(void)
     995             : {
     996           0 :         return 0;
     997             : }
     998             : 
     999           0 : int __init __weak arch_probe_nr_irqs(void)
    1000             : {
    1001           0 :         return NR_IRQS_LEGACY;
    1002             : }
    1003             : 
    1004           1 : int __init __weak arch_early_irq_init(void)
    1005             : {
    1006           1 :         return 0;
    1007             : }
    1008             : 
    1009           0 : unsigned int __weak arch_dynirq_lower_bound(unsigned int from)
    1010             : {
    1011           0 :         return from;
    1012             : }

Generated by: LCOV version 1.14