Re: [PATCH] Remove argument from open_softirq which is always NULL

From: Paul E. McKenney
Date: Fri May 16 2008 - 14:28:44 EST


On Thu, May 15, 2008 at 11:15:37AM -0300, Carlos R. Mafra wrote:
> From 9371c45e92c308425c0aad4794f61acb6fe6d140 Mon Sep 17 00:00:00 2001
> From: Carlos R. Mafra <crmafra@xxxxxxxxxxxx>
> Date: Wed, 14 May 2008 18:26:06 -0300
> Subject: [PATCH] Remove argument from open_softirq which is always NULL
>
> As git-grep shows, open_softirq() is always called with the last argument
> being NULL
>
> block/blk-core.c: open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL);
> kernel/hrtimer.c: open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq, NULL);
> kernel/rcuclassic.c: open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
> kernel/rcupreempt.c: open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
> kernel/sched.c: open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL);
> kernel/softirq.c: open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
> kernel/softirq.c: open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
> kernel/timer.c: open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
> net/core/dev.c: open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
> net/core/dev.c: open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
>
> This observation has already been made by Matthew Wilcox in June 2002
> (http://www.cs.helsinki.fi/linux/linux-kernel/2002-25/0687.html)
>
> "I notice that none of the current softirq routines use the data element
> passed to them."
>
> and the situation hasn't changed since them. So it appears we can safely
> remove that extra argument to save 128 (54) bytes of kernel data (text).

Good stuff!!!

Will there also be a similar set of patches that removes the extra
argument from the invoked function? For example:

static void rcu_process_callbacks(struct softirq_action *unused)

could now become:

static void rcu_process_callbacks(void)

Acked-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx>

> Signed-off-by: Carlos R. Mafra <crmafra@xxxxxxxxxxxx>
> ---
> block/blk-core.c | 2 +-
> include/linux/interrupt.h | 3 +--
> kernel/hrtimer.c | 2 +-
> kernel/rcuclassic.c | 2 +-
> kernel/rcupreempt.c | 2 +-
> kernel/sched.c | 2 +-
> kernel/softirq.c | 7 +++----
> kernel/timer.c | 2 +-
> net/core/dev.c | 4 ++--
> 9 files changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 2987fe4..667efc4 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -2049,7 +2049,7 @@ int __init blk_dev_init(void)
> for_each_possible_cpu(i)
> INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i));
>
> - open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL);
> + open_softirq(BLOCK_SOFTIRQ, blk_done_softirq);
> register_hotcpu_notifier(&blk_cpu_notifier);
>
> return 0;
> diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> index f1fc747..a86186d 100644
> --- a/include/linux/interrupt.h
> +++ b/include/linux/interrupt.h
> @@ -285,12 +285,11 @@ enum
> struct softirq_action
> {
> void (*action)(struct softirq_action *);
> - void *data;
> };
>
> asmlinkage void do_softirq(void);
> asmlinkage void __do_softirq(void);
> -extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
> +extern void open_softirq(int nr, void (*action)(struct softirq_action *));
> extern void softirq_init(void);
> #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
> extern void raise_softirq_irqoff(unsigned int nr);
> diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
> index 421be5f..861b408 100644
> --- a/kernel/hrtimer.c
> +++ b/kernel/hrtimer.c
> @@ -1669,7 +1669,7 @@ void __init hrtimers_init(void)
> (void *)(long)smp_processor_id());
> register_cpu_notifier(&hrtimers_nb);
> #ifdef CONFIG_HIGH_RES_TIMERS
> - open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq, NULL);
> + open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq);
> #endif
> }
>
> diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c
> index f4ffbd0..f6e01f3 100644
> --- a/kernel/rcuclassic.c
> +++ b/kernel/rcuclassic.c
> @@ -529,7 +529,7 @@ static void __cpuinit rcu_online_cpu(int cpu)
>
> rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp);
> rcu_init_percpu_data(cpu, &rcu_bh_ctrlblk, bh_rdp);
> - open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
> + open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
> }
>
> static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
> diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c
> index e1cdf19..9dd827d 100644
> --- a/kernel/rcupreempt.c
> +++ b/kernel/rcupreempt.c
> @@ -1125,7 +1125,7 @@ void __init __rcu_init(void)
> for_each_online_cpu(cpu)
> rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, (void *)(long) cpu);
>
> - open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
> + open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
> }
>
> /*
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 8841a91..80f6661 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -8154,7 +8154,7 @@ void __init sched_init(void)
> #endif
>
> #ifdef CONFIG_SMP
> - open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL);
> + open_softirq(SCHED_SOFTIRQ, run_rebalance_domains);
> #endif
>
> #ifdef CONFIG_RT_MUTEXES
> diff --git a/kernel/softirq.c b/kernel/softirq.c
> index 36e0617..0592568 100644
> --- a/kernel/softirq.c
> +++ b/kernel/softirq.c
> @@ -347,9 +347,8 @@ void raise_softirq(unsigned int nr)
> local_irq_restore(flags);
> }
>
> -void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
> +void open_softirq(int nr, void (*action)(struct softirq_action *))
> {
> - softirq_vec[nr].data = data;
> softirq_vec[nr].action = action;
> }
>
> @@ -503,8 +502,8 @@ void __init softirq_init(void)
> &per_cpu(tasklet_hi_vec, cpu).head;
> }
>
> - open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
> - open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
> + open_softirq(TASKLET_SOFTIRQ, tasklet_action);
> + open_softirq(HI_SOFTIRQ, tasklet_hi_action);
> }
>
> static int ksoftirqd(void * __bind_cpu)
> diff --git a/kernel/timer.c b/kernel/timer.c
> index ceacc66..b4da888 100644
> --- a/kernel/timer.c
> +++ b/kernel/timer.c
> @@ -1502,7 +1502,7 @@ void __init init_timers(void)
>
> BUG_ON(err == NOTIFY_BAD);
> register_cpu_notifier(&timers_nb);
> - open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
> + open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
> }
>
> /**
> diff --git a/net/core/dev.c b/net/core/dev.c
> index a1607bc..692d971 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -4559,8 +4559,8 @@ static int __init net_dev_init(void)
>
> dev_boot_phase = 0;
>
> - open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
> - open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
> + open_softirq(NET_TX_SOFTIRQ, net_tx_action);
> + open_softirq(NET_RX_SOFTIRQ, net_rx_action);
>
> hotcpu_notifier(dev_cpu_callback, 0);
> dst_init();
> --
> 1.5.4.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/