When creating guest partition objects, the hypervisor may fail to
allocate root partition pages and return an insufficient memory status.
In this case, deposit memory using the root partition ID instead.

Note: This error should never occur in a guest of L1VH partition context.

Signed-off-by: Stanislav Kinsburskii <[email protected]>
---
 drivers/hv/hv_common.c      |    2 +
 drivers/hv/hv_proc.c        |   14 ++++++++++
 include/hyperv/hvgdk_mini.h |   58 ++++++++++++++++++++++---------------------
 3 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
index c7f63c9de503..cab0d1733607 100644
--- a/drivers/hv/hv_common.c
+++ b/drivers/hv/hv_common.c
@@ -792,6 +792,8 @@ static const struct hv_status_info hv_status_infos[] = {
        _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_INSUFFICIENT_ROOT_MEMORY,        -ENOMEM),
+       _STATUS_INFO(HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_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),
diff --git a/drivers/hv/hv_proc.c b/drivers/hv/hv_proc.c
index ac21e16f9348..89870c1b0087 100644
--- a/drivers/hv/hv_proc.c
+++ b/drivers/hv/hv_proc.c
@@ -122,6 +122,18 @@ int hv_deposit_memory_node(int node, u64 partition_id,
        case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
                num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
                break;
+
+       case HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY:
+               num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
+               fallthrough;
+       case HV_STATUS_INSUFFICIENT_ROOT_MEMORY:
+               if (!hv_root_partition()) {
+                       hv_status_err(hv_status, "Unexpected root memory 
deposit\n");
+                       return -ENOMEM;
+               }
+               partition_id = HV_PARTITION_ID_SELF;
+               break;
+
        default:
                hv_status_err(hv_status, "Unexpected!\n");
                return -ENOMEM;
@@ -135,6 +147,8 @@ bool hv_result_oom(u64 status)
        switch (hv_result(status)) {
        case HV_STATUS_INSUFFICIENT_MEMORY:
        case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
+       case HV_STATUS_INSUFFICIENT_ROOT_MEMORY:
+       case HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY:
                return true;
        }
        return false;
diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
index 70f22ef44948..5b74a857ef43 100644
--- a/include/hyperv/hvgdk_mini.h
+++ b/include/hyperv/hvgdk_mini.h
@@ -14,34 +14,36 @@ struct hv_u128 {
 } __packed;
 
 /* NOTE: when adding below, update hv_result_to_string() */
-#define HV_STATUS_SUCCESS                          0x0
-#define HV_STATUS_INVALID_HYPERCALL_CODE           0x2
-#define HV_STATUS_INVALID_HYPERCALL_INPUT          0x3
-#define HV_STATUS_INVALID_ALIGNMENT                0x4
-#define HV_STATUS_INVALID_PARAMETER                0x5
-#define HV_STATUS_ACCESS_DENIED                            0x6
-#define HV_STATUS_INVALID_PARTITION_STATE          0x7
-#define HV_STATUS_OPERATION_DENIED                 0x8
-#define HV_STATUS_UNKNOWN_PROPERTY                 0x9
-#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE      0xA
-#define HV_STATUS_INSUFFICIENT_MEMORY              0xB
-#define HV_STATUS_INVALID_PARTITION_ID             0xD
-#define HV_STATUS_INVALID_VP_INDEX                 0xE
-#define HV_STATUS_NOT_FOUND                        0x10
-#define HV_STATUS_INVALID_PORT_ID                  0x11
-#define HV_STATUS_INVALID_CONNECTION_ID                    0x12
-#define HV_STATUS_INSUFFICIENT_BUFFERS             0x13
-#define HV_STATUS_NOT_ACKNOWLEDGED                 0x14
-#define HV_STATUS_INVALID_VP_STATE                 0x15
-#define HV_STATUS_NO_RESOURCES                     0x1D
-#define HV_STATUS_PROCESSOR_FEATURE_NOT_SUPPORTED   0x20
-#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
+#define HV_STATUS_SUCCESS                              0x0
+#define HV_STATUS_INVALID_HYPERCALL_CODE               0x2
+#define HV_STATUS_INVALID_HYPERCALL_INPUT              0x3
+#define HV_STATUS_INVALID_ALIGNMENT                    0x4
+#define HV_STATUS_INVALID_PARAMETER                    0x5
+#define HV_STATUS_ACCESS_DENIED                                0x6
+#define HV_STATUS_INVALID_PARTITION_STATE              0x7
+#define HV_STATUS_OPERATION_DENIED                     0x8
+#define HV_STATUS_UNKNOWN_PROPERTY                     0x9
+#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE          0xA
+#define HV_STATUS_INSUFFICIENT_MEMORY                  0xB
+#define HV_STATUS_INVALID_PARTITION_ID                 0xD
+#define HV_STATUS_INVALID_VP_INDEX                     0xE
+#define HV_STATUS_NOT_FOUND                            0x10
+#define HV_STATUS_INVALID_PORT_ID                      0x11
+#define HV_STATUS_INVALID_CONNECTION_ID                        0x12
+#define HV_STATUS_INSUFFICIENT_BUFFERS                 0x13
+#define HV_STATUS_NOT_ACKNOWLEDGED                     0x14
+#define HV_STATUS_INVALID_VP_STATE                     0x15
+#define HV_STATUS_NO_RESOURCES                         0x1D
+#define HV_STATUS_PROCESSOR_FEATURE_NOT_SUPPORTED      0x20
+#define HV_STATUS_INVALID_LP_INDEX                     0x41
+#define HV_STATUS_INVALID_REGISTER_VALUE               0x50
+#define HV_STATUS_OPERATION_FAILED                     0x71
+#define HV_STATUS_INSUFFICIENT_ROOT_MEMORY             0x73
+#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY       0x75
+#define HV_STATUS_TIME_OUT                             0x78
+#define HV_STATUS_CALL_PENDING                         0x79
+#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY  0x83
+#define HV_STATUS_VTL_ALREADY_ENABLED                  0x86
 
 /*
  * The Hyper-V TimeRefCount register and the TSC



Reply via email to