Provide static call to control IRQ preemption (called in CONFIG_PREEMPT) so that we can override its behaviour when preempt= is overriden. Since the default behaviour is full preemption, its call is initialized to provide IRQ preemption when preempt= isn't passed.
Showing the changes to kernel (1 of 2 files). Show all
Unified · Split
| @@ -385,6 +385,9 @@ void irqentry_exit_cond_resched(void) · 384 unmodified lines | ||
| 385 | 385 | preempt_schedule_irq(); |
| 386 | 386 | } |
| 387 | 387 | } |
| 388 | +#ifdef CONFIG_PREEMPT_DYNAMIC | |
| 389 | +DEFINE_STATIC_CALL(irqentry_exit_cond_resched, irqentry_exit_cond_resched); | |
| 390 | +#endif | |
| 388 | 391 | |
| 389 | 392 | noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state) |
| 390 | 393 | { |
| @@ -411,8 +414,13 @@ noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state) · 20 unmodified lines | ||
| 411 | 414 | } |
| 412 | 415 | |
| 413 | 416 | instrumentation_begin(); |
| 414 | − if (IS_ENABLED(CONFIG_PREEMPTION)) | |
| 417 | + if (IS_ENABLED(CONFIG_PREEMPTION)) { | |
| 418 | +#ifdef CONFIG_PREEMT_DYNAMIC | |
| 419 | + static_call(irqentry_exit_cond_resched)(); | |
| 420 | +#else | |
| 415 | 421 | irqentry_exit_cond_resched(); |
| 422 | +#endif | |
| 423 | + } | |
| 416 | 424 | /* Covers both tracing and lockdep */ |
| 417 | 425 | trace_hardirqs_on(); |
| 418 | 426 | instrumentation_end(); |