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: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
abcfc543be
commit
76d388cd72
@ -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;
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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 @@ cleanup:
|
|||||||
|
|
||||||
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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user