From: Linus Torvalds Date: Thu, 15 Oct 2020 22:48:06 +0000 (-0700) Subject: Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyper... X-Git-Url: https://repo.jachan.dev/J-linux.git/commitdiff_plain/2d0f6b0aab9afbd6fdf3514cb4acc249d7aebf9c?hp=-c Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux Pull another Hyper-V update from Wei Liu: "One patch from Michael to get VMbus interrupt from ACPI DSDT" * tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux: Drivers: hv: vmbus: Add parsing of VMbus interrupt in ACPI DSDT --- 2d0f6b0aab9afbd6fdf3514cb4acc249d7aebf9c diff --combined drivers/hv/vmbus_drv.c index 7b8816c2e5f9,4217646decf1..4fad3e6745e5 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@@ -48,6 -48,10 +48,10 @@@ static int hyperv_cpuhp_online static void *hv_panic_page; + /* Values parsed from ACPI DSDT */ + static int vmbus_irq; + int vmbus_interrupt; + /* * Boolean to control whether to report panic messages over Hyper-V. * @@@ -1347,7 -1351,7 +1351,7 @@@ static void vmbus_isr(void tasklet_schedule(&hv_cpu->msg_dpc); } - add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); + add_interrupt_randomness(hv_get_vector(), 0); } /* @@@ -1430,7 -1434,9 +1434,9 @@@ static int vmbus_bus_init(void if (ret) return ret; - hv_setup_vmbus_irq(vmbus_isr); + ret = hv_setup_vmbus_irq(vmbus_irq, vmbus_isr); + if (ret) + goto err_setup; ret = hv_synic_alloc(); if (ret) @@@ -1505,7 -1511,7 +1511,7 @@@ err_cpuhp hv_synic_free(); err_alloc: hv_remove_vmbus_irq(); - + err_setup: bus_unregister(&hv_bus); unregister_sysctl_table(hv_ctl_table_hdr); hv_ctl_table_hdr = NULL; @@@ -2070,6 -2076,7 +2076,7 @@@ static acpi_status vmbus_walk_resources struct resource *new_res; struct resource **old_res = &hyperv_mmio; struct resource **prev_res = NULL; + struct resource r; switch (res->type) { @@@ -2088,6 -2095,23 +2095,23 @@@ end = res->data.address64.address.maximum; break; + /* + * The IRQ information is needed only on ARM64, which Hyper-V + * sets up in the extended format. IRQ information is present + * on x86/x64 in the non-extended format but it is not used by + * Linux. So don't bother checking for the non-extended format. + */ + case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: + if (!acpi_dev_resource_interrupt(res, 0, &r)) { + pr_err("Unable to parse Hyper-V ACPI interrupt\n"); + return AE_ERROR; + } + /* ARM64 INTID for VMbus */ + vmbus_interrupt = res->data.extended_irq.interrupts[0]; + /* Linux IRQ number */ + vmbus_irq = r.start; + return AE_OK; + default: /* Unused resource type */ return AE_OK; @@@ -2382,10 -2406,7 +2406,10 @@@ static int vmbus_bus_suspend(struct dev if (atomic_read(&vmbus_connection.nr_chan_close_on_suspend) > 0) wait_for_completion(&vmbus_connection.ready_for_suspend_event); - WARN_ON(atomic_read(&vmbus_connection.nr_chan_fixup_on_resume) != 0); + if (atomic_read(&vmbus_connection.nr_chan_fixup_on_resume) != 0) { + pr_err("Can not suspend due to a previous failed resuming\n"); + return -EBUSY; + } mutex_lock(&vmbus_connection.channel_mutex); @@@ -2459,9 -2480,7 +2483,9 @@@ static int vmbus_bus_resume(struct devi vmbus_request_offers(); - wait_for_completion(&vmbus_connection.ready_for_resume_event); + if (wait_for_completion_timeout( + &vmbus_connection.ready_for_resume_event, 10 * HZ) == 0) + pr_err("Some vmbus device is missing after suspending?\n"); /* Reset the event for the next suspend. */ reinit_completion(&vmbus_connection.ready_for_suspend_event);