diff options
Diffstat (limited to 'kernel/time/timer.c')
| -rw-r--r-- | kernel/time/timer.c | 6 | 
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 9eb11c2209e5..e3d2c23c413d 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1265,8 +1265,10 @@ static inline void timer_base_unlock_expiry(struct timer_base *base)  static void timer_sync_wait_running(struct timer_base *base)  {  	if (atomic_read(&base->timer_waiters)) { +		raw_spin_unlock_irq(&base->lock);  		spin_unlock(&base->expiry_lock);  		spin_lock(&base->expiry_lock); +		raw_spin_lock_irq(&base->lock);  	}  } @@ -1457,14 +1459,14 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)  		if (timer->flags & TIMER_IRQSAFE) {  			raw_spin_unlock(&base->lock);  			call_timer_fn(timer, fn, baseclk); -			base->running_timer = NULL;  			raw_spin_lock(&base->lock); +			base->running_timer = NULL;  		} else {  			raw_spin_unlock_irq(&base->lock);  			call_timer_fn(timer, fn, baseclk); +			raw_spin_lock_irq(&base->lock);  			base->running_timer = NULL;  			timer_sync_wait_running(base); -			raw_spin_lock_irq(&base->lock);  		}  	}  }  |