提交 666484f0 编写于 作者: L Linus Torvalds

Merge branch 'core/softirq' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'core/softirq' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  softirq: remove irqs_disabled warning from local_bh_enable
  softirq: remove initialization of static per-cpu variable
  Remove argument from open_softirq which is always NULL
...@@ -2048,7 +2048,7 @@ int __init blk_dev_init(void) ...@@ -2048,7 +2048,7 @@ int __init blk_dev_init(void)
for_each_possible_cpu(i) for_each_possible_cpu(i)
INIT_LIST_HEAD(&per_cpu(blk_cpu_done, 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); register_hotcpu_notifier(&blk_cpu_notifier);
return 0; return 0;
......
...@@ -285,12 +285,11 @@ enum ...@@ -285,12 +285,11 @@ enum
struct softirq_action struct softirq_action
{ {
void (*action)(struct softirq_action *); void (*action)(struct softirq_action *);
void *data;
}; };
asmlinkage void do_softirq(void); asmlinkage void do_softirq(void);
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); extern void softirq_init(void);
#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0) #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
extern void raise_softirq_irqoff(unsigned int nr); extern void raise_softirq_irqoff(unsigned int nr);
......
...@@ -1677,7 +1677,7 @@ void __init hrtimers_init(void) ...@@ -1677,7 +1677,7 @@ void __init hrtimers_init(void)
(void *)(long)smp_processor_id()); (void *)(long)smp_processor_id());
register_cpu_notifier(&hrtimers_nb); register_cpu_notifier(&hrtimers_nb);
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq, NULL); open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq);
#endif #endif
} }
...@@ -543,7 +543,7 @@ static void __cpuinit rcu_online_cpu(int cpu) ...@@ -543,7 +543,7 @@ static void __cpuinit rcu_online_cpu(int cpu)
rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp); rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp);
rcu_init_percpu_data(cpu, &rcu_bh_ctrlblk, bh_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, static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
......
...@@ -1119,7 +1119,7 @@ void __init __rcu_init(void) ...@@ -1119,7 +1119,7 @@ void __init __rcu_init(void)
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, (void *)(long) 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);
} }
/* /*
......
...@@ -8152,7 +8152,7 @@ void __init sched_init(void) ...@@ -8152,7 +8152,7 @@ void __init sched_init(void)
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL); open_softirq(SCHED_SOFTIRQ, run_rebalance_domains);
#endif #endif
#ifdef CONFIG_RT_MUTEXES #ifdef CONFIG_RT_MUTEXES
......
...@@ -131,23 +131,17 @@ void _local_bh_enable(void) ...@@ -131,23 +131,17 @@ void _local_bh_enable(void)
EXPORT_SYMBOL(_local_bh_enable); EXPORT_SYMBOL(_local_bh_enable);
void local_bh_enable(void) static inline void _local_bh_enable_ip(unsigned long ip)
{ {
WARN_ON_ONCE(in_irq() || irqs_disabled());
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
unsigned long flags; local_irq_disable();
WARN_ON_ONCE(in_irq());
#endif
WARN_ON_ONCE(irqs_disabled());
#ifdef CONFIG_TRACE_IRQFLAGS
local_irq_save(flags);
#endif #endif
/* /*
* Are softirqs going to be turned on now: * Are softirqs going to be turned on now:
*/ */
if (softirq_count() == SOFTIRQ_OFFSET) if (softirq_count() == SOFTIRQ_OFFSET)
trace_softirqs_on((unsigned long)__builtin_return_address(0)); trace_softirqs_on(ip);
/* /*
* Keep preemption disabled until we are done with * Keep preemption disabled until we are done with
* softirq processing: * softirq processing:
...@@ -159,40 +153,20 @@ void local_bh_enable(void) ...@@ -159,40 +153,20 @@ void local_bh_enable(void)
dec_preempt_count(); dec_preempt_count();
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
local_irq_restore(flags); local_irq_enable();
#endif #endif
preempt_check_resched(); preempt_check_resched();
} }
void local_bh_enable(void)
{
_local_bh_enable_ip((unsigned long)__builtin_return_address(0));
}
EXPORT_SYMBOL(local_bh_enable); EXPORT_SYMBOL(local_bh_enable);
void local_bh_enable_ip(unsigned long ip) void local_bh_enable_ip(unsigned long ip)
{ {
#ifdef CONFIG_TRACE_IRQFLAGS _local_bh_enable_ip(ip);
unsigned long flags;
WARN_ON_ONCE(in_irq());
local_irq_save(flags);
#endif
/*
* Are softirqs going to be turned on now:
*/
if (softirq_count() == SOFTIRQ_OFFSET)
trace_softirqs_on(ip);
/*
* Keep preemption disabled until we are done with
* softirq processing:
*/
sub_preempt_count(SOFTIRQ_OFFSET - 1);
if (unlikely(!in_interrupt() && local_softirq_pending()))
do_softirq();
dec_preempt_count();
#ifdef CONFIG_TRACE_IRQFLAGS
local_irq_restore(flags);
#endif
preempt_check_resched();
} }
EXPORT_SYMBOL(local_bh_enable_ip); EXPORT_SYMBOL(local_bh_enable_ip);
...@@ -347,9 +321,8 @@ void raise_softirq(unsigned int nr) ...@@ -347,9 +321,8 @@ void raise_softirq(unsigned int nr)
local_irq_restore(flags); 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; softirq_vec[nr].action = action;
} }
...@@ -360,10 +333,8 @@ struct tasklet_head ...@@ -360,10 +333,8 @@ struct tasklet_head
struct tasklet_struct **tail; struct tasklet_struct **tail;
}; };
/* Some compilers disobey section attribute on statics when not static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
initialized -- RR */ static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec) = { NULL };
static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec) = { NULL };
void __tasklet_schedule(struct tasklet_struct *t) void __tasklet_schedule(struct tasklet_struct *t)
{ {
...@@ -503,8 +474,8 @@ void __init softirq_init(void) ...@@ -503,8 +474,8 @@ void __init softirq_init(void)
&per_cpu(tasklet_hi_vec, cpu).head; &per_cpu(tasklet_hi_vec, cpu).head;
} }
open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL); open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL); open_softirq(HI_SOFTIRQ, tasklet_hi_action);
} }
static int ksoftirqd(void * __bind_cpu) static int ksoftirqd(void * __bind_cpu)
......
...@@ -1502,7 +1502,7 @@ void __init init_timers(void) ...@@ -1502,7 +1502,7 @@ void __init init_timers(void)
BUG_ON(err == NOTIFY_BAD); BUG_ON(err == NOTIFY_BAD);
register_cpu_notifier(&timers_nb); register_cpu_notifier(&timers_nb);
open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL); open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
} }
/** /**
......
...@@ -4585,8 +4585,8 @@ static int __init net_dev_init(void) ...@@ -4585,8 +4585,8 @@ static int __init net_dev_init(void)
dev_boot_phase = 0; dev_boot_phase = 0;
open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL); open_softirq(NET_RX_SOFTIRQ, net_rx_action);
hotcpu_notifier(dev_cpu_callback, 0); hotcpu_notifier(dev_cpu_callback, 0);
dst_init(); dst_init();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册