Skip to content

Commit cf82dd5

Browse files
Stanislav Kinsburskiiliuw
authored andcommitted
mshv: Handle insufficient contiguous memory hypervisor status
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>
1 parent ede5438 commit cf82dd5

4 files changed

Lines changed: 8 additions & 0 deletions

File tree

drivers/hv/hv_common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,7 @@ static const struct hv_status_info hv_status_infos[] = {
793793
_STATUS_INFO(HV_STATUS_UNKNOWN_PROPERTY, -EIO),
794794
_STATUS_INFO(HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE, -EIO),
795795
_STATUS_INFO(HV_STATUS_INSUFFICIENT_MEMORY, -ENOMEM),
796+
_STATUS_INFO(HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY, -ENOMEM),
796797
_STATUS_INFO(HV_STATUS_INVALID_PARTITION_ID, -EINVAL),
797798
_STATUS_INFO(HV_STATUS_INVALID_VP_INDEX, -EINVAL),
798799
_STATUS_INFO(HV_STATUS_NOT_FOUND, -EIO),

drivers/hv/hv_proc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ int hv_deposit_memory_node(int node, u64 partition_id,
118118
switch (hv_result(hv_status)) {
119119
case HV_STATUS_INSUFFICIENT_MEMORY:
120120
break;
121+
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
122+
num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES;
123+
break;
121124
default:
122125
hv_status_err(hv_status, "Unexpected!\n");
123126
return -ENOMEM;
@@ -130,6 +133,7 @@ bool hv_result_needs_memory(u64 status)
130133
{
131134
switch (hv_result(status)) {
132135
case HV_STATUS_INSUFFICIENT_MEMORY:
136+
case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY:
133137
return true;
134138
}
135139
return false;

include/hyperv/hvgdk_mini.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct hv_u128 {
3838
#define HV_STATUS_INVALID_LP_INDEX 0x41
3939
#define HV_STATUS_INVALID_REGISTER_VALUE 0x50
4040
#define HV_STATUS_OPERATION_FAILED 0x71
41+
#define HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY 0x75
4142
#define HV_STATUS_TIME_OUT 0x78
4243
#define HV_STATUS_CALL_PENDING 0x79
4344
#define HV_STATUS_VTL_ALREADY_ENABLED 0x86

include/hyperv/hvhdk_mini.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "hvgdk_mini.h"
99

10+
#define HV_MAX_CONTIGUOUS_ALLOCATION_PAGES 8
11+
1012
/*
1113
* Doorbell connection_info flags.
1214
*/

0 commit comments

Comments
 (0)