K. Y. Srinivasan
2011-Jul-15 20:38 UTC
[PATCH 1/1] Staging: hv: vmbus: Don't wait indefinitely for IRQ resouces
If an attempt is made to load the vmbus driver on a non-Hyper-V platform,
the load operation will hang since we currently wait indefinitely to
retrieve the IRQ information. This is done in the context of an acpi callback
context (which will obviously not happen when this driver is
loaded on a non-Hyper-V platform). This patch fixes the problem.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 19 ++++++++++++++-----
1 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 433be51..b382829 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -702,7 +702,7 @@ static struct acpi_driver vmbus_acpi_driver = {
static int __init hv_acpi_init(void)
{
- int ret;
+ int ret, t;
init_completion(&probe_event);
@@ -715,16 +715,25 @@ static int __init hv_acpi_init(void)
if (ret)
return ret;
- wait_for_completion(&probe_event);
+ t = wait_for_completion_timeout(&probe_event, 5*HZ);
+ if (t == 0) {
+ ret = -ETIMEDOUT;
+ goto cleanup;
+ }
if (irq <= 0) {
- acpi_bus_unregister_driver(&vmbus_acpi_driver);
- return -ENODEV;
+ ret = -ENODEV;
+ goto cleanup;
}
ret = vmbus_bus_init(irq);
if (ret)
- acpi_bus_unregister_driver(&vmbus_acpi_driver);
+ goto cleanup;
+
+ return 0;
+
+cleanup:
+ acpi_bus_unregister_driver(&vmbus_acpi_driver);
return ret;
}
--
1.7.4.1
Reasonably Related Threads
- [PATCH 1/1] Staging: hv: vmbus: Don't wait indefinitely for IRQ resouces
- [PATCH 4.14 065/159] x86/virt: Add enum for hypervisors to replace x86_hyper
- [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
- [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
- [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
