aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/irq/manage.c3
-rw-r--r--kernel/profile.c3
-rw-r--r--kernel/sys.c15
3 files changed, 16 insertions, 5 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index b385878c6e80..8b961adc3bd2 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -315,6 +315,9 @@ int setup_irq(unsigned int irq, struct irqaction *new)
315 /* Undo nested disables: */ 315 /* Undo nested disables: */
316 desc->depth = 1; 316 desc->depth = 1;
317 } 317 }
318 /* Reset broken irq detection when installing new handler */
319 desc->irq_count = 0;
320 desc->irqs_unhandled = 0;
318 spin_unlock_irqrestore(&desc->lock, flags); 321 spin_unlock_irqrestore(&desc->lock, flags);
319 322
320 new->irq = irq; 323 new->irq = irq;
diff --git a/kernel/profile.c b/kernel/profile.c
index a6574a18514e..d6579d511069 100644
--- a/kernel/profile.c
+++ b/kernel/profile.c
@@ -331,7 +331,6 @@ out:
331 local_irq_restore(flags); 331 local_irq_restore(flags);
332 put_cpu(); 332 put_cpu();
333} 333}
334EXPORT_SYMBOL_GPL(profile_hits);
335 334
336static int __devinit profile_cpu_callback(struct notifier_block *info, 335static int __devinit profile_cpu_callback(struct notifier_block *info,
337 unsigned long action, void *__cpu) 336 unsigned long action, void *__cpu)
@@ -401,6 +400,8 @@ void profile_hits(int type, void *__pc, unsigned int nr_hits)
401} 400}
402#endif /* !CONFIG_SMP */ 401#endif /* !CONFIG_SMP */
403 402
403EXPORT_SYMBOL_GPL(profile_hits);
404
404void profile_tick(int type) 405void profile_tick(int type)
405{ 406{
406 struct pt_regs *regs = get_irq_regs(); 407 struct pt_regs *regs = get_irq_regs();
diff --git a/kernel/sys.c b/kernel/sys.c
index c7675c1bfdf2..6e2101dec0fc 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -323,11 +323,18 @@ EXPORT_SYMBOL_GPL(blocking_notifier_chain_unregister);
323int blocking_notifier_call_chain(struct blocking_notifier_head *nh, 323int blocking_notifier_call_chain(struct blocking_notifier_head *nh,
324 unsigned long val, void *v) 324 unsigned long val, void *v)
325{ 325{
326 int ret; 326 int ret = NOTIFY_DONE;
327 327
328 down_read(&nh->rwsem); 328 /*
329 ret = notifier_call_chain(&nh->head, val, v); 329 * We check the head outside the lock, but if this access is
330 up_read(&nh->rwsem); 330 * racy then it does not matter what the result of the test
331 * is, we re-check the list after having taken the lock anyway:
332 */
333 if (rcu_dereference(nh->head)) {
334 down_read(&nh->rwsem);
335 ret = notifier_call_chain(&nh->head, val, v);
336 up_read(&nh->rwsem);
337 }
331 return ret; 338 return ret;
332} 339}
333 340