Commit 158ebb57 authored by Stanislav Kinsburskii's avatar Stanislav Kinsburskii Committed by Wei Liu
Browse files

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: default avatarStanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Reviewed-by: default avatarAnirudh Rayabharam (Microsoft) <anirudh@anirudhrb.com>
Reviewed-by: default avatarMukesh R <mrathor@linux.microsoft.com>
Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent cf82dd5e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -794,6 +794,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),
+14 −0
Original line number Diff line number Diff line
@@ -121,6 +121,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;
@@ -134,6 +146,8 @@ bool hv_result_needs_memory(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;
+30 −28
Original line number Diff line number Diff line
@@ -38,9 +38,11 @@ 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_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

/*