1

softirq: Remove unused 'action' parameter from action callback

When soft interrupt actions are called, they are passed a pointer to the
struct softirq action which contains the action's function pointer.

This pointer isn't useful, as the action callback already knows what
function it is. And since each callback handles a specific soft interrupt,
the callback also knows which soft interrupt number is running.

No soft interrupt action callback actually uses this parameter, so remove
it from the function pointer signature. This clarifies that soft interrupt
actions are global routines and makes it slightly cheaper to call them.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/all/20240815171549.3260003-1-csander@purestorage.com
This commit is contained in:
Caleb Sander Mateos 2024-08-15 11:15:40 -06:00 committed by Thomas Gleixner
parent 24d02c4e53
commit e68ac2b488
10 changed files with 18 additions and 19 deletions

View File

@ -1128,7 +1128,7 @@ static void blk_complete_reqs(struct llist_head *list)
rq->q->mq_ops->complete(rq); rq->q->mq_ops->complete(rq);
} }
static __latent_entropy void blk_done_softirq(struct softirq_action *h) static __latent_entropy void blk_done_softirq(void)
{ {
blk_complete_reqs(this_cpu_ptr(&blk_cpu_done)); blk_complete_reqs(this_cpu_ptr(&blk_cpu_done));
} }

View File

@ -594,7 +594,7 @@ extern const char * const softirq_to_name[NR_SOFTIRQS];
struct softirq_action struct softirq_action
{ {
void (*action)(struct softirq_action *); void (*action)(void);
}; };
asmlinkage void do_softirq(void); asmlinkage void do_softirq(void);
@ -609,7 +609,7 @@ static inline void do_softirq_post_smp_call_flush(unsigned int unused)
} }
#endif #endif
extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void open_softirq(int nr, void (*action)(void));
extern void softirq_init(void); extern void softirq_init(void);
extern void __raise_softirq_irqoff(unsigned int nr); extern void __raise_softirq_irqoff(unsigned int nr);

View File

@ -105,7 +105,7 @@ static inline bool rcu_reclaim_tiny(struct rcu_head *head)
} }
/* Invoke the RCU callbacks whose grace period has elapsed. */ /* Invoke the RCU callbacks whose grace period has elapsed. */
static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused) static __latent_entropy void rcu_process_callbacks(void)
{ {
struct rcu_head *next, *list; struct rcu_head *next, *list;
unsigned long flags; unsigned long flags;

View File

@ -2855,7 +2855,7 @@ static __latent_entropy void rcu_core(void)
queue_work_on(rdp->cpu, rcu_gp_wq, &rdp->strict_work); queue_work_on(rdp->cpu, rcu_gp_wq, &rdp->strict_work);
} }
static void rcu_core_si(struct softirq_action *h) static void rcu_core_si(void)
{ {
rcu_core(); rcu_core();
} }

View File

@ -12483,7 +12483,7 @@ out:
* - indirectly from a remote scheduler_tick() for NOHZ idle balancing * - indirectly from a remote scheduler_tick() for NOHZ idle balancing
* through the SMP cross-call nohz_csd_func() * through the SMP cross-call nohz_csd_func()
*/ */
static __latent_entropy void sched_balance_softirq(struct softirq_action *h) static __latent_entropy void sched_balance_softirq(void)
{ {
struct rq *this_rq = this_rq(); struct rq *this_rq = this_rq();
enum cpu_idle_type idle = this_rq->idle_balance; enum cpu_idle_type idle = this_rq->idle_balance;

View File

@ -551,7 +551,7 @@ restart:
kstat_incr_softirqs_this_cpu(vec_nr); kstat_incr_softirqs_this_cpu(vec_nr);
trace_softirq_entry(vec_nr); trace_softirq_entry(vec_nr);
h->action(h); h->action();
trace_softirq_exit(vec_nr); trace_softirq_exit(vec_nr);
if (unlikely(prev_count != preempt_count())) { if (unlikely(prev_count != preempt_count())) {
pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
@ -700,7 +700,7 @@ void __raise_softirq_irqoff(unsigned int nr)
or_softirq_pending(1UL << nr); or_softirq_pending(1UL << nr);
} }
void open_softirq(int nr, void (*action)(struct softirq_action *)) void open_softirq(int nr, void (*action)(void))
{ {
softirq_vec[nr].action = action; softirq_vec[nr].action = action;
} }
@ -760,8 +760,7 @@ static bool tasklet_clear_sched(struct tasklet_struct *t)
return false; return false;
} }
static void tasklet_action_common(struct softirq_action *a, static void tasklet_action_common(struct tasklet_head *tl_head,
struct tasklet_head *tl_head,
unsigned int softirq_nr) unsigned int softirq_nr)
{ {
struct tasklet_struct *list; struct tasklet_struct *list;
@ -805,16 +804,16 @@ static void tasklet_action_common(struct softirq_action *a,
} }
} }
static __latent_entropy void tasklet_action(struct softirq_action *a) static __latent_entropy void tasklet_action(void)
{ {
workqueue_softirq_action(false); workqueue_softirq_action(false);
tasklet_action_common(a, this_cpu_ptr(&tasklet_vec), TASKLET_SOFTIRQ); tasklet_action_common(this_cpu_ptr(&tasklet_vec), TASKLET_SOFTIRQ);
} }
static __latent_entropy void tasklet_hi_action(struct softirq_action *a) static __latent_entropy void tasklet_hi_action(void)
{ {
workqueue_softirq_action(true); workqueue_softirq_action(true);
tasklet_action_common(a, this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ); tasklet_action_common(this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ);
} }
void tasklet_setup(struct tasklet_struct *t, void tasklet_setup(struct tasklet_struct *t,

View File

@ -1757,7 +1757,7 @@ static void __hrtimer_run_queues(struct hrtimer_cpu_base *cpu_base, ktime_t now,
} }
} }
static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) static __latent_entropy void hrtimer_run_softirq(void)
{ {
struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases);
unsigned long flags; unsigned long flags;

View File

@ -2440,7 +2440,7 @@ static void run_timer_base(int index)
/* /*
* This function runs timers and the timer-tq in bottom half context. * This function runs timers and the timer-tq in bottom half context.
*/ */
static __latent_entropy void run_timer_softirq(struct softirq_action *h) static __latent_entropy void run_timer_softirq(void)
{ {
run_timer_base(BASE_LOCAL); run_timer_base(BASE_LOCAL);
if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) { if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) {

View File

@ -75,7 +75,7 @@ void irq_poll_complete(struct irq_poll *iop)
} }
EXPORT_SYMBOL(irq_poll_complete); EXPORT_SYMBOL(irq_poll_complete);
static void __latent_entropy irq_poll_softirq(struct softirq_action *h) static void __latent_entropy irq_poll_softirq(void)
{ {
struct list_head *list = this_cpu_ptr(&blk_cpu_iopoll); struct list_head *list = this_cpu_ptr(&blk_cpu_iopoll);
int rearm = 0, budget = irq_poll_budget; int rearm = 0, budget = irq_poll_budget;

View File

@ -5247,7 +5247,7 @@ int netif_rx(struct sk_buff *skb)
} }
EXPORT_SYMBOL(netif_rx); EXPORT_SYMBOL(netif_rx);
static __latent_entropy void net_tx_action(struct softirq_action *h) static __latent_entropy void net_tx_action(void)
{ {
struct softnet_data *sd = this_cpu_ptr(&softnet_data); struct softnet_data *sd = this_cpu_ptr(&softnet_data);
@ -6920,7 +6920,7 @@ static int napi_threaded_poll(void *data)
return 0; return 0;
} }
static __latent_entropy void net_rx_action(struct softirq_action *h) static __latent_entropy void net_rx_action(void)
{ {
struct softnet_data *sd = this_cpu_ptr(&softnet_data); struct softnet_data *sd = this_cpu_ptr(&softnet_data);
unsigned long time_limit = jiffies + unsigned long time_limit = jiffies +