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/mm.h> 17 #include <linux/notifier.h> 18 #include <linux/percpu.h> 19 #include <linux/cpu.h> 20 #include <linux/freezer.h> 21 #include <linux/kthread.h> 22 #include <linux/rcupdate.h> 23 #include <linux/ftrace.h> 24 #include <linux/smp.h> 25 #include <linux/smpboot.h> 26 #include <linux/tick.h> 27 #include <linux/irq.h> 28 #include <linux/wait_bit.h> 29 30 #include <asm/softirq_stack.h> 31 32 #define CREATE_TRACE_POINTS 33 #include <trace/events/irq.h> 34 35 /* 36 - No shared variables, all the data are CPU local. 37 - If a softirq needs serialization, let it serialize itself 38 by its own spinlocks. 39 - Even if softirq is serialized, only local cpu is marked for 40 execution. Hence, we get something sort of weak cpu binding. 41 Though it is still not clear, will it result in better locality 42 or will not. 43 44 Examples: 45 - NET RX softirq. It is multithreaded and does not require 46 any global serialization. 47 - NET TX softirq. It kicks software netdevice queues, hence 48 it is logically serialized per device, but this serialization 49 is invisible to common code. 50 - Tasklets: serialized wrt itself. 51 */ 52 53 #ifndef __ARCH_IRQ_STAT 54 DEFINE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat); 55 EXPORT_PER_CPU_SYMBOL(irq_stat); 56 #endif 57 58 static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; 59 60 DEFINE_PER_CPU(struct task_struct *, ksoftirqd); 61 62 const char * const softirq_to_name[NR_SOFTIRQS] = { 63 "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL", 64 "TASKLET", "SCHED", "HRTIMER", "RCU" 65 }; 66 67 /* 68 * we cannot loop indefinitely here to avoid userspace starvation, 69 * but we also don't want to introduce a worst case 1/HZ latency 70 * to the pending events, so lets the scheduler to balance 71 * the softirq load for us. 72 */ 73 static void wakeup_softirqd(void) 74 { 75 /* Interrupts are disabled: no need to stop preemption */ 76 struct task_struct *tsk = __this_cpu_read(ksoftirqd); 77 78 if (tsk && tsk->state != TASK_RUNNING) 79 wake_up_process(tsk); 80 } 81 82 /* 83 * If ksoftirqd is scheduled, we do not want to process pending softirqs 84 * right now. Let ksoftirqd handle this at its own rate, to get fairness, 85 * unless we're doing some of the synchronous softirqs. 86 */ 87 #define SOFTIRQ_NOW_MASK ((1 << HI_SOFTIRQ) | (1 << TASKLET_SOFTIRQ)) 88 static bool ksoftirqd_running(unsigned long pending) 89 { 90 struct task_struct *tsk = __this_cpu_read(ksoftirqd); 91 92 if (pending & SOFTIRQ_NOW_MASK) 93 return false; 94 return tsk && (tsk->state == TASK_RUNNING) && 95 !__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 * preempt_count and SOFTIRQ_OFFSET usage: 107 * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving 108 * softirq processing. 109 * - preempt_count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET) 110 * on local_bh_disable or local_bh_enable. 111 * This lets us distinguish between whether we are currently processing 112 * softirq and whether we just have bh disabled. 113 */ 114 115 #ifdef CONFIG_TRACE_IRQFLAGS 116 /* 117 * This is for softirq.c-internal use, where hardirqs are disabled 118 * legitimately: 119 */ 120 void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) 121 { 122 unsigned long flags; 123 124 WARN_ON_ONCE(in_irq()); 125 126 raw_local_irq_save(flags); 127 /* 128 * The preempt tracer hooks into preempt_count_add and will break 129 * lockdep because it calls back into lockdep after SOFTIRQ_OFFSET 130 * is set and before current->softirq_enabled is cleared. 131 * We must manually increment preempt_count here and manually 132 * call the trace_preempt_off later. 133 */ 134 __preempt_count_add(cnt); 135 /* 136 * Were softirqs turned off above: 137 */ 138 if (softirq_count() == (cnt & SOFTIRQ_MASK)) 139 lockdep_softirqs_off(ip); 140 raw_local_irq_restore(flags); 141 142 if (preempt_count() == cnt) { 143 #ifdef CONFIG_DEBUG_PREEMPT 144 current->preempt_disable_ip = get_lock_parent_ip(); 145 #endif 146 trace_preempt_off(CALLER_ADDR0, get_lock_parent_ip()); 147 } 148 } 149 EXPORT_SYMBOL(__local_bh_disable_ip); 150 #endif /* CONFIG_TRACE_IRQFLAGS */ 151 152 static void __local_bh_enable(unsigned int cnt) 153 { 154 lockdep_assert_irqs_disabled(); 155 156 if (preempt_count() == cnt) 157 trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip()); 158 159 if (softirq_count() == (cnt & SOFTIRQ_MASK)) 160 lockdep_softirqs_on(_RET_IP_); 161 162 __preempt_count_sub(cnt); 163 } 164 165 /* 166 * Special-case - softirqs can safely be enabled by __do_softirq(), 167 * without processing still-pending softirqs: 168 */ 169 void _local_bh_enable(void) 170 { 171 WARN_ON_ONCE(in_irq()); 172 __local_bh_enable(SOFTIRQ_DISABLE_OFFSET); 173 } 174 EXPORT_SYMBOL(_local_bh_enable); 175 176 void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) 177 { 178 WARN_ON_ONCE(in_irq()); 179 lockdep_assert_irqs_enabled(); 180 #ifdef CONFIG_TRACE_IRQFLAGS 181 local_irq_disable(); 182 #endif 183 /* 184 * Are softirqs going to be turned on now: 185 */ 186 if (softirq_count() == SOFTIRQ_DISABLE_OFFSET) 187 lockdep_softirqs_on(ip); 188 /* 189 * Keep preemption disabled until we are done with 190 * softirq processing: 191 */ 192 __preempt_count_sub(cnt - 1); 193 194 if (unlikely(!in_interrupt() && local_softirq_pending())) { 195 /* 196 * Run softirq if any pending. And do it in its own stack 197 * as we may be calling this deep in a task call stack already. 198 */ 199 do_softirq(); 200 } 201 202 preempt_count_dec(); 203 #ifdef CONFIG_TRACE_IRQFLAGS 204 local_irq_enable(); 205 #endif 206 preempt_check_resched(); 207 } 208 EXPORT_SYMBOL(__local_bh_enable_ip); 209 210 static inline void invoke_softirq(void) 211 { 212 if (ksoftirqd_running(local_softirq_pending())) 213 return; 214 215 if (!force_irqthreads) { 216 #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK 217 /* 218 * We can safely execute softirq on the current stack if 219 * it is the irq stack, because it should be near empty 220 * at this stage. 221 */ 222 __do_softirq(); 223 #else 224 /* 225 * Otherwise, irq_exit() is called on the task stack that can 226 * be potentially deep already. So call softirq in its own stack 227 * to prevent from any overrun. 228 */ 229 do_softirq_own_stack(); 230 #endif 231 } else { 232 wakeup_softirqd(); 233 } 234 } 235 236 asmlinkage __visible void do_softirq(void) 237 { 238 __u32 pending; 239 unsigned long flags; 240 241 if (in_interrupt()) 242 return; 243 244 local_irq_save(flags); 245 246 pending = local_softirq_pending(); 247 248 if (pending && !ksoftirqd_running(pending)) 249 do_softirq_own_stack(); 250 251 local_irq_restore(flags); 252 } 253 254 /* 255 * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, 256 * but break the loop if need_resched() is set or after 2 ms. 257 * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in 258 * certain cases, such as stop_machine(), jiffies may cease to 259 * increment and so we need the MAX_SOFTIRQ_RESTART limit as 260 * well to make sure we eventually return from this method. 261 * 262 * These limits have been established via experimentation. 263 * The two things to balance is latency against fairness - 264 * we want to handle softirqs as soon as possible, but they 265 * should not be able to lock up the box. 266 */ 267 #define MAX_SOFTIRQ_TIME msecs_to_jiffies(2) 268 #define MAX_SOFTIRQ_RESTART 10 269 270 #ifdef CONFIG_TRACE_IRQFLAGS 271 /* 272 * When we run softirqs from irq_exit() and thus on the hardirq stack we need 273 * to keep the lockdep irq context tracking as tight as possible in order to 274 * not miss-qualify lock contexts and miss possible deadlocks. 275 */ 276 277 static inline bool lockdep_softirq_start(void) 278 { 279 bool in_hardirq = false; 280 281 if (lockdep_hardirq_context()) { 282 in_hardirq = true; 283 lockdep_hardirq_exit(); 284 } 285 286 lockdep_softirq_enter(); 287 288 return in_hardirq; 289 } 290 291 static inline void lockdep_softirq_end(bool in_hardirq) 292 { 293 lockdep_softirq_exit(); 294 295 if (in_hardirq) 296 lockdep_hardirq_enter(); 297 } 298 #else 299 static inline bool lockdep_softirq_start(void) { return false; } 300 static inline void lockdep_softirq_end(bool in_hardirq) { } 301 #endif 302 303 asmlinkage __visible void __softirq_entry __do_softirq(void) 304 { 305 unsigned long end = jiffies + MAX_SOFTIRQ_TIME; 306 unsigned long old_flags = current->flags; 307 int max_restart = MAX_SOFTIRQ_RESTART; 308 struct softirq_action *h; 309 bool in_hardirq; 310 __u32 pending; 311 int softirq_bit; 312 313 /* 314 * Mask out PF_MEMALLOC as the current task context is borrowed for the 315 * softirq. A softirq handled, such as network RX, might set PF_MEMALLOC 316 * again if the socket is related to swapping. 317 */ 318 current->flags &= ~PF_MEMALLOC; 319 320 pending = local_softirq_pending(); 321 322 __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); 323 in_hardirq = lockdep_softirq_start(); 324 account_softirq_enter(current); 325 326 restart: 327 /* Reset the pending bitmask before enabling irqs */ 328 set_softirq_pending(0); 329 330 local_irq_enable(); 331 332 h = softirq_vec; 333 334 while ((softirq_bit = ffs(pending))) { 335 unsigned int vec_nr; 336 int prev_count; 337 338 h += softirq_bit - 1; 339 340 vec_nr = h - softirq_vec; 341 prev_count = preempt_count(); 342 343 kstat_incr_softirqs_this_cpu(vec_nr); 344 345 trace_softirq_entry(vec_nr); 346 h->action(h); 347 trace_softirq_exit(vec_nr); 348 if (unlikely(prev_count != preempt_count())) { 349 pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", 350 vec_nr, softirq_to_name[vec_nr], h->action, 351 prev_count, preempt_count()); 352 preempt_count_set(prev_count); 353 } 354 h++; 355 pending >>= softirq_bit; 356 } 357 358 if (__this_cpu_read(ksoftirqd) == current) 359 rcu_softirq_qs(); 360 local_irq_disable(); 361 362 pending = local_softirq_pending(); 363 if (pending) { 364 if (time_before(jiffies, end) && !need_resched() && 365 --max_restart) 366 goto restart; 367 368 wakeup_softirqd(); 369 } 370 371 account_softirq_exit(current); 372 lockdep_softirq_end(in_hardirq); 373 __local_bh_enable(SOFTIRQ_OFFSET); 374 WARN_ON_ONCE(in_interrupt()); 375 current_restore_flags(old_flags, PF_MEMALLOC); 376 } 377 378 /** 379 * irq_enter_rcu - Enter an interrupt context with RCU watching 380 */ 381 void irq_enter_rcu(void) 382 { 383 __irq_enter_raw(); 384 385 if (is_idle_task(current) && (irq_count() == HARDIRQ_OFFSET)) 386 tick_irq_enter(); 387 388 account_hardirq_enter(current); 389 } 390 391 /** 392 * irq_enter - Enter an interrupt context including RCU update 393 */ 394 void irq_enter(void) 395 { 396 rcu_irq_enter(); 397 irq_enter_rcu(); 398 } 399 400 static inline void tick_irq_exit(void) 401 { 402 #ifdef CONFIG_NO_HZ_COMMON 403 int cpu = smp_processor_id(); 404 405 /* Make sure that timer wheel updates are propagated */ 406 if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) { 407 if (!in_irq()) 408 tick_nohz_irq_exit(); 409 } 410 #endif 411 } 412 413 static inline void __irq_exit_rcu(void) 414 { 415 #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED 416 local_irq_disable(); 417 #else 418 lockdep_assert_irqs_disabled(); 419 #endif 420 account_hardirq_exit(current); 421 preempt_count_sub(HARDIRQ_OFFSET); 422 if (!in_interrupt() && local_softirq_pending()) 423 invoke_softirq(); 424 425 tick_irq_exit(); 426 } 427 428 /** 429 * irq_exit_rcu() - Exit an interrupt context without updating RCU 430 * 431 * Also processes softirqs if needed and possible. 432 */ 433 void irq_exit_rcu(void) 434 { 435 __irq_exit_rcu(); 436 /* must be last! */ 437 lockdep_hardirq_exit(); 438 } 439 440 /** 441 * irq_exit - Exit an interrupt context, update RCU and lockdep 442 * 443 * Also processes softirqs if needed and possible. 444 */ 445 void irq_exit(void) 446 { 447 __irq_exit_rcu(); 448 rcu_irq_exit(); 449 /* must be last! */ 450 lockdep_hardirq_exit(); 451 } 452 453 /* 454 * This function must run with irqs disabled! 455 */ 456 inline void raise_softirq_irqoff(unsigned int nr) 457 { 458 __raise_softirq_irqoff(nr); 459 460 /* 461 * If we're in an interrupt or softirq, we're done 462 * (this also catches softirq-disabled code). We will 463 * actually run the softirq once we return from 464 * the irq or softirq. 465 * 466 * Otherwise we wake up ksoftirqd to make sure we 467 * schedule the softirq soon. 468 */ 469 if (!in_interrupt()) 470 wakeup_softirqd(); 471 } 472 473 void raise_softirq(unsigned int nr) 474 { 475 unsigned long flags; 476 477 local_irq_save(flags); 478 raise_softirq_irqoff(nr); 479 local_irq_restore(flags); 480 } 481 482 void __raise_softirq_irqoff(unsigned int nr) 483 { 484 lockdep_assert_irqs_disabled(); 485 trace_softirq_raise(nr); 486 or_softirq_pending(1UL << nr); 487 } 488 489 void open_softirq(int nr, void (*action)(struct softirq_action *)) 490 { 491 softirq_vec[nr].action = action; 492 } 493 494 /* 495 * Tasklets 496 */ 497 struct tasklet_head { 498 struct tasklet_struct *head; 499 struct tasklet_struct **tail; 500 }; 501 502 static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); 503 static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec); 504 505 static void __tasklet_schedule_common(struct tasklet_struct *t, 506 struct tasklet_head __percpu *headp, 507 unsigned int softirq_nr) 508 { 509 struct tasklet_head *head; 510 unsigned long flags; 511 512 local_irq_save(flags); 513 head = this_cpu_ptr(headp); 514 t->next = NULL; 515 *head->tail = t; 516 head->tail = &(t->next); 517 raise_softirq_irqoff(softirq_nr); 518 local_irq_restore(flags); 519 } 520 521 void __tasklet_schedule(struct tasklet_struct *t) 522 { 523 __tasklet_schedule_common(t, &tasklet_vec, 524 TASKLET_SOFTIRQ); 525 } 526 EXPORT_SYMBOL(__tasklet_schedule); 527 528 void __tasklet_hi_schedule(struct tasklet_struct *t) 529 { 530 __tasklet_schedule_common(t, &tasklet_hi_vec, 531 HI_SOFTIRQ); 532 } 533 EXPORT_SYMBOL(__tasklet_hi_schedule); 534 535 static bool tasklet_clear_sched(struct tasklet_struct *t) 536 { 537 if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) { 538 wake_up_var(&t->state); 539 return true; 540 } 541 542 WARN_ONCE(1, "tasklet SCHED state not set: %s %pS\n", 543 t->use_callback ? "callback" : "func", 544 t->use_callback ? (void *)t->callback : (void *)t->func); 545 546 return false; 547 } 548 549 static void tasklet_action_common(struct softirq_action *a, 550 struct tasklet_head *tl_head, 551 unsigned int softirq_nr) 552 { 553 struct tasklet_struct *list; 554 555 local_irq_disable(); 556 list = tl_head->head; 557 tl_head->head = NULL; 558 tl_head->tail = &tl_head->head; 559 local_irq_enable(); 560 561 while (list) { 562 struct tasklet_struct *t = list; 563 564 list = list->next; 565 566 if (tasklet_trylock(t)) { 567 if (!atomic_read(&t->count)) { 568 if (tasklet_clear_sched(t)) { 569 if (t->use_callback) 570 t->callback(t); 571 else 572 t->func(t->data); 573 } 574 tasklet_unlock(t); 575 continue; 576 } 577 tasklet_unlock(t); 578 } 579 580 local_irq_disable(); 581 t->next = NULL; 582 *tl_head->tail = t; 583 tl_head->tail = &t->next; 584 __raise_softirq_irqoff(softirq_nr); 585 local_irq_enable(); 586 } 587 } 588 589 static __latent_entropy void tasklet_action(struct softirq_action *a) 590 { 591 tasklet_action_common(a, this_cpu_ptr(&tasklet_vec), TASKLET_SOFTIRQ); 592 } 593 594 static __latent_entropy void tasklet_hi_action(struct softirq_action *a) 595 { 596 tasklet_action_common(a, this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ); 597 } 598 599 void tasklet_setup(struct tasklet_struct *t, 600 void (*callback)(struct tasklet_struct *)) 601 { 602 t->next = NULL; 603 t->state = 0; 604 atomic_set(&t->count, 0); 605 t->callback = callback; 606 t->use_callback = true; 607 t->data = 0; 608 } 609 EXPORT_SYMBOL(tasklet_setup); 610 611 void tasklet_init(struct tasklet_struct *t, 612 void (*func)(unsigned long), unsigned long data) 613 { 614 t->next = NULL; 615 t->state = 0; 616 atomic_set(&t->count, 0); 617 t->func = func; 618 t->use_callback = false; 619 t->data = data; 620 } 621 EXPORT_SYMBOL(tasklet_init); 622 623 #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) 624 /* 625 * Do not use in new code. Waiting for tasklets from atomic contexts is 626 * error prone and should be avoided. 627 */ 628 void tasklet_unlock_spin_wait(struct tasklet_struct *t) 629 { 630 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { 631 if (IS_ENABLED(CONFIG_PREEMPT_RT)) { 632 /* 633 * Prevent a live lock when current preempted soft 634 * interrupt processing or prevents ksoftirqd from 635 * running. If the tasklet runs on a different CPU 636 * then this has no effect other than doing the BH 637 * disable/enable dance for nothing. 638 */ 639 local_bh_disable(); 640 local_bh_enable(); 641 } else { 642 cpu_relax(); 643 } 644 } 645 } 646 EXPORT_SYMBOL(tasklet_unlock_spin_wait); 647 #endif 648 649 void tasklet_kill(struct tasklet_struct *t) 650 { 651 if (in_interrupt()) 652 pr_notice("Attempt to kill tasklet from interrupt\n"); 653 654 while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) 655 wait_var_event(&t->state, !test_bit(TASKLET_STATE_SCHED, &t->state)); 656 657 tasklet_unlock_wait(t); 658 tasklet_clear_sched(t); 659 } 660 EXPORT_SYMBOL(tasklet_kill); 661 662 #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) 663 void tasklet_unlock(struct tasklet_struct *t) 664 { 665 smp_mb__before_atomic(); 666 clear_bit(TASKLET_STATE_RUN, &t->state); 667 smp_mb__after_atomic(); 668 wake_up_var(&t->state); 669 } 670 EXPORT_SYMBOL_GPL(tasklet_unlock); 671 672 void tasklet_unlock_wait(struct tasklet_struct *t) 673 { 674 wait_var_event(&t->state, !test_bit(TASKLET_STATE_RUN, &t->state)); 675 } 676 EXPORT_SYMBOL_GPL(tasklet_unlock_wait); 677 #endif 678 679 void __init softirq_init(void) 680 { 681 int cpu; 682 683 for_each_possible_cpu(cpu) { 684 per_cpu(tasklet_vec, cpu).tail = 685 &per_cpu(tasklet_vec, cpu).head; 686 per_cpu(tasklet_hi_vec, cpu).tail = 687 &per_cpu(tasklet_hi_vec, cpu).head; 688 } 689 690 open_softirq(TASKLET_SOFTIRQ, tasklet_action); 691 open_softirq(HI_SOFTIRQ, tasklet_hi_action); 692 } 693 694 static int ksoftirqd_should_run(unsigned int cpu) 695 { 696 return local_softirq_pending(); 697 } 698 699 static void run_ksoftirqd(unsigned int cpu) 700 { 701 local_irq_disable(); 702 if (local_softirq_pending()) { 703 /* 704 * We can safely run softirq on inline stack, as we are not deep 705 * in the task stack here. 706 */ 707 __do_softirq(); 708 local_irq_enable(); 709 cond_resched(); 710 return; 711 } 712 local_irq_enable(); 713 } 714 715 #ifdef CONFIG_HOTPLUG_CPU 716 static int takeover_tasklets(unsigned int cpu) 717 { 718 /* CPU is dead, so no lock needed. */ 719 local_irq_disable(); 720 721 /* Find end, append list for that CPU. */ 722 if (&per_cpu(tasklet_vec, cpu).head != per_cpu(tasklet_vec, cpu).tail) { 723 *__this_cpu_read(tasklet_vec.tail) = per_cpu(tasklet_vec, cpu).head; 724 __this_cpu_write(tasklet_vec.tail, per_cpu(tasklet_vec, cpu).tail); 725 per_cpu(tasklet_vec, cpu).head = NULL; 726 per_cpu(tasklet_vec, cpu).tail = &per_cpu(tasklet_vec, cpu).head; 727 } 728 raise_softirq_irqoff(TASKLET_SOFTIRQ); 729 730 if (&per_cpu(tasklet_hi_vec, cpu).head != per_cpu(tasklet_hi_vec, cpu).tail) { 731 *__this_cpu_read(tasklet_hi_vec.tail) = per_cpu(tasklet_hi_vec, cpu).head; 732 __this_cpu_write(tasklet_hi_vec.tail, per_cpu(tasklet_hi_vec, cpu).tail); 733 per_cpu(tasklet_hi_vec, cpu).head = NULL; 734 per_cpu(tasklet_hi_vec, cpu).tail = &per_cpu(tasklet_hi_vec, cpu).head; 735 } 736 raise_softirq_irqoff(HI_SOFTIRQ); 737 738 local_irq_enable(); 739 return 0; 740 } 741 #else 742 #define takeover_tasklets NULL 743 #endif /* CONFIG_HOTPLUG_CPU */ 744 745 static struct smp_hotplug_thread softirq_threads = { 746 .store = &ksoftirqd, 747 .thread_should_run = ksoftirqd_should_run, 748 .thread_fn = run_ksoftirqd, 749 .thread_comm = "ksoftirqd/%u", 750 }; 751 752 static __init int spawn_ksoftirqd(void) 753 { 754 cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, 755 takeover_tasklets); 756 BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); 757 758 return 0; 759 } 760 early_initcall(spawn_ksoftirqd); 761 762 /* 763 * [ These __weak aliases are kept in a separate compilation unit, so that 764 * GCC does not inline them incorrectly. ] 765 */ 766 767 int __init __weak early_irq_init(void) 768 { 769 return 0; 770 } 771 772 int __init __weak arch_probe_nr_irqs(void) 773 { 774 return NR_IRQS_LEGACY; 775 } 776 777 int __init __weak arch_early_irq_init(void) 778 { 779 return 0; 780 } 781 782 unsigned int __weak arch_dynirq_lower_bound(unsigned int from) 783 { 784 return from; 785 } 786