Skip to content

Commit 158ebb5

Browse files
Stanislav Kinsburskiiliuw
authored andcommitted
mshv: Handle insufficient root memory hypervisor statuses
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. 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>
1 parent cf82dd5 commit 158ebb5

3 files changed

Lines changed: 46 additions & 28 deletions

File tree

drivers/hv/hv_common.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,8 @@ static const struct hv_status_info hv_status_infos[] = {
794794
_STATUS_INFO(HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE, -EIO),
795795
_STATUS_INFO(HV_STATUS_INSUFFICIENT_MEMORY, -ENOMEM),
796796
_STATUS_INFO(HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY, -ENOMEM),
797+
_STATUS_INFO(HV_STATUS_INSUFFICIENT_ROOT_MEMORY, -ENOMEM),
798+
_STATUS_INFO(HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY, -ENOMEM),
797799
_STATUS_INFO(HV_STATUS_INVALID_PARTITION_ID, -EINVAL),
798800
_STATUS_INFO(HV_STATUS_INVALID_VP_INDEX, -EINVAL),
799801
_STATUS_INFO(HV_STATUS_NOT_FOUND, -EIO),

drivers/hv/hv_proc.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ int hv_deposit_memory_node(int node, u64 partition_id,
121121
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
122122
num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
123123
break;
124+
125+
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY:
126+
num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
127+
fallthrough;
128+
case HV_STATUS_INSUFFICIENT_ROOT_MEMORY:
129+
if (!hv_root_partition()) {
130+
hv_status_err(hv_status, "Unexpected root memory deposit\n");
131+
return -ENOMEM;
132+
}
133+
partition_id = HV_PARTITION_ID_SELF;
134+
break;
135+
124136
default:
125137
hv_status_err(hv_status, "Unexpected!\n");
126138
return -ENOMEM;
@@ -134,6 +146,8 @@ bool hv_result_needs_memory(u64 status)
134146
switch (hv_result(status)) {
135147
case HV_STATUS_INSUFFICIENT_MEMORY:
136148
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
149+
case HV_STATUS_INSUFFICIENT_ROOT_MEMORY:
150+
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY:
137151
return true;
138152
}
139153
return false;

include/hyperv/hvgdk_mini.h

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,36 @@ struct hv_u128 {
1414
} __packed;
1515

1616
/* NOTE: when adding below, update hv_result_to_string() */
17-
#define HV_STATUS_SUCCESS 0x0
18-
#define HV_STATUS_INVALID_HYPERCALL_CODE 0x2
19-
#define HV_STATUS_INVALID_HYPERCALL_INPUT 0x3
20-
#define HV_STATUS_INVALID_ALIGNMENT 0x4
21-
#define HV_STATUS_INVALID_PARAMETER 0x5
22-
#define HV_STATUS_ACCESS_DENIED 0x6
23-
#define HV_STATUS_INVALID_PARTITION_STATE 0x7
24-
#define HV_STATUS_OPERATION_DENIED 0x8
25-
#define HV_STATUS_UNKNOWN_PROPERTY 0x9
26-
#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE 0xA
27-
#define HV_STATUS_INSUFFICIENT_MEMORY 0xB
28-
#define HV_STATUS_INVALID_PARTITION_ID 0xD
29-
#define HV_STATUS_INVALID_VP_INDEX 0xE
30-
#define HV_STATUS_NOT_FOUND 0x10
31-
#define HV_STATUS_INVALID_PORT_ID 0x11
32-
#define HV_STATUS_INVALID_CONNECTION_ID 0x12
33-
#define HV_STATUS_INSUFFICIENT_BUFFERS 0x13
34-
#define HV_STATUS_NOT_ACKNOWLEDGED 0x14
35-
#define HV_STATUS_INVALID_VP_STATE 0x15
36-
#define HV_STATUS_NO_RESOURCES 0x1D
37-
#define HV_STATUS_PROCESSOR_FEATURE_NOT_SUPPORTED 0x20
38-
#define HV_STATUS_INVALID_LP_INDEX 0x41
39-
#define HV_STATUS_INVALID_REGISTER_VALUE 0x50
40-
#define HV_STATUS_OPERATION_FAILED 0x71
41-
#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY 0x75
42-
#define HV_STATUS_TIME_OUT 0x78
43-
#define HV_STATUS_CALL_PENDING 0x79
44-
#define HV_STATUS_VTL_ALREADY_ENABLED 0x86
17+
#define HV_STATUS_SUCCESS 0x0
18+
#define HV_STATUS_INVALID_HYPERCALL_CODE 0x2
19+
#define HV_STATUS_INVALID_HYPERCALL_INPUT 0x3
20+
#define HV_STATUS_INVALID_ALIGNMENT 0x4
21+
#define HV_STATUS_INVALID_PARAMETER 0x5
22+
#define HV_STATUS_ACCESS_DENIED 0x6
23+
#define HV_STATUS_INVALID_PARTITION_STATE 0x7
24+
#define HV_STATUS_OPERATION_DENIED 0x8
25+
#define HV_STATUS_UNKNOWN_PROPERTY 0x9
26+
#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE 0xA
27+
#define HV_STATUS_INSUFFICIENT_MEMORY 0xB
28+
#define HV_STATUS_INVALID_PARTITION_ID 0xD
29+
#define HV_STATUS_INVALID_VP_INDEX 0xE
30+
#define HV_STATUS_NOT_FOUND 0x10
31+
#define HV_STATUS_INVALID_PORT_ID 0x11
32+
#define HV_STATUS_INVALID_CONNECTION_ID 0x12
33+
#define HV_STATUS_INSUFFICIENT_BUFFERS 0x13
34+
#define HV_STATUS_NOT_ACKNOWLEDGED 0x14
35+
#define HV_STATUS_INVALID_VP_STATE 0x15
36+
#define HV_STATUS_NO_RESOURCES 0x1D
37+
#define HV_STATUS_PROCESSOR_FEATURE_NOT_SUPPORTED 0x20
38+
#define HV_STATUS_INVALID_LP_INDEX 0x41
39+
#define HV_STATUS_INVALID_REGISTER_VALUE 0x50
40+
#define HV_STATUS_OPERATION_FAILED 0x71
41+
#define HV_STATUS_INSUFFICIENT_ROOT_MEMORY 0x73
42+
#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY 0x75
43+
#define HV_STATUS_TIME_OUT 0x78
44+
#define HV_STATUS_CALL_PENDING 0x79
45+
#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY 0x83
46+
#define HV_STATUS_VTL_ALREADY_ENABLED 0x86
4547

4648
/*
4749
* The Hyper-V TimeRefCount register and the TSC

0 commit comments

Comments
 (0)