hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/kernel/time/tick-common.c
....@@ -248,7 +248,8 @@
248248 } else {
249249 handler = td->evtdev->event_handler;
250250 next_event = td->evtdev->next_event;
251
- td->evtdev->event_handler = clockevents_handle_noop;
251
+ if (!clockevent_state_reserved(td->evtdev))
252
+ td->evtdev->event_handler = clockevents_handle_noop;
252253 }
253254
254255 td->evtdev = newdev;
....@@ -330,6 +331,12 @@
330331 bool tick_check_replacement(struct clock_event_device *curdev,
331332 struct clock_event_device *newdev)
332333 {
334
+ /*
335
+ * Never replace an active proxy except when unregistering it.
336
+ */
337
+ if (tick_check_is_proxy(curdev))
338
+ return false;
339
+
333340 if (!tick_check_percpu(curdev, newdev, smp_processor_id()))
334341 return false;
335342
....@@ -350,6 +357,9 @@
350357 td = &per_cpu(tick_cpu_device, cpu);
351358 curdev = td->evtdev;
352359
360
+ if (tick_check_is_proxy(curdev))
361
+ goto out_bc;
362
+
353363 /* cpu local device ? */
354364 if (!tick_check_percpu(curdev, newdev, cpu))
355365 goto out_bc;
....@@ -367,7 +377,12 @@
367377 * not give it back to the clockevents layer !
368378 */
369379 if (tick_is_broadcast_device(curdev)) {
370
- clockevents_shutdown(curdev);
380
+ if (tick_check_is_proxy(newdev)) {
381
+ list_del(&curdev->list);
382
+ clockevents_switch_state(curdev, CLOCK_EVT_STATE_RESERVED);
383
+ } else {
384
+ clockevents_shutdown(curdev);
385
+ }
371386 curdev = NULL;
372387 }
373388 clockevents_exchange_device(curdev, newdev);