Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ void hyperv_callback_vector(void);
#define trace_hyperv_callback_vector hyperv_callback_vector
#endif
void hyperv_vector_handler(struct pt_regs *regs);
int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id);
void hv_remove_vmbus_irq(int irq, void *dev_id);
void hv_setup_vmbus_irq(void (*handler)(void));
void hv_remove_vmbus_irq(void);

#endif
+3 −3
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ struct ms_hyperv_info ms_hyperv;
EXPORT_SYMBOL_GPL(ms_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)
{
@@ -49,7 +49,7 @@ void hyperv_vector_handler(struct pt_regs *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;
	/*
@@ -61,7 +61,7 @@ int hv_setup_vmbus_irq(int irq, irq_handler_t handler, void *dev_id)
				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 */
	vmbus_handler = NULL;
+6 −20
Original line number Diff line number Diff line
@@ -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();
	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];
	if (page_addr == NULL)
		return IRQ_NONE;
		return;

	event = (union hv_synic_event_flags *)page_addr +
					 VMBUS_MESSAGE_SINT;
@@ -661,17 +661,10 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
	msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT;

	/* Check if there are actual msgs to be processed */
	if (msg->header.message_type != HVMSG_NONE) {
		handled = true;
	if (msg->header.message_type != HVMSG_NONE)
		tasklet_schedule(&msg_dpc);
}

	if (handled)
		return IRQ_HANDLED;
	else
		return IRQ_NONE;
}

/*
 * vmbus_bus_init -Main vmbus driver initialization routine.
 *
@@ -698,12 +691,7 @@ static int vmbus_bus_init(int irq)
	if (ret)
		goto err_cleanup;

	ret = hv_setup_vmbus_irq(irq, vmbus_isr, hv_acpi_dev);

	if (ret != 0) {
		pr_err("Unable to request IRQ %d\n", irq);
		goto err_unregister;
	}
	hv_setup_vmbus_irq(vmbus_isr);

	ret = hv_synic_alloc();
	if (ret)
@@ -723,9 +711,8 @@ static int vmbus_bus_init(int irq)

err_alloc:
	hv_synic_free();
	hv_remove_vmbus_irq(irq, hv_acpi_dev);
	hv_remove_vmbus_irq();

err_unregister:
	bus_unregister(&hv_bus);

err_cleanup:
@@ -917,7 +904,6 @@ static int __init hv_acpi_init(void)
	/*
	 * Get irq resources first.
	 */

	ret = acpi_bus_register_driver(&vmbus_acpi_driver);

	if (ret)
@@ -948,7 +934,7 @@ static int __init hv_acpi_init(void)

static void __exit vmbus_exit(void)
{
	hv_remove_vmbus_irq(irq, hv_acpi_dev);
	hv_remove_vmbus_irq();
	vmbus_free_channels();
	bus_unregister(&hv_bus);
	hv_cleanup();