File tree Expand file tree Collapse file tree 1 file changed +11
-2
lines changed Expand file tree Collapse file tree 1 file changed +11
-2
lines changed Original file line number Diff line number Diff line change @@ -931,6 +931,7 @@ static inline int
931
931
remove_hrtimer (struct hrtimer * timer , struct hrtimer_clock_base * base )
932
932
{
933
933
if (hrtimer_is_queued (timer )) {
934
+ unsigned long state ;
934
935
int reprogram ;
935
936
936
937
/*
@@ -944,8 +945,13 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base)
944
945
debug_deactivate (timer );
945
946
timer_stats_hrtimer_clear_start_info (timer );
946
947
reprogram = base -> cpu_base == & __get_cpu_var (hrtimer_bases );
947
- __remove_hrtimer (timer , base , HRTIMER_STATE_INACTIVE ,
948
- reprogram );
948
+ /*
949
+ * We must preserve the CALLBACK state flag here,
950
+ * otherwise we could move the timer base in
951
+ * switch_hrtimer_base.
952
+ */
953
+ state = timer -> state & HRTIMER_STATE_CALLBACK ;
954
+ __remove_hrtimer (timer , base , state , reprogram );
949
955
return 1 ;
950
956
}
951
957
return 0 ;
@@ -1231,6 +1237,9 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now)
1231
1237
BUG_ON (timer -> state != HRTIMER_STATE_CALLBACK );
1232
1238
enqueue_hrtimer (timer , base );
1233
1239
}
1240
+
1241
+ WARN_ON_ONCE (!(timer -> state & HRTIMER_STATE_CALLBACK ));
1242
+
1234
1243
timer -> state &= ~HRTIMER_STATE_CALLBACK ;
1235
1244
}
1236
1245
You can’t perform that action at this time.
0 commit comments