diff options
| author | K. Y. Srinivasan <kys@microsoft.com> | 2012-12-01 09:46:55 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-17 14:39:15 -0500 |
| commit | 5ab05951c586a2ed9e19a3ed8c437346bfabbfb7 (patch) | |
| tree | 6b35e7482fd3c169fb46de98c3751db1e2035cb5 | |
| parent | b0209501dc7586cbfbf6d023f2dd3ce4621aff2c (diff) | |
Drivers: hv: Add a check to deal with spurious interrupts
We establish the handler before we have fully initialized the VMBUS state.
Deal with spurious interrupts.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
| -rw-r--r-- | drivers/hv/vmbus_drv.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index e066d418be97..797142c07fa0 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c | |||
| @@ -454,6 +454,12 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) | |||
| 454 | union hv_synic_event_flags *event; | 454 | union hv_synic_event_flags *event; |
| 455 | bool handled = false; | 455 | bool handled = false; |
| 456 | 456 | ||
| 457 | page_addr = hv_context.synic_event_page[cpu]; | ||
| 458 | if (page_addr == NULL) | ||
| 459 | return IRQ_NONE; | ||
| 460 | |||
| 461 | event = (union hv_synic_event_flags *)page_addr + | ||
| 462 | VMBUS_MESSAGE_SINT; | ||
| 457 | /* | 463 | /* |
| 458 | * Check for events before checking for messages. This is the order | 464 | * Check for events before checking for messages. This is the order |
| 459 | * in which events and messages are checked in Windows guests on | 465 | * in which events and messages are checked in Windows guests on |
| @@ -463,10 +469,6 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) | |||
| 463 | if ((vmbus_proto_version == VERSION_WS2008) || | 469 | if ((vmbus_proto_version == VERSION_WS2008) || |
| 464 | (vmbus_proto_version == VERSION_WIN7)) { | 470 | (vmbus_proto_version == VERSION_WIN7)) { |
| 465 | 471 | ||
| 466 | page_addr = hv_context.synic_event_page[cpu]; | ||
| 467 | event = (union hv_synic_event_flags *)page_addr + | ||
| 468 | VMBUS_MESSAGE_SINT; | ||
| 469 | |||
| 470 | /* Since we are a child, we only need to check bit 0 */ | 472 | /* Since we are a child, we only need to check bit 0 */ |
| 471 | if (sync_test_and_clear_bit(0, | 473 | if (sync_test_and_clear_bit(0, |
| 472 | (unsigned long *) &event->flags32[0])) { | 474 | (unsigned long *) &event->flags32[0])) { |
