Re: [PATCH] x86/hyperv: reserve more vectors
Mukesh R <[email protected]> Mon, 10 Aug 2026 12:03:32 -0700
| Newsgroups | org.kernel.vger.linux-hyperv,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 8/10/26 08:35, Michael Kelley wrote: > From: [email protected] <[email protected]> Sent: Wednesday, July 29, 2026 5:50 PM >> >> Microsoft Hypervisor delivers three vectors to the NT HAL running in the >> root partition and refuses to map a device interrupt to any of them when >> interrupt remapping is not available in the system. As of writing, the > > s/of writing/of this writing/ > >> nested MSHV setup has no interrupt remapping capability. >> >> The three vectors are: >> >> HAL_NT_APC_VECTOR 0x1F >> HAL_NT_DPC_VECTOR 0x2F >> HAL_NT_CLOCK_IPI_VECTOR 0xD2 >> >> 0x1F is below FIRST_EXTERNAL_VECTOR so the vector allocator never hands >> it out, but 0x2F and 0xD2 are both inside the allocatable range and are >> handed out once enough vectors are in use. Mapping such an interrupt >> then fails with HV_STATUS_INVALID_PARAMETER, and the interrupt is never >> delivered. >> >> Reserve all three next to the hypervisor debug vectors that are already >> kept out of the allocator's hands. >> >> Signed-off-by: Wei Liu <[email protected]> >> --- >> arch/x86/kernel/cpu/mshyperv.c | 21 ++++++++++++++++++--- >> 1 file changed, 18 insertions(+), 3 deletions(-) >> >> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c >> index 185d4f677ec0..229c7377a980 100644 >> --- a/arch/x86/kernel/cpu/mshyperv.c >> +++ b/arch/x86/kernel/cpu/mshyperv.c >> @@ -502,17 +502,32 @@ static void hv_reserve_irq_vectors(void) >> #define HYPERV_DBG_ASSERT_VECTOR 0x2C >> #define HYPERV_DBG_SERVICE_VECTOR 0x2D >> >> + /* >> + * The hypervisor delivers these three to the NT HAL and refuses to >> + * map a device interrupt to any of them. >> + * >> + * The hypervisor will provide a hint in the future when these >> + * vectors become available to use. >> + */ >> + #define HAL_NT_APC_VECTOR 0x1F >> + #define HAL_NT_DPC_VECTOR 0x2F >> + #define HAL_NT_CLOCK_IPI_VECTOR 0xD2 >> + >> if (cpu_feature_enabled(X86_FEATURE_FRED)) >> return; >> >> if (test_and_set_bit(HYPERV_DBG_ASSERT_VECTOR, system_vectors) || >> test_and_set_bit(HYPERV_DBG_SERVICE_VECTOR, system_vectors) || >> - test_and_set_bit(HYPERV_DBG_FASTFAIL_VECTOR, system_vectors)) >> + test_and_set_bit(HYPERV_DBG_FASTFAIL_VECTOR, system_vectors) || >> + test_and_set_bit(HAL_NT_APC_VECTOR, system_vectors) || >> + test_and_set_bit(HAL_NT_DPC_VECTOR, system_vectors) || >> + test_and_set_bit(HAL_NT_CLOCK_IPI_VECTOR, system_vectors)) > > Calling test_and_set_bit() explicitly for each of the 6 vectors seems right > on the border of where it would be better to declare a static array with > the vectors and loop through the array. The loop could also populate the > string to be output in the pr_info() statement below. But leaving it explicit > as you have done is probably simpler unless the vector list grows again. Simpler and better imo, but moreover, we want to discourage the list enlarging, if anything, i hope going forward we can shrink it back to absolutely minimum. Thanks, -Mukesh > Reviewed-by: Michael Kelley <[email protected]> > >> BUG(); >> >> - pr_info("Hyper-V: reserve vectors: 0x%x 0x%x 0x%x\n", >> + pr_info("Hyper-V: reserve vectors: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", >> HYPERV_DBG_ASSERT_VECTOR, HYPERV_DBG_SERVICE_VECTOR, >> - HYPERV_DBG_FASTFAIL_VECTOR); >> + HYPERV_DBG_FASTFAIL_VECTOR, HAL_NT_APC_VECTOR, >> + HAL_NT_DPC_VECTOR, HAL_NT_CLOCK_IPI_VECTOR); >> } >> >> static void __init ms_hyperv_init_platform(void) >> -- >> 2.53.0 >> >