Commit 76d388cd authored by Thomas Gleixner's avatar Thomas Gleixner

x86: hyperv: Fixup the (brain) damage caused by the irq cleanup

Compiling last minute changes without setting the proper config
options is not really clever.
Reported-by: default avatarFengguang Wu <fengguang.wu@intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent abcfc543
...@@ -17,7 +17,7 @@ void hyperv_callback_vector(void); ...@@ -17,7 +17,7 @@ void hyperv_callback_vector(void);
#define trace_hyperv_callback_vector hyperv_callback_vector #define trace_hyperv_callback_vector hyperv_callback_vector
#endif #endif
void hyperv_vector_handler(struct pt_regs *regs); void hyperv_vector_handler(struct pt_regs *regs);
int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id); void hv_setup_vmbus_irq(void (*handler)(void));
void hv_remove_vmbus_irq(int irq, void *dev_id); void hv_remove_vmbus_irq(void);
#endif #endif
...@@ -32,7 +32,7 @@ struct ms_hyperv_info ms_hyperv; ...@@ -32,7 +32,7 @@ struct ms_hyperv_info ms_hyperv;
EXPORT_SYMBOL_GPL(ms_hyperv); EXPORT_SYMBOL_GPL(ms_hyperv);
#if IS_ENABLED(CONFIG_HYPERV) #if IS_ENABLED(CONFIG_HYPERV)
static irq_handler_t vmbus_handler; static void (*vmbus_handler)(void);
void hyperv_vector_handler(struct pt_regs *regs) void hyperv_vector_handler(struct pt_regs *regs)
{ {
...@@ -49,7 +49,7 @@ void hyperv_vector_handler(struct pt_regs *regs) ...@@ -49,7 +49,7 @@ void hyperv_vector_handler(struct pt_regs *regs)
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id) void hv_setup_vmbus_irq(void (*handler)(void))
{ {
vmbus_handler = handler; vmbus_handler = handler;
/* /*
...@@ -61,7 +61,7 @@ int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id) ...@@ -61,7 +61,7 @@ int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id)
hyperv_callback_vector); hyperv_callback_vector);
} }
void hv_remove_vmbus_irq(int irq, void *dev_id) void hv_remove_vmbus_irq(void)
{ {
/* We have no way to deallocate the interrupt gate */ /* We have no way to deallocate the interrupt gate */
vmbus_handler = NULL; vmbus_handler = NULL;
......
...@@ -615,7 +615,7 @@ static void vmbus_on_msg_dpc(unsigned long data) ...@@ -615,7 +615,7 @@ static void vmbus_on_msg_dpc(unsigned long data)
} }
} }
static irqreturn_t vmbus_isr(int irq, void *dev_id) static void vmbus_isr(void)
{ {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
void *page_addr; void *page_addr;
...@@ -625,7 +625,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) ...@@ -625,7 +625,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
page_addr = hv_context.synic_event_page[cpu]; page_addr = hv_context.synic_event_page[cpu];
if (page_addr == NULL) if (page_addr == NULL)
return IRQ_NONE; return;
event = (union hv_synic_event_flags *)page_addr + event = (union hv_synic_event_flags *)page_addr +
VMBUS_MESSAGE_SINT; VMBUS_MESSAGE_SINT;
...@@ -661,15 +661,8 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) ...@@ -661,15 +661,8 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT; msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT;
/* Check if there are actual msgs to be processed */ /* Check if there are actual msgs to be processed */
if (msg->header.message_type != HVMSG_NONE) { if (msg->header.message_type != HVMSG_NONE)
handled = true;
tasklet_schedule(&msg_dpc); tasklet_schedule(&msg_dpc);
}
if (handled)
return IRQ_HANDLED;
else
return IRQ_NONE;
} }
/* /*
...@@ -698,12 +691,7 @@ static int vmbus_bus_init(int irq) ...@@ -698,12 +691,7 @@ static int vmbus_bus_init(int irq)
if (ret) if (ret)
goto err_cleanup; goto err_cleanup;
ret = hv_setup_vmbus_irq(irq, vmbus_isr, hv_acpi_dev); hv_setup_vmbus_irq(vmbus_isr);
if (ret != 0) {
pr_err("Unable to request IRQ %d\n", irq);
goto err_unregister;
}
ret = hv_synic_alloc(); ret = hv_synic_alloc();
if (ret) if (ret)
...@@ -723,9 +711,8 @@ static int vmbus_bus_init(int irq) ...@@ -723,9 +711,8 @@ static int vmbus_bus_init(int irq)
err_alloc: err_alloc:
hv_synic_free(); hv_synic_free();
hv_remove_vmbus_irq(irq, hv_acpi_dev); hv_remove_vmbus_irq();
err_unregister:
bus_unregister(&hv_bus); bus_unregister(&hv_bus);
err_cleanup: err_cleanup:
...@@ -917,7 +904,6 @@ static int __init hv_acpi_init(void) ...@@ -917,7 +904,6 @@ static int __init hv_acpi_init(void)
/* /*
* Get irq resources first. * Get irq resources first.
*/ */
ret = acpi_bus_register_driver(&vmbus_acpi_driver); ret = acpi_bus_register_driver(&vmbus_acpi_driver);
if (ret) if (ret)
...@@ -948,7 +934,7 @@ static int __init hv_acpi_init(void) ...@@ -948,7 +934,7 @@ static int __init hv_acpi_init(void)
static void __exit vmbus_exit(void) static void __exit vmbus_exit(void)
{ {
hv_remove_vmbus_irq(irq, hv_acpi_dev); hv_remove_vmbus_irq();
vmbus_free_channels(); vmbus_free_channels();
bus_unregister(&hv_bus); bus_unregister(&hv_bus);
hv_cleanup(); hv_cleanup();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment