LCOV - code coverage report
Current view: top level - kernel - softirq.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 97 202 48.0 %
Date: 2022-12-09 01:23:36 Functions: 14 34 41.2 %

          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         186 :         struct task_struct *tsk = __this_cpu_read(ksoftirqd);
      78             : 
      79         186 :         if (tsk)
      80         186 :                 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           0 : static bool ksoftirqd_running(unsigned long pending)
      90             : {
      91           0 :         struct task_struct *tsk = __this_cpu_read(ksoftirqd);
      92             : 
      93           0 :         if (pending & SOFTIRQ_NOW_MASK)
      94             :                 return false;
      95           0 :         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             : #else /* CONFIG_PREEMPT_RT */
     298             : 
     299             : /*
     300             :  * This one is for softirq.c-internal use, where hardirqs are disabled
     301             :  * legitimately:
     302             :  */
     303             : #ifdef CONFIG_TRACE_IRQFLAGS
     304             : void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
     305             : {
     306             :         unsigned long flags;
     307             : 
     308             :         WARN_ON_ONCE(in_hardirq());
     309             : 
     310             :         raw_local_irq_save(flags);
     311             :         /*
     312             :          * The preempt tracer hooks into preempt_count_add and will break
     313             :          * lockdep because it calls back into lockdep after SOFTIRQ_OFFSET
     314             :          * is set and before current->softirq_enabled is cleared.
     315             :          * We must manually increment preempt_count here and manually
     316             :          * call the trace_preempt_off later.
     317             :          */
     318             :         __preempt_count_add(cnt);
     319             :         /*
     320             :          * Were softirqs turned off above:
     321             :          */
     322             :         if (softirq_count() == (cnt & SOFTIRQ_MASK))
     323             :                 lockdep_softirqs_off(ip);
     324             :         raw_local_irq_restore(flags);
     325             : 
     326             :         if (preempt_count() == cnt) {
     327             : #ifdef CONFIG_DEBUG_PREEMPT
     328             :                 current->preempt_disable_ip = get_lock_parent_ip();
     329             : #endif
     330             :                 trace_preempt_off(CALLER_ADDR0, get_lock_parent_ip());
     331             :         }
     332             : }
     333             : EXPORT_SYMBOL(__local_bh_disable_ip);
     334             : #endif /* CONFIG_TRACE_IRQFLAGS */
     335             : 
     336             : static void __local_bh_enable(unsigned int cnt)
     337             : {
     338             :         lockdep_assert_irqs_disabled();
     339             : 
     340             :         if (preempt_count() == cnt)
     341             :                 trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip());
     342             : 
     343          93 :         if (softirq_count() == (cnt & SOFTIRQ_MASK))
     344          93 :                 lockdep_softirqs_on(_RET_IP_);
     345             : 
     346         186 :         __preempt_count_sub(cnt);
     347             : }
     348             : 
     349             : /*
     350             :  * Special-case - softirqs can safely be enabled by __do_softirq(),
     351             :  * without processing still-pending softirqs:
     352             :  */
     353           0 : void _local_bh_enable(void)
     354             : {
     355           0 :         WARN_ON_ONCE(in_hardirq());
     356           0 :         __local_bh_enable(SOFTIRQ_DISABLE_OFFSET);
     357           0 : }
     358             : EXPORT_SYMBOL(_local_bh_enable);
     359             : 
     360         456 : void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
     361             : {
     362         456 :         WARN_ON_ONCE(in_hardirq());
     363             :         lockdep_assert_irqs_enabled();
     364             : #ifdef CONFIG_TRACE_IRQFLAGS
     365             :         local_irq_disable();
     366             : #endif
     367             :         /*
     368             :          * Are softirqs going to be turned on now:
     369             :          */
     370             :         if (softirq_count() == SOFTIRQ_DISABLE_OFFSET)
     371             :                 lockdep_softirqs_on(ip);
     372             :         /*
     373             :          * Keep preemption disabled until we are done with
     374             :          * softirq processing:
     375             :          */
     376         912 :         __preempt_count_sub(cnt - 1);
     377             : 
     378         456 :         if (unlikely(!in_interrupt() && local_softirq_pending())) {
     379             :                 /*
     380             :                  * Run softirq if any pending. And do it in its own stack
     381             :                  * as we may be calling this deep in a task call stack already.
     382             :                  */
     383           0 :                 do_softirq();
     384             :         }
     385             : 
     386         456 :         preempt_count_dec();
     387             : #ifdef CONFIG_TRACE_IRQFLAGS
     388             :         local_irq_enable();
     389             : #endif
     390             :         preempt_check_resched();
     391         456 : }
     392             : EXPORT_SYMBOL(__local_bh_enable_ip);
     393             : 
     394             : static inline void softirq_handle_begin(void)
     395             : {
     396         186 :         __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
     397             : }
     398             : 
     399          93 : static inline void softirq_handle_end(void)
     400             : {
     401          93 :         __local_bh_enable(SOFTIRQ_OFFSET);
     402          93 :         WARN_ON_ONCE(in_interrupt());
     403          93 : }
     404             : 
     405             : static inline void ksoftirqd_run_begin(void)
     406             : {
     407             :         local_irq_disable();
     408             : }
     409             : 
     410             : static inline void ksoftirqd_run_end(void)
     411             : {
     412             :         local_irq_enable();
     413             : }
     414             : 
     415             : static inline bool should_wake_ksoftirqd(void)
     416             : {
     417             :         return true;
     418             : }
     419             : 
     420           0 : static inline void invoke_softirq(void)
     421             : {
     422           0 :         if (ksoftirqd_running(local_softirq_pending()))
     423             :                 return;
     424             : 
     425             :         if (!force_irqthreads() || !__this_cpu_read(ksoftirqd)) {
     426             : #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
     427             :                 /*
     428             :                  * We can safely execute softirq on the current stack if
     429             :                  * it is the irq stack, because it should be near empty
     430             :                  * at this stage.
     431             :                  */
     432             :                 __do_softirq();
     433             : #else
     434             :                 /*
     435             :                  * Otherwise, irq_exit() is called on the task stack that can
     436             :                  * be potentially deep already. So call softirq in its own stack
     437             :                  * to prevent from any overrun.
     438             :                  */
     439             :                 do_softirq_own_stack();
     440             : #endif
     441             :         } else {
     442             :                 wakeup_softirqd();
     443             :         }
     444             : }
     445             : 
     446           0 : asmlinkage __visible void do_softirq(void)
     447             : {
     448             :         __u32 pending;
     449             :         unsigned long flags;
     450             : 
     451           0 :         if (in_interrupt())
     452             :                 return;
     453             : 
     454           0 :         local_irq_save(flags);
     455             : 
     456           0 :         pending = local_softirq_pending();
     457             : 
     458           0 :         if (pending && !ksoftirqd_running(pending))
     459             :                 do_softirq_own_stack();
     460             : 
     461           0 :         local_irq_restore(flags);
     462             : }
     463             : 
     464             : #endif /* !CONFIG_PREEMPT_RT */
     465             : 
     466             : /*
     467             :  * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times,
     468             :  * but break the loop if need_resched() is set or after 2 ms.
     469             :  * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in
     470             :  * certain cases, such as stop_machine(), jiffies may cease to
     471             :  * increment and so we need the MAX_SOFTIRQ_RESTART limit as
     472             :  * well to make sure we eventually return from this method.
     473             :  *
     474             :  * These limits have been established via experimentation.
     475             :  * The two things to balance is latency against fairness -
     476             :  * we want to handle softirqs as soon as possible, but they
     477             :  * should not be able to lock up the box.
     478             :  */
     479             : #define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
     480             : #define MAX_SOFTIRQ_RESTART 10
     481             : 
     482             : #ifdef CONFIG_TRACE_IRQFLAGS
     483             : /*
     484             :  * When we run softirqs from irq_exit() and thus on the hardirq stack we need
     485             :  * to keep the lockdep irq context tracking as tight as possible in order to
     486             :  * not miss-qualify lock contexts and miss possible deadlocks.
     487             :  */
     488             : 
     489             : static inline bool lockdep_softirq_start(void)
     490             : {
     491             :         bool in_hardirq = false;
     492             : 
     493             :         if (lockdep_hardirq_context()) {
     494             :                 in_hardirq = true;
     495             :                 lockdep_hardirq_exit();
     496             :         }
     497             : 
     498             :         lockdep_softirq_enter();
     499             : 
     500             :         return in_hardirq;
     501             : }
     502             : 
     503             : static inline void lockdep_softirq_end(bool in_hardirq)
     504             : {
     505             :         lockdep_softirq_exit();
     506             : 
     507             :         if (in_hardirq)
     508             :                 lockdep_hardirq_enter();
     509             : }
     510             : #else
     511             : static inline bool lockdep_softirq_start(void) { return false; }
     512             : static inline void lockdep_softirq_end(bool in_hardirq) { }
     513             : #endif
     514             : 
     515          93 : asmlinkage __visible void __softirq_entry __do_softirq(void)
     516             : {
     517          93 :         unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
     518          93 :         unsigned long old_flags = current->flags;
     519          93 :         int max_restart = MAX_SOFTIRQ_RESTART;
     520             :         struct softirq_action *h;
     521             :         bool in_hardirq;
     522             :         __u32 pending;
     523             :         int softirq_bit;
     524             : 
     525             :         /*
     526             :          * Mask out PF_MEMALLOC as the current task context is borrowed for the
     527             :          * softirq. A softirq handled, such as network RX, might set PF_MEMALLOC
     528             :          * again if the socket is related to swapping.
     529             :          */
     530          93 :         current->flags &= ~PF_MEMALLOC;
     531             : 
     532          93 :         pending = local_softirq_pending();
     533             : 
     534          93 :         softirq_handle_begin();
     535          93 :         in_hardirq = lockdep_softirq_start();
     536          93 :         account_softirq_enter(current);
     537             : 
     538             : restart:
     539             :         /* Reset the pending bitmask before enabling irqs */
     540         185 :         set_softirq_pending(0);
     541             : 
     542             :         local_irq_enable();
     543             : 
     544         185 :         h = softirq_vec;
     545             : 
     546         925 :         while ((softirq_bit = ffs(pending))) {
     547             :                 unsigned int vec_nr;
     548             :                 int prev_count;
     549             : 
     550         185 :                 h += softirq_bit - 1;
     551             : 
     552         185 :                 vec_nr = h - softirq_vec;
     553         185 :                 prev_count = preempt_count();
     554             : 
     555         185 :                 kstat_incr_softirqs_this_cpu(vec_nr);
     556             : 
     557         185 :                 trace_softirq_entry(vec_nr);
     558         185 :                 h->action(h);
     559         185 :                 trace_softirq_exit(vec_nr);
     560         185 :                 if (unlikely(prev_count != preempt_count())) {
     561           0 :                         pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
     562             :                                vec_nr, softirq_to_name[vec_nr], h->action,
     563             :                                prev_count, preempt_count());
     564             :                         preempt_count_set(prev_count);
     565             :                 }
     566         185 :                 h++;
     567         185 :                 pending >>= softirq_bit;
     568             :         }
     569             : 
     570         185 :         if (!IS_ENABLED(CONFIG_PREEMPT_RT) &&
     571         370 :             __this_cpu_read(ksoftirqd) == current)
     572             :                 rcu_softirq_qs();
     573             : 
     574             :         local_irq_disable();
     575             : 
     576         185 :         pending = local_softirq_pending();
     577         185 :         if (pending) {
     578         184 :                 if (time_before(jiffies, end) && !need_resched() &&
     579             :                     --max_restart)
     580             :                         goto restart;
     581             : 
     582             :                 wakeup_softirqd();
     583             :         }
     584             : 
     585          93 :         account_softirq_exit(current);
     586          93 :         lockdep_softirq_end(in_hardirq);
     587          93 :         softirq_handle_end();
     588          93 :         current_restore_flags(old_flags, PF_MEMALLOC);
     589          93 : }
     590             : 
     591             : /**
     592             :  * irq_enter_rcu - Enter an interrupt context with RCU watching
     593             :  */
     594          13 : void irq_enter_rcu(void)
     595             : {
     596          13 :         __irq_enter_raw();
     597             : 
     598          26 :         if (tick_nohz_full_cpu(smp_processor_id()) ||
     599          26 :             (is_idle_task(current) && (irq_count() == HARDIRQ_OFFSET)))
     600             :                 tick_irq_enter();
     601             : 
     602          13 :         account_hardirq_enter(current);
     603          13 : }
     604             : 
     605             : /**
     606             :  * irq_enter - Enter an interrupt context including RCU update
     607             :  */
     608          13 : void irq_enter(void)
     609             : {
     610             :         rcu_irq_enter();
     611          13 :         irq_enter_rcu();
     612          13 : }
     613             : 
     614             : static inline void tick_irq_exit(void)
     615             : {
     616             : #ifdef CONFIG_NO_HZ_COMMON
     617             :         int cpu = smp_processor_id();
     618             : 
     619             :         /* Make sure that timer wheel updates are propagated */
     620             :         if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
     621             :                 if (!in_hardirq())
     622             :                         tick_nohz_irq_exit();
     623             :         }
     624             : #endif
     625             : }
     626             : 
     627          13 : static inline void __irq_exit_rcu(void)
     628             : {
     629             : #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
     630             :         local_irq_disable();
     631             : #else
     632             :         lockdep_assert_irqs_disabled();
     633             : #endif
     634          26 :         account_hardirq_exit(current);
     635          13 :         preempt_count_sub(HARDIRQ_OFFSET);
     636          13 :         if (!in_interrupt() && local_softirq_pending())
     637           0 :                 invoke_softirq();
     638             : 
     639             :         tick_irq_exit();
     640          13 : }
     641             : 
     642             : /**
     643             :  * irq_exit_rcu() - Exit an interrupt context without updating RCU
     644             :  *
     645             :  * Also processes softirqs if needed and possible.
     646             :  */
     647           0 : void irq_exit_rcu(void)
     648             : {
     649           0 :         __irq_exit_rcu();
     650             :          /* must be last! */
     651             :         lockdep_hardirq_exit();
     652           0 : }
     653             : 
     654             : /**
     655             :  * irq_exit - Exit an interrupt context, update RCU and lockdep
     656             :  *
     657             :  * Also processes softirqs if needed and possible.
     658             :  */
     659          13 : void irq_exit(void)
     660             : {
     661          13 :         __irq_exit_rcu();
     662             :         rcu_irq_exit();
     663             :          /* must be last! */
     664             :         lockdep_hardirq_exit();
     665          13 : }
     666             : 
     667             : /*
     668             :  * This function must run with irqs disabled!
     669             :  */
     670         278 : inline void raise_softirq_irqoff(unsigned int nr)
     671             : {
     672         278 :         __raise_softirq_irqoff(nr);
     673             : 
     674             :         /*
     675             :          * If we're in an interrupt or softirq, we're done
     676             :          * (this also catches softirq-disabled code). We will
     677             :          * actually run the softirq once we return from
     678             :          * the irq or softirq.
     679             :          *
     680             :          * Otherwise we wake up ksoftirqd to make sure we
     681             :          * schedule the softirq soon.
     682             :          */
     683         278 :         if (!in_interrupt() && should_wake_ksoftirqd())
     684             :                 wakeup_softirqd();
     685         278 : }
     686             : 
     687           0 : void raise_softirq(unsigned int nr)
     688             : {
     689             :         unsigned long flags;
     690             : 
     691           0 :         local_irq_save(flags);
     692           0 :         raise_softirq_irqoff(nr);
     693           0 :         local_irq_restore(flags);
     694           0 : }
     695             : 
     696           0 : void __raise_softirq_irqoff(unsigned int nr)
     697             : {
     698             :         lockdep_assert_irqs_disabled();
     699         278 :         trace_softirq_raise(nr);
     700         278 :         or_softirq_pending(1UL << nr);
     701           0 : }
     702             : 
     703           4 : void open_softirq(int nr, void (*action)(struct softirq_action *))
     704             : {
     705           6 :         softirq_vec[nr].action = action;
     706           4 : }
     707             : 
     708             : /*
     709             :  * Tasklets
     710             :  */
     711             : struct tasklet_head {
     712             :         struct tasklet_struct *head;
     713             :         struct tasklet_struct **tail;
     714             : };
     715             : 
     716             : static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
     717             : static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
     718             : 
     719           0 : static void __tasklet_schedule_common(struct tasklet_struct *t,
     720             :                                       struct tasklet_head __percpu *headp,
     721             :                                       unsigned int softirq_nr)
     722             : {
     723             :         struct tasklet_head *head;
     724             :         unsigned long flags;
     725             : 
     726           0 :         local_irq_save(flags);
     727           0 :         head = this_cpu_ptr(headp);
     728           0 :         t->next = NULL;
     729           0 :         *head->tail = t;
     730           0 :         head->tail = &(t->next);
     731           0 :         raise_softirq_irqoff(softirq_nr);
     732           0 :         local_irq_restore(flags);
     733           0 : }
     734             : 
     735           0 : void __tasklet_schedule(struct tasklet_struct *t)
     736             : {
     737           0 :         __tasklet_schedule_common(t, &tasklet_vec,
     738             :                                   TASKLET_SOFTIRQ);
     739           0 : }
     740             : EXPORT_SYMBOL(__tasklet_schedule);
     741             : 
     742           0 : void __tasklet_hi_schedule(struct tasklet_struct *t)
     743             : {
     744           0 :         __tasklet_schedule_common(t, &tasklet_hi_vec,
     745             :                                   HI_SOFTIRQ);
     746           0 : }
     747             : EXPORT_SYMBOL(__tasklet_hi_schedule);
     748             : 
     749           0 : static bool tasklet_clear_sched(struct tasklet_struct *t)
     750             : {
     751           0 :         if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) {
     752           0 :                 wake_up_var(&t->state);
     753           0 :                 return true;
     754             :         }
     755             : 
     756           0 :         WARN_ONCE(1, "tasklet SCHED state not set: %s %pS\n",
     757             :                   t->use_callback ? "callback" : "func",
     758             :                   t->use_callback ? (void *)t->callback : (void *)t->func);
     759             : 
     760             :         return false;
     761             : }
     762             : 
     763           0 : static void tasklet_action_common(struct softirq_action *a,
     764             :                                   struct tasklet_head *tl_head,
     765             :                                   unsigned int softirq_nr)
     766             : {
     767             :         struct tasklet_struct *list;
     768             : 
     769             :         local_irq_disable();
     770           0 :         list = tl_head->head;
     771           0 :         tl_head->head = NULL;
     772           0 :         tl_head->tail = &tl_head->head;
     773             :         local_irq_enable();
     774             : 
     775           0 :         while (list) {
     776           0 :                 struct tasklet_struct *t = list;
     777             : 
     778           0 :                 list = list->next;
     779             : 
     780           0 :                 if (tasklet_trylock(t)) {
     781           0 :                         if (!atomic_read(&t->count)) {
     782           0 :                                 if (tasklet_clear_sched(t)) {
     783           0 :                                         if (t->use_callback)
     784           0 :                                                 t->callback(t);
     785             :                                         else
     786           0 :                                                 t->func(t->data);
     787             :                                 }
     788           0 :                                 tasklet_unlock(t);
     789           0 :                                 continue;
     790             :                         }
     791             :                         tasklet_unlock(t);
     792             :                 }
     793             : 
     794             :                 local_irq_disable();
     795           0 :                 t->next = NULL;
     796           0 :                 *tl_head->tail = t;
     797           0 :                 tl_head->tail = &t->next;
     798           0 :                 __raise_softirq_irqoff(softirq_nr);
     799             :                 local_irq_enable();
     800             :         }
     801           0 : }
     802             : 
     803           0 : static __latent_entropy void tasklet_action(struct softirq_action *a)
     804             : {
     805           0 :         tasklet_action_common(a, this_cpu_ptr(&tasklet_vec), TASKLET_SOFTIRQ);
     806           0 : }
     807             : 
     808           0 : static __latent_entropy void tasklet_hi_action(struct softirq_action *a)
     809             : {
     810           0 :         tasklet_action_common(a, this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ);
     811           0 : }
     812             : 
     813           0 : void tasklet_setup(struct tasklet_struct *t,
     814             :                    void (*callback)(struct tasklet_struct *))
     815             : {
     816           0 :         t->next = NULL;
     817           0 :         t->state = 0;
     818           0 :         atomic_set(&t->count, 0);
     819           0 :         t->callback = callback;
     820           0 :         t->use_callback = true;
     821           0 :         t->data = 0;
     822           0 : }
     823             : EXPORT_SYMBOL(tasklet_setup);
     824             : 
     825           0 : void tasklet_init(struct tasklet_struct *t,
     826             :                   void (*func)(unsigned long), unsigned long data)
     827             : {
     828           0 :         t->next = NULL;
     829           0 :         t->state = 0;
     830           0 :         atomic_set(&t->count, 0);
     831           0 :         t->func = func;
     832           0 :         t->use_callback = false;
     833           0 :         t->data = data;
     834           0 : }
     835             : EXPORT_SYMBOL(tasklet_init);
     836             : 
     837             : #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
     838             : /*
     839             :  * Do not use in new code. Waiting for tasklets from atomic contexts is
     840             :  * error prone and should be avoided.
     841             :  */
     842             : void tasklet_unlock_spin_wait(struct tasklet_struct *t)
     843             : {
     844             :         while (test_bit(TASKLET_STATE_RUN, &(t)->state)) {
     845             :                 if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
     846             :                         /*
     847             :                          * Prevent a live lock when current preempted soft
     848             :                          * interrupt processing or prevents ksoftirqd from
     849             :                          * running. If the tasklet runs on a different CPU
     850             :                          * then this has no effect other than doing the BH
     851             :                          * disable/enable dance for nothing.
     852             :                          */
     853             :                         local_bh_disable();
     854             :                         local_bh_enable();
     855             :                 } else {
     856             :                         cpu_relax();
     857             :                 }
     858             :         }
     859             : }
     860             : EXPORT_SYMBOL(tasklet_unlock_spin_wait);
     861             : #endif
     862             : 
     863           0 : void tasklet_kill(struct tasklet_struct *t)
     864             : {
     865           0 :         if (in_interrupt())
     866           0 :                 pr_notice("Attempt to kill tasklet from interrupt\n");
     867             : 
     868           0 :         while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
     869           0 :                 wait_var_event(&t->state, !test_bit(TASKLET_STATE_SCHED, &t->state));
     870             : 
     871           0 :         tasklet_unlock_wait(t);
     872           0 :         tasklet_clear_sched(t);
     873           0 : }
     874             : EXPORT_SYMBOL(tasklet_kill);
     875             : 
     876             : #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
     877             : void tasklet_unlock(struct tasklet_struct *t)
     878             : {
     879             :         smp_mb__before_atomic();
     880             :         clear_bit(TASKLET_STATE_RUN, &t->state);
     881             :         smp_mb__after_atomic();
     882             :         wake_up_var(&t->state);
     883             : }
     884             : EXPORT_SYMBOL_GPL(tasklet_unlock);
     885             : 
     886             : void tasklet_unlock_wait(struct tasklet_struct *t)
     887             : {
     888             :         wait_var_event(&t->state, !test_bit(TASKLET_STATE_RUN, &t->state));
     889             : }
     890             : EXPORT_SYMBOL_GPL(tasklet_unlock_wait);
     891             : #endif
     892             : 
     893           1 : void __init softirq_init(void)
     894             : {
     895             :         int cpu;
     896             : 
     897           2 :         for_each_possible_cpu(cpu) {
     898           2 :                 per_cpu(tasklet_vec, cpu).tail =
     899           1 :                         &per_cpu(tasklet_vec, cpu).head;
     900           2 :                 per_cpu(tasklet_hi_vec, cpu).tail =
     901           1 :                         &per_cpu(tasklet_hi_vec, cpu).head;
     902             :         }
     903             : 
     904           1 :         open_softirq(TASKLET_SOFTIRQ, tasklet_action);
     905           1 :         open_softirq(HI_SOFTIRQ, tasklet_hi_action);
     906           1 : }
     907             : 
     908         186 : static int ksoftirqd_should_run(unsigned int cpu)
     909             : {
     910         186 :         return local_softirq_pending();
     911             : }
     912             : 
     913          93 : static void run_ksoftirqd(unsigned int cpu)
     914             : {
     915             :         ksoftirqd_run_begin();
     916          93 :         if (local_softirq_pending()) {
     917             :                 /*
     918             :                  * We can safely run softirq on inline stack, as we are not deep
     919             :                  * in the task stack here.
     920             :                  */
     921          93 :                 __do_softirq();
     922             :                 ksoftirqd_run_end();
     923          93 :                 cond_resched();
     924          93 :                 return;
     925             :         }
     926             :         ksoftirqd_run_end();
     927             : }
     928             : 
     929             : #ifdef CONFIG_HOTPLUG_CPU
     930             : static int takeover_tasklets(unsigned int cpu)
     931             : {
     932             :         /* CPU is dead, so no lock needed. */
     933             :         local_irq_disable();
     934             : 
     935             :         /* Find end, append list for that CPU. */
     936             :         if (&per_cpu(tasklet_vec, cpu).head != per_cpu(tasklet_vec, cpu).tail) {
     937             :                 *__this_cpu_read(tasklet_vec.tail) = per_cpu(tasklet_vec, cpu).head;
     938             :                 __this_cpu_write(tasklet_vec.tail, per_cpu(tasklet_vec, cpu).tail);
     939             :                 per_cpu(tasklet_vec, cpu).head = NULL;
     940             :                 per_cpu(tasklet_vec, cpu).tail = &per_cpu(tasklet_vec, cpu).head;
     941             :         }
     942             :         raise_softirq_irqoff(TASKLET_SOFTIRQ);
     943             : 
     944             :         if (&per_cpu(tasklet_hi_vec, cpu).head != per_cpu(tasklet_hi_vec, cpu).tail) {
     945             :                 *__this_cpu_read(tasklet_hi_vec.tail) = per_cpu(tasklet_hi_vec, cpu).head;
     946             :                 __this_cpu_write(tasklet_hi_vec.tail, per_cpu(tasklet_hi_vec, cpu).tail);
     947             :                 per_cpu(tasklet_hi_vec, cpu).head = NULL;
     948             :                 per_cpu(tasklet_hi_vec, cpu).tail = &per_cpu(tasklet_hi_vec, cpu).head;
     949             :         }
     950             :         raise_softirq_irqoff(HI_SOFTIRQ);
     951             : 
     952             :         local_irq_enable();
     953             :         return 0;
     954             : }
     955             : #else
     956             : #define takeover_tasklets       NULL
     957             : #endif /* CONFIG_HOTPLUG_CPU */
     958             : 
     959             : static struct smp_hotplug_thread softirq_threads = {
     960             :         .store                  = &ksoftirqd,
     961             :         .thread_should_run      = ksoftirqd_should_run,
     962             :         .thread_fn              = run_ksoftirqd,
     963             :         .thread_comm            = "ksoftirqd/%u",
     964             : };
     965             : 
     966           1 : static __init int spawn_ksoftirqd(void)
     967             : {
     968           1 :         cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL,
     969             :                                   takeover_tasklets);
     970           1 :         BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
     971             : 
     972           1 :         return 0;
     973             : }
     974             : early_initcall(spawn_ksoftirqd);
     975             : 
     976             : /*
     977             :  * [ These __weak aliases are kept in a separate compilation unit, so that
     978             :  *   GCC does not inline them incorrectly. ]
     979             :  */
     980             : 
     981           0 : int __init __weak early_irq_init(void)
     982             : {
     983           0 :         return 0;
     984             : }
     985             : 
     986           0 : int __init __weak arch_probe_nr_irqs(void)
     987             : {
     988           0 :         return NR_IRQS_LEGACY;
     989             : }
     990             : 
     991           1 : int __init __weak arch_early_irq_init(void)
     992             : {
     993           1 :         return 0;
     994             : }
     995             : 
     996           0 : unsigned int __weak arch_dynirq_lower_bound(unsigned int from)
     997             : {
     998           0 :         return from;
     999             : }

Generated by: LCOV version 1.14