diff options
author | Vitaly Kuznetsov <vkuznets@redhat.com> | 2016-12-07 14:53:11 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-10 21:46:41 +0100 |
commit | 76d36ab79820430f73c584673aef10ba2446fced (patch) | |
tree | d43d61e014d5d143c5c7dece02cc33495ba445f7 /drivers/hv/vmbus_drv.c | |
parent | e7e97dd8b77ee7366f2f8c70a033bf5fa05ec2e0 (diff) | |
download | linux-76d36ab79820430f73c584673aef10ba2446fced.tar.gz linux-76d36ab79820430f73c584673aef10ba2446fced.tar.bz2 linux-76d36ab79820430f73c584673aef10ba2446fced.zip |
hv: switch to cpuhp state machine for synic init/cleanup
To make it possible to online/offline CPUs switch to cpuhp infrastructure
for doing hv_synic_init()/hv_synic_cleanup().
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv/vmbus_drv.c')
-rw-r--r-- | drivers/hv/vmbus_drv.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index 230c62e7f567..a16d519b7e37 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -54,6 +54,7 @@ static struct acpi_device *hv_acpi_dev; static struct completion probe_event; +static int hyperv_cpuhp_online; static void hyperv_report_panic(struct pt_regs *regs) { @@ -997,7 +998,12 @@ static int vmbus_bus_init(void) * Initialize the per-cpu interrupt state and * connect to the host. */ - on_each_cpu(hv_synic_init, NULL, 1); + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/hyperv:online", + hv_synic_init, hv_synic_cleanup); + if (ret < 0) + goto err_alloc; + hyperv_cpuhp_online = ret; + ret = vmbus_connect(); if (ret) goto err_connect; @@ -1019,7 +1025,7 @@ static int vmbus_bus_init(void) return 0; err_connect: - on_each_cpu(hv_synic_cleanup, NULL, 1); + cpuhp_remove_state(hyperv_cpuhp_online); err_alloc: hv_synic_free(); hv_remove_vmbus_irq(); @@ -1478,12 +1484,9 @@ static struct acpi_driver vmbus_acpi_driver = { static void hv_kexec_handler(void) { - int cpu; - hv_synic_clockevents_cleanup(); vmbus_initiate_unload(false); - for_each_online_cpu(cpu) - smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1); + cpuhp_remove_state(hyperv_cpuhp_online); hv_cleanup(false); }; @@ -1495,7 +1498,7 @@ static void hv_crash_handler(struct pt_regs *regs) * doing the cleanup for current CPU only. This should be sufficient * for kdump. */ - hv_synic_cleanup(NULL); + hv_synic_cleanup(smp_processor_id()); hv_cleanup(true); }; @@ -1559,8 +1562,8 @@ static void __exit vmbus_exit(void) hv_cleanup(false); for_each_online_cpu(cpu) { tasklet_kill(hv_context.event_dpc[cpu]); - smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1); } + cpuhp_remove_state(hyperv_cpuhp_online); hv_synic_free(); acpi_bus_unregister_driver(&vmbus_acpi_driver); if (vmbus_proto_version > VERSION_WIN7) |