|
@@ -137,11 +137,12 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
|
|
*/
|
|
*/
|
|
int clockevents_register_notifier(struct notifier_block *nb)
|
|
int clockevents_register_notifier(struct notifier_block *nb)
|
|
{
|
|
{
|
|
|
|
+ unsigned long flags;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- spin_lock(&clockevents_lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&clockevents_lock, flags);
|
|
ret = raw_notifier_chain_register(&clockevents_chain, nb);
|
|
ret = raw_notifier_chain_register(&clockevents_chain, nb);
|
|
- spin_unlock(&clockevents_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&clockevents_lock, flags);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -178,16 +179,18 @@ static void clockevents_notify_released(void)
|
|
*/
|
|
*/
|
|
void clockevents_register_device(struct clock_event_device *dev)
|
|
void clockevents_register_device(struct clock_event_device *dev)
|
|
{
|
|
{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
|
|
BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
|
|
BUG_ON(!dev->cpumask);
|
|
BUG_ON(!dev->cpumask);
|
|
|
|
|
|
- spin_lock(&clockevents_lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&clockevents_lock, flags);
|
|
|
|
|
|
list_add(&dev->list, &clockevent_devices);
|
|
list_add(&dev->list, &clockevent_devices);
|
|
clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev);
|
|
clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev);
|
|
clockevents_notify_released();
|
|
clockevents_notify_released();
|
|
|
|
|
|
- spin_unlock(&clockevents_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&clockevents_lock, flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(clockevents_register_device);
|
|
EXPORT_SYMBOL_GPL(clockevents_register_device);
|
|
|
|
|
|
@@ -235,8 +238,9 @@ void clockevents_exchange_device(struct clock_event_device *old,
|
|
void clockevents_notify(unsigned long reason, void *arg)
|
|
void clockevents_notify(unsigned long reason, void *arg)
|
|
{
|
|
{
|
|
struct list_head *node, *tmp;
|
|
struct list_head *node, *tmp;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- spin_lock(&clockevents_lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&clockevents_lock, flags);
|
|
clockevents_do_notify(reason, arg);
|
|
clockevents_do_notify(reason, arg);
|
|
|
|
|
|
switch (reason) {
|
|
switch (reason) {
|
|
@@ -251,7 +255,7 @@ void clockevents_notify(unsigned long reason, void *arg)
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- spin_unlock(&clockevents_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&clockevents_lock, flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(clockevents_notify);
|
|
EXPORT_SYMBOL_GPL(clockevents_notify);
|
|
#endif
|
|
#endif
|