]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mshv: Handle insufficient contiguous memory hypervisor status
authorStanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Thu, 5 Feb 2026 18:42:21 +0000 (18:42 +0000)
committerWei Liu <wei.liu@kernel.org>
Thu, 19 Feb 2026 06:39:16 +0000 (06:39 +0000)
The HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY status indicates that the
hypervisor lacks sufficient contiguous memory for its internal allocations.

When this status is encountered, allocate and deposit
HV_MAX_CONTIGUOUS_ALLOCATION_PAGES contiguous pages to the hypervisor.
HV_MAX_CONTIGUOUS_ALLOCATION_PAGES is defined in the hypervisor headers, a
deposit of this size will always satisfy the hypervisor's requirements.

Signed-off-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Reviewed-by: Anirudh Rayabharam (Microsoft) <anirudh@anirudhrb.com>
Reviewed-by: Mukesh R <mrathor@linux.microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
drivers/hv/hv_common.c
drivers/hv/hv_proc.c
include/hyperv/hvgdk_mini.h
include/hyperv/hvhdk_mini.h

index f1c17fb60dc183ddc16b83cf49b916ac253ad53b..f205962766620226b4f2b557ffeef25e717a1c53 100644 (file)
@@ -793,6 +793,7 @@ static const struct hv_status_info hv_status_infos[] = {
        _STATUS_INFO(HV_STATUS_UNKNOWN_PROPERTY,                -EIO),
        _STATUS_INFO(HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE,     -EIO),
        _STATUS_INFO(HV_STATUS_INSUFFICIENT_MEMORY,             -ENOMEM),
+       _STATUS_INFO(HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY,  -ENOMEM),
        _STATUS_INFO(HV_STATUS_INVALID_PARTITION_ID,            -EINVAL),
        _STATUS_INFO(HV_STATUS_INVALID_VP_INDEX,                -EINVAL),
        _STATUS_INFO(HV_STATUS_NOT_FOUND,                       -EIO),
index 53622e5886b89ba5229aa7c314d34e7db24dfb4b..181f6d02bce35f17f78de1d12fda3bcb610782d9 100644 (file)
@@ -118,6 +118,9 @@ int hv_deposit_memory_node(int node, u64 partition_id,
        switch (hv_result(hv_status)) {
        case HV_STATUS_INSUFFICIENT_MEMORY:
                break;
+       case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
+               num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
+               break;
        default:
                hv_status_err(hv_status, "Unexpected!\n");
                return -ENOMEM;
@@ -130,6 +133,7 @@ bool hv_result_needs_memory(u64 status)
 {
        switch (hv_result(status)) {
        case HV_STATUS_INSUFFICIENT_MEMORY:
+       case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
                return true;
        }
        return false;
index d9aa5afb0a27ad9930bbafc984f020034df592c0..fa2fb91a6470ebccc82bd6784aff362a7ce54c00 100644 (file)
@@ -38,6 +38,7 @@ struct hv_u128 {
 #define HV_STATUS_INVALID_LP_INDEX                 0x41
 #define HV_STATUS_INVALID_REGISTER_VALUE           0x50
 #define HV_STATUS_OPERATION_FAILED                 0x71
+#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY    0x75
 #define HV_STATUS_TIME_OUT                         0x78
 #define HV_STATUS_CALL_PENDING                     0x79
 #define HV_STATUS_VTL_ALREADY_ENABLED              0x86
index c0300910808b6915b4cb58de60d29f1904cc663e..091c03e26046d8bbd2fbc4ff35f9d0610f756e7b 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "hvgdk_mini.h"
 
+#define HV_MAX_CONTIGUOUS_ALLOCATION_PAGES     8
+
 /*
  * Doorbell connection_info flags.
  */