diff options
author | K. Y. Srinivasan <kys@microsoft.com> | 2013-02-17 14:30:44 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-02-27 13:15:53 -0500 |
commit | 302a3c0f2757ae1a3e7df3f9fa1f20e2214ab945 (patch) | |
tree | 96ecde42daee8290abf6e6cfca635b5a3142bb64 /drivers/hv | |
parent | 09884964335e85e897876d17783c2ad33cf8a2e0 (diff) |
Drivers: hv: vmbus: Use the new infrastructure for delivering VMBUS interrupts
Use the infrastructure for delivering VMBUS interrupts using a
special vector. With this patch, we can now properly handle
the VMBUS interrupts that can be delivered on any CPU. Also,
turn on interrupt load balancing as well.
This patch requires the infrastructure that was implemented in the patch:
X86: Handle Hyper-V vmbus interrupts as special hypervisor interrupts
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r-- | drivers/hv/channel_mgmt.c | 2 | ||||
-rw-r--r-- | drivers/hv/hv.c | 5 | ||||
-rw-r--r-- | drivers/hv/vmbus_drv.c | 11 |
3 files changed, 10 insertions, 8 deletions
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c index 53a8600162a5..ff1be167eb04 100644 --- a/drivers/hv/channel_mgmt.c +++ b/drivers/hv/channel_mgmt.c | |||
@@ -318,7 +318,7 @@ static u32 get_vp_index(uuid_le *type_guid) | |||
318 | return 0; | 318 | return 0; |
319 | } | 319 | } |
320 | cur_cpu = (++next_vp % max_cpus); | 320 | cur_cpu = (++next_vp % max_cpus); |
321 | return 0; | 321 | return cur_cpu; |
322 | } | 322 | } |
323 | 323 | ||
324 | /* | 324 | /* |
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c index 1c5481da6e4a..731158910c1e 100644 --- a/drivers/hv/hv.c +++ b/drivers/hv/hv.c | |||
@@ -272,7 +272,7 @@ u16 hv_signal_event(void *con_id) | |||
272 | * retrieve the initialized message and event pages. Otherwise, we create and | 272 | * retrieve the initialized message and event pages. Otherwise, we create and |
273 | * initialize the message and event pages. | 273 | * initialize the message and event pages. |
274 | */ | 274 | */ |
275 | void hv_synic_init(void *irqarg) | 275 | void hv_synic_init(void *arg) |
276 | { | 276 | { |
277 | u64 version; | 277 | u64 version; |
278 | union hv_synic_simp simp; | 278 | union hv_synic_simp simp; |
@@ -281,7 +281,6 @@ void hv_synic_init(void *irqarg) | |||
281 | union hv_synic_scontrol sctrl; | 281 | union hv_synic_scontrol sctrl; |
282 | u64 vp_index; | 282 | u64 vp_index; |
283 | 283 | ||
284 | u32 irq_vector = *((u32 *)(irqarg)); | ||
285 | int cpu = smp_processor_id(); | 284 | int cpu = smp_processor_id(); |
286 | 285 | ||
287 | if (!hv_context.hypercall_page) | 286 | if (!hv_context.hypercall_page) |
@@ -335,7 +334,7 @@ void hv_synic_init(void *irqarg) | |||
335 | rdmsrl(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, shared_sint.as_uint64); | 334 | rdmsrl(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, shared_sint.as_uint64); |
336 | 335 | ||
337 | shared_sint.as_uint64 = 0; | 336 | shared_sint.as_uint64 = 0; |
338 | shared_sint.vector = irq_vector; /* HV_SHARED_SINT_IDT_VECTOR + 0x20; */ | 337 | shared_sint.vector = HYPERVISOR_CALLBACK_VECTOR; |
339 | shared_sint.masked = false; | 338 | shared_sint.masked = false; |
340 | shared_sint.auto_eoi = true; | 339 | shared_sint.auto_eoi = true; |
341 | 340 | ||
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index cf19dfa5ead1..bf421e0efa1e 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/kernel_stat.h> | 36 | #include <linux/kernel_stat.h> |
37 | #include <asm/hyperv.h> | 37 | #include <asm/hyperv.h> |
38 | #include <asm/hypervisor.h> | 38 | #include <asm/hypervisor.h> |
39 | #include <asm/mshyperv.h> | ||
39 | #include "hyperv_vmbus.h" | 40 | #include "hyperv_vmbus.h" |
40 | 41 | ||
41 | 42 | ||
@@ -528,7 +529,6 @@ static void vmbus_flow_handler(unsigned int irq, struct irq_desc *desc) | |||
528 | static int vmbus_bus_init(int irq) | 529 | static int vmbus_bus_init(int irq) |
529 | { | 530 | { |
530 | int ret; | 531 | int ret; |
531 | unsigned int vector; | ||
532 | 532 | ||
533 | /* Hypervisor initialization...setup hypercall page..etc */ | 533 | /* Hypervisor initialization...setup hypercall page..etc */ |
534 | ret = hv_init(); | 534 | ret = hv_init(); |
@@ -558,13 +558,16 @@ static int vmbus_bus_init(int irq) | |||
558 | */ | 558 | */ |
559 | irq_set_handler(irq, vmbus_flow_handler); | 559 | irq_set_handler(irq, vmbus_flow_handler); |
560 | 560 | ||
561 | vector = IRQ0_VECTOR + irq; | 561 | /* |
562 | * Register our interrupt handler. | ||
563 | */ | ||
564 | hv_register_vmbus_handler(irq, vmbus_isr); | ||
562 | 565 | ||
563 | /* | 566 | /* |
564 | * Notify the hypervisor of our irq and | 567 | * Initialize the per-cpu interrupt state and |
565 | * connect to the host. | 568 | * connect to the host. |
566 | */ | 569 | */ |
567 | on_each_cpu(hv_synic_init, (void *)&vector, 1); | 570 | on_each_cpu(hv_synic_init, NULL, 1); |
568 | ret = vmbus_connect(); | 571 | ret = vmbus_connect(); |
569 | if (ret) | 572 | if (ret) |
570 | goto err_irq; | 573 | goto err_irq; |