Add a wrapper function - hv_setup_percpu_vmbus_handler(), similar to hv_setup_vmbus_handler() to allow setting up custom per-cpu VMBus interrupt handler. This is required for arm64 support, to be added in MSHV_VTL driver, where per-cpu VMBus interrupt handler will be set to mshv_vtl_vmbus_isr() for VTL2 (Virtual Trust Level 2).
Signed-off-by: Saurabh Sengar <[email protected]> Signed-off-by: Naman Jain <[email protected]> --- arch/arm64/hyperv/mshyperv.c | 13 +++++++++++++ drivers/hv/hv_common.c | 11 +++++++++++ drivers/hv/vmbus_drv.c | 7 +------ include/asm-generic/mshyperv.h | 3 +++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c index 4fdc26ade1d7..d4494ceeaad0 100644 --- a/arch/arm64/hyperv/mshyperv.c +++ b/arch/arm64/hyperv/mshyperv.c @@ -134,3 +134,16 @@ bool hv_is_hyperv_initialized(void) return hyperv_initialized; } EXPORT_SYMBOL_GPL(hv_is_hyperv_initialized); + +static void (*vmbus_percpu_handler)(void); +void hv_setup_percpu_vmbus_handler(void (*handler)(void)) +{ + vmbus_percpu_handler = handler; +} + +irqreturn_t vmbus_percpu_isr(int irq, void *dev_id) +{ + if (vmbus_percpu_handler) + vmbus_percpu_handler(); + return IRQ_HANDLED; +} diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c index d1ebc0ebd08f..a5064f558bf6 100644 --- a/drivers/hv/hv_common.c +++ b/drivers/hv/hv_common.c @@ -759,6 +759,17 @@ void __weak hv_setup_vmbus_handler(void (*handler)(void)) } EXPORT_SYMBOL_GPL(hv_setup_vmbus_handler); +irqreturn_t __weak vmbus_percpu_isr(int irq, void *dev_id) +{ + return IRQ_HANDLED; +} +EXPORT_SYMBOL_GPL(vmbus_percpu_isr); + +void __weak hv_setup_percpu_vmbus_handler(void (*handler)(void)) +{ +} +EXPORT_SYMBOL_GPL(hv_setup_percpu_vmbus_handler); + void __weak hv_remove_vmbus_handler(void) { } diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index bc4fc1951ae1..f99d4f2d3862 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1413,12 +1413,6 @@ void vmbus_isr(void) } EXPORT_SYMBOL_FOR_MODULES(vmbus_isr, "mshv_vtl"); -static irqreturn_t vmbus_percpu_isr(int irq, void *dev_id) -{ - vmbus_isr(); - return IRQ_HANDLED; -} - static void vmbus_percpu_work(struct work_struct *work) { unsigned int cpu = smp_processor_id(); @@ -1520,6 +1514,7 @@ static int vmbus_bus_init(void) if (vmbus_irq == -1) { hv_setup_vmbus_handler(vmbus_isr); } else { + hv_setup_percpu_vmbus_handler(vmbus_isr); ret = request_percpu_irq(vmbus_irq, vmbus_percpu_isr, "Hyper-V VMbus", &vmbus_evt); if (ret) { diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h index 108f135d4fd9..b147a12085e4 100644 --- a/include/asm-generic/mshyperv.h +++ b/include/asm-generic/mshyperv.h @@ -22,6 +22,7 @@ #include <linux/bitops.h> #include <acpi/acpi_numa.h> #include <linux/cpumask.h> +#include <linux/interrupt.h> #include <linux/nmi.h> #include <asm/ptrace.h> #include <hyperv/hvhdk.h> @@ -179,6 +180,8 @@ static inline u64 hv_generate_guest_id(u64 kernel_version) int hv_get_hypervisor_version(union hv_hypervisor_version_info *info); +irqreturn_t vmbus_percpu_isr(int irq, void *dev_id); +void hv_setup_percpu_vmbus_handler(void (*handler)(void)); void hv_setup_vmbus_handler(void (*handler)(void)); void hv_remove_vmbus_handler(void); void hv_setup_stimer0_handler(void (*handler)(void)); -- 2.43.0

