aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2013-02-17 14:30:44 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-02-27 13:15:53 -0500
commit302a3c0f2757ae1a3e7df3f9fa1f20e2214ab945 (patch)
tree96ecde42daee8290abf6e6cfca635b5a3142bb64 /drivers/hv
parent09884964335e85e897876d17783c2ad33cf8a2e0 (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.c2
-rw-r--r--drivers/hv/hv.c5
-rw-r--r--drivers/hv/vmbus_drv.c11
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 */
275void hv_synic_init(void *irqarg) 275void 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)
528static int vmbus_bus_init(int irq) 529static 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;