> From: Michael Kelley <mikelley@xxxxxxxxxxxxx> > Sent: Tuesday, November 12, 2019 5:12 PM > ... > @@ -190,14 +278,20 @@ void hv_stimer_free(void) > void hv_stimer_global_cleanup(void) > { > int cpu; > ... > + /* > + * hv_stime_legacy_cleanup() will stop the stimer if Direct > + * Mode is not enabled, and fallback to the LAPIC timer. > + */ > + for_each_present_cpu(cpu) { > + hv_stimer_legacy_cleanup(cpu); > } > + > + /* > + * If Direct Mode is enabled, the cpuhp teardown callback > + * (hv_stimer_cleanup) will be run on all CPUs to stop the > + * stimers. > + */ > hv_stimer_free(); > } In the case of direct_mode_enabled == true: When hv_vmbus unloads, vmbus_exit() -> hv_stimer_global_cleanup() -> hv_stimer_free() -> cpuhp_remove_state() disables the direct mode timers. This does not look symmetric since hv_stimer_alloc() is called before hv_vmbus loads, but I suppose this is not a real issue because hv_vmbus should never unload in practice. :-) Tested-by: Dexuan Cui <decui@xxxxxxxxxxxxx> Reviewed-by: Dexuan Cui <decui@xxxxxxxxxxxxx>