[PATCH 0/7] hyperv: some memory and scheduler APIs

Here's a GitLab merge request, if you'd prefer to review it there: https://gitlab.com/iammattcoleman/libvirt/-/merge_requests/9 Matt Coleman (7): hyperv: implement domainGetMaxMemory hyperv: move hypervDomainSetMemory and hypervDomainSetMemoryFlags hyperv: implement domainSetMaxMemory hyperv: add hypervMsvmVSMSModifyResourceSettings hyperv: refactor hypervDomainSetMemoryProperty hyperv: implement domainGetScheduler* news: some memory and scheduler Hyper-V APIs NEWS.rst | 7 + src/hyperv/hyperv_driver.c | 253 ++++++++++++++++++++++++++----------- src/hyperv/hyperv_wmi.c | 37 ++++++ src/hyperv/hyperv_wmi.h | 8 ++ 4 files changed, 233 insertions(+), 72 deletions(-) -- 2.27.0

Co-authored-by: Sri Ramanujam <sramanujam@datto.com> Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_driver.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index b789ef58e8..67b8b771d9 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -905,6 +905,33 @@ hypervDomainGetOSType(virDomainPtr domain G_GNUC_UNUSED) } +static unsigned long long +hypervDomainGetMaxMemory(virDomainPtr domain) +{ + char uuid_string[VIR_UUID_STRING_BUFLEN]; + hypervPrivate *priv = domain->conn->privateData; + Msvm_VirtualSystemSettingData *vssd = NULL; + Msvm_MemorySettingData *mem_sd = NULL; + int maxMemoryBytes = 0; + + virUUIDFormat(domain->uuid, uuid_string); + + if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0) + goto cleanup; + + if (hypervGetMemorySD(priv, vssd->data->InstanceID, &mem_sd) < 0) + goto cleanup; + + maxMemoryBytes = mem_sd->data->Limit * 1024; + + cleanup: + hypervFreeObject(priv, (hypervObject *)vssd); + hypervFreeObject(priv, (hypervObject *)mem_sd); + + return maxMemoryBytes; +} + + static int hypervDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { @@ -1765,6 +1792,7 @@ static virHypervisorDriver hypervHypervisorDriver = { .domainDestroy = hypervDomainDestroy, /* 0.9.5 */ .domainDestroyFlags = hypervDomainDestroyFlags, /* 0.9.5 */ .domainGetOSType = hypervDomainGetOSType, /* 0.9.5 */ + .domainGetMaxMemory = hypervDomainGetMaxMemory, /* 6.10.0 */ .domainGetInfo = hypervDomainGetInfo, /* 0.9.5 */ .domainGetState = hypervDomainGetState, /* 0.9.5 */ .domainGetXMLDesc = hypervDomainGetXMLDesc, /* 0.9.5 */ -- 2.27.0

This matches their placement in struct _virHypervisorDriver. Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_driver.c | 144 ++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 67b8b771d9..e779b67d00 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -932,6 +932,76 @@ hypervDomainGetMaxMemory(virDomainPtr domain) } +static int +hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, + unsigned int flags) +{ + int result = -1; + char uuid_string[VIR_UUID_STRING_BUFLEN]; + hypervPrivate *priv = domain->conn->privateData; + char *memory_str = NULL; + g_autoptr(hypervInvokeParamsList) params = NULL; + unsigned long memory_mb = VIR_ROUND_UP(VIR_DIV_UP(memory, 1024), 2); + Msvm_VirtualSystemSettingData *vssd = NULL; + Msvm_MemorySettingData *memsd = NULL; + g_autoptr(GHashTable) memResource = NULL; + + virCheckFlags(0, -1); + + memory_str = g_strdup_printf("%lu", memory_mb); + + virUUIDFormat(domain->uuid, uuid_string); + + if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0) + goto cleanup; + + if (hypervGetMemorySD(priv, vssd->data->InstanceID, &memsd) < 0) + goto cleanup; + + params = hypervCreateInvokeParamsList("ModifyResourceSettings", + MSVM_VIRTUALSYSTEMMANAGEMENTSERVICE_SELECTOR, + Msvm_VirtualSystemManagementService_WmiInfo); + + if (!params) + goto cleanup; + + memResource = hypervCreateEmbeddedParam(Msvm_MemorySettingData_WmiInfo); + if (!memResource) + goto cleanup; + + if (hypervSetEmbeddedProperty(memResource, "VirtualQuantity", memory_str) < 0) + goto cleanup; + + if (hypervSetEmbeddedProperty(memResource, "InstanceID", memsd->data->InstanceID) < 0) + goto cleanup; + + if (hypervAddEmbeddedParam(params, "ResourceSettings", + &memResource, Msvm_MemorySettingData_WmiInfo) < 0) { + hypervFreeEmbeddedParam(memResource); + goto cleanup; + } + + if (hypervInvokeMethod(priv, ¶ms, NULL) < 0) + goto cleanup; + + result = 0; + + cleanup: + VIR_FREE(memory_str); + hypervFreeObject(priv, (hypervObject *)vssd); + hypervFreeObject(priv, (hypervObject *)memsd); + + return result; +} + + +static int +hypervDomainSetMemory(virDomainPtr domain, unsigned long memory) +{ + return hypervDomainSetMemoryFlags(domain, memory, 0); +} + + static int hypervDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { @@ -1697,76 +1767,6 @@ hypervDomainSendKey(virDomainPtr domain, unsigned int codeset, } -static int -hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, - unsigned int flags) -{ - int result = -1; - char uuid_string[VIR_UUID_STRING_BUFLEN]; - hypervPrivate *priv = domain->conn->privateData; - char *memory_str = NULL; - g_autoptr(hypervInvokeParamsList) params = NULL; - unsigned long memory_mb = VIR_ROUND_UP(VIR_DIV_UP(memory, 1024), 2); - Msvm_VirtualSystemSettingData *vssd = NULL; - Msvm_MemorySettingData *memsd = NULL; - g_autoptr(GHashTable) memResource = NULL; - - virCheckFlags(0, -1); - - memory_str = g_strdup_printf("%lu", memory_mb); - - virUUIDFormat(domain->uuid, uuid_string); - - if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0) - goto cleanup; - - if (hypervGetMemorySD(priv, vssd->data->InstanceID, &memsd) < 0) - goto cleanup; - - params = hypervCreateInvokeParamsList("ModifyResourceSettings", - MSVM_VIRTUALSYSTEMMANAGEMENTSERVICE_SELECTOR, - Msvm_VirtualSystemManagementService_WmiInfo); - - if (!params) - goto cleanup; - - memResource = hypervCreateEmbeddedParam(Msvm_MemorySettingData_WmiInfo); - if (!memResource) - goto cleanup; - - if (hypervSetEmbeddedProperty(memResource, "VirtualQuantity", memory_str) < 0) - goto cleanup; - - if (hypervSetEmbeddedProperty(memResource, "InstanceID", memsd->data->InstanceID) < 0) - goto cleanup; - - if (hypervAddEmbeddedParam(params, "ResourceSettings", - &memResource, Msvm_MemorySettingData_WmiInfo) < 0) { - hypervFreeEmbeddedParam(memResource); - goto cleanup; - } - - if (hypervInvokeMethod(priv, ¶ms, NULL) < 0) - goto cleanup; - - result = 0; - - cleanup: - VIR_FREE(memory_str); - hypervFreeObject(priv, (hypervObject *)vssd); - hypervFreeObject(priv, (hypervObject *)memsd); - - return result; -} - - -static int -hypervDomainSetMemory(virDomainPtr domain, unsigned long memory) -{ - return hypervDomainSetMemoryFlags(domain, memory, 0); -} - - static virHypervisorDriver hypervHypervisorDriver = { .name = "Hyper-V", .connectOpen = hypervConnectOpen, /* 0.9.5 */ @@ -1793,6 +1793,8 @@ static virHypervisorDriver hypervHypervisorDriver = { .domainDestroyFlags = hypervDomainDestroyFlags, /* 0.9.5 */ .domainGetOSType = hypervDomainGetOSType, /* 0.9.5 */ .domainGetMaxMemory = hypervDomainGetMaxMemory, /* 6.10.0 */ + .domainSetMemory = hypervDomainSetMemory, /* 3.6.0 */ + .domainSetMemoryFlags = hypervDomainSetMemoryFlags, /* 3.6.0 */ .domainGetInfo = hypervDomainGetInfo, /* 0.9.5 */ .domainGetState = hypervDomainGetState, /* 0.9.5 */ .domainGetXMLDesc = hypervDomainGetXMLDesc, /* 0.9.5 */ @@ -1812,8 +1814,6 @@ static virHypervisorDriver hypervHypervisorDriver = { .domainHasManagedSaveImage = hypervDomainHasManagedSaveImage, /* 0.9.5 */ .domainManagedSaveRemove = hypervDomainManagedSaveRemove, /* 0.9.5 */ .domainSendKey = hypervDomainSendKey, /* 3.6.0 */ - .domainSetMemory = hypervDomainSetMemory, /* 3.6.0 */ - .domainSetMemoryFlags = hypervDomainSetMemoryFlags, /* 3.6.0 */ .connectIsAlive = hypervConnectIsAlive, /* 0.9.8 */ }; -- 2.27.0

Co-authored-by: Sri Ramanujam <sramanujam@datto.com> Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_driver.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index e779b67d00..6d7bc4b80f 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -933,8 +933,8 @@ hypervDomainGetMaxMemory(virDomainPtr domain) static int -hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, - unsigned int flags) +hypervDomainSetMemoryProperty(virDomainPtr domain, unsigned long memory, + const char* propertyName) { int result = -1; char uuid_string[VIR_UUID_STRING_BUFLEN]; @@ -946,8 +946,6 @@ hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, Msvm_MemorySettingData *memsd = NULL; g_autoptr(GHashTable) memResource = NULL; - virCheckFlags(0, -1); - memory_str = g_strdup_printf("%lu", memory_mb); virUUIDFormat(domain->uuid, uuid_string); @@ -969,7 +967,7 @@ hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, if (!memResource) goto cleanup; - if (hypervSetEmbeddedProperty(memResource, "VirtualQuantity", memory_str) < 0) + if (hypervSetEmbeddedProperty(memResource, propertyName, memory_str) < 0) goto cleanup; if (hypervSetEmbeddedProperty(memResource, "InstanceID", memsd->data->InstanceID) < 0) @@ -995,6 +993,21 @@ hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, } +static int +hypervDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) +{ + return hypervDomainSetMemoryProperty(domain, memory, "Limit"); +} + + +static int +hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory, unsigned int flags) +{ + virCheckFlags(0, -1); + return hypervDomainSetMemoryProperty(domain, memory, "VirtualQuantity"); +} + + static int hypervDomainSetMemory(virDomainPtr domain, unsigned long memory) { @@ -1793,6 +1806,7 @@ static virHypervisorDriver hypervHypervisorDriver = { .domainDestroyFlags = hypervDomainDestroyFlags, /* 0.9.5 */ .domainGetOSType = hypervDomainGetOSType, /* 0.9.5 */ .domainGetMaxMemory = hypervDomainGetMaxMemory, /* 6.10.0 */ + .domainSetMaxMemory = hypervDomainSetMaxMemory, /* 6.10.0 */ .domainSetMemory = hypervDomainSetMemory, /* 3.6.0 */ .domainSetMemoryFlags = hypervDomainSetMemoryFlags, /* 3.6.0 */ .domainGetInfo = hypervDomainGetInfo, /* 0.9.5 */ -- 2.27.0

Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_wmi.c | 37 +++++++++++++++++++++++++++++++++++++ src/hyperv/hyperv_wmi.h | 8 ++++++++ 2 files changed, 45 insertions(+) diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c index 72a68c0591..866b347bc2 100644 --- a/src/hyperv/hyperv_wmi.c +++ b/src/hyperv/hyperv_wmi.c @@ -1542,3 +1542,40 @@ hypervGetMemorySD(hypervPrivate *priv, return 0; } + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Msvm_VirtualSystemManagementService + */ + +int +hypervMsvmVSMSModifyResourceSettings(hypervPrivate *priv, + GHashTable **resourceSettingsPtr, + hypervWmiClassInfoPtr wmiInfo) +{ + int result = -1; + GHashTable *resourceSettings = *resourceSettingsPtr; + g_autoptr(hypervInvokeParamsList) params = NULL; + + params = hypervCreateInvokeParamsList("ModifyResourceSettings", + MSVM_VIRTUALSYSTEMMANAGEMENTSERVICE_SELECTOR, + Msvm_VirtualSystemManagementService_WmiInfo); + + if (!params) + goto cleanup; + + if (hypervAddEmbeddedParam(params, "ResourceSettings", &resourceSettings, wmiInfo) < 0) { + hypervFreeEmbeddedParam(resourceSettings); + goto cleanup; + } + + if (hypervInvokeMethod(priv, ¶ms, NULL) < 0) + goto cleanup; + + result = 0; + + cleanup: + *resourceSettingsPtr = NULL; + + return result; +} diff --git a/src/hyperv/hyperv_wmi.h b/src/hyperv/hyperv_wmi.h index eb273ba7cf..34334a0153 100644 --- a/src/hyperv/hyperv_wmi.h +++ b/src/hyperv/hyperv_wmi.h @@ -243,3 +243,11 @@ int hypervGetProcessorSD(hypervPrivate *priv, int hypervGetMemorySD(hypervPrivate *priv, const char *vssd_instanceid, Msvm_MemorySettingData **list); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Msvm_VirtualSystemManagementService + */ + +int hypervMsvmVSMSModifyResourceSettings(hypervPrivate *priv, + GHashTable **resourceSettingsPtr, + hypervWmiClassInfoPtr wmiInfo); -- 2.27.0

* use hypervMsvmVSMSModifyResourceSettings() * improve the error message: say which property it failed to set * remove usage of VIR_FREE() Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_driver.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 6d7bc4b80f..e05c10d194 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -933,20 +933,17 @@ hypervDomainGetMaxMemory(virDomainPtr domain) static int -hypervDomainSetMemoryProperty(virDomainPtr domain, unsigned long memory, +hypervDomainSetMemoryProperty(virDomainPtr domain, + unsigned long memory, const char* propertyName) { int result = -1; char uuid_string[VIR_UUID_STRING_BUFLEN]; hypervPrivate *priv = domain->conn->privateData; - char *memory_str = NULL; - g_autoptr(hypervInvokeParamsList) params = NULL; - unsigned long memory_mb = VIR_ROUND_UP(VIR_DIV_UP(memory, 1024), 2); Msvm_VirtualSystemSettingData *vssd = NULL; Msvm_MemorySettingData *memsd = NULL; g_autoptr(GHashTable) memResource = NULL; - - memory_str = g_strdup_printf("%lu", memory_mb); + g_autofree char *memory_str = g_strdup_printf("%lu", VIR_ROUND_UP(VIR_DIV_UP(memory, 1024), 2)); virUUIDFormat(domain->uuid, uuid_string); @@ -956,13 +953,6 @@ hypervDomainSetMemoryProperty(virDomainPtr domain, unsigned long memory, if (hypervGetMemorySD(priv, vssd->data->InstanceID, &memsd) < 0) goto cleanup; - params = hypervCreateInvokeParamsList("ModifyResourceSettings", - MSVM_VIRTUALSYSTEMMANAGEMENTSERVICE_SELECTOR, - Msvm_VirtualSystemManagementService_WmiInfo); - - if (!params) - goto cleanup; - memResource = hypervCreateEmbeddedParam(Msvm_MemorySettingData_WmiInfo); if (!memResource) goto cleanup; @@ -973,19 +963,13 @@ hypervDomainSetMemoryProperty(virDomainPtr domain, unsigned long memory, if (hypervSetEmbeddedProperty(memResource, "InstanceID", memsd->data->InstanceID) < 0) goto cleanup; - if (hypervAddEmbeddedParam(params, "ResourceSettings", - &memResource, Msvm_MemorySettingData_WmiInfo) < 0) { - hypervFreeEmbeddedParam(memResource); - goto cleanup; - } - - if (hypervInvokeMethod(priv, ¶ms, NULL) < 0) + if (hypervMsvmVSMSModifyResourceSettings(priv, &memResource, + Msvm_MemorySettingData_WmiInfo) < 0) goto cleanup; result = 0; cleanup: - VIR_FREE(memory_str); hypervFreeObject(priv, (hypervObject *)vssd); hypervFreeObject(priv, (hypervObject *)memsd); -- 2.27.0

Co-authored-by: Sri Ramanujam <sramanujam@datto.com> Signed-off-by: Matt Coleman <matt@datto.com> --- src/hyperv/hyperv_driver.c | 83 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index e05c10d194..9fda0d6047 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -1354,6 +1354,86 @@ hypervDomainSetAutostart(virDomainPtr domain, int autostart) } +static char * +hypervDomainGetSchedulerType(virDomainPtr domain G_GNUC_UNUSED, int *nparams) +{ + if (nparams) + *nparams = 3; /* reservation, limit, weight */ + + return g_strdup("allocation"); +} + + +static int +hypervDomainGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, unsigned int flags) +{ + hypervPrivate *priv = domain->conn->privateData; + Msvm_ComputerSystem *computerSystem = NULL; + Msvm_VirtualSystemSettingData *vssd = NULL; + Msvm_ProcessorSettingData *proc_sd = NULL; + char uuid_string[VIR_UUID_STRING_BUFLEN]; + int saved_nparams = 0; + int result = -1; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0) + goto cleanup; + + /* get info from host */ + virUUIDFormat(domain->uuid, uuid_string); + + if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0) + goto cleanup; + + if (hypervGetProcessorSD(priv, vssd->data->InstanceID, &proc_sd) < 0) + goto cleanup; + + /* parse it all out */ + if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_SCHEDULER_LIMIT, + VIR_TYPED_PARAM_LLONG, proc_sd->data->Limit) < 0) + goto cleanup; + saved_nparams++; + + if (*nparams > saved_nparams) { + if (virTypedParameterAssign(¶ms[1], VIR_DOMAIN_SCHEDULER_RESERVATION, + VIR_TYPED_PARAM_LLONG, proc_sd->data->Reservation) < 0) + goto cleanup; + saved_nparams++; + } + + if (*nparams > saved_nparams) { + if (virTypedParameterAssign(¶ms[2], VIR_DOMAIN_SCHEDULER_WEIGHT, + VIR_TYPED_PARAM_UINT, proc_sd->data->Weight) < 0) + goto cleanup; + saved_nparams++; + } + + *nparams = saved_nparams; + + result = 0; + + cleanup: + hypervFreeObject(priv, (hypervObject *)computerSystem); + hypervFreeObject(priv, (hypervObject *)vssd); + hypervFreeObject(priv, (hypervObject *)proc_sd); + + return result; +} + + +static int +hypervDomainGetSchedulerParameters(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams) +{ + return hypervDomainGetSchedulerParametersFlags(domain, params, nparams, + VIR_DOMAIN_AFFECT_CURRENT); +} + + static unsigned long long hypervNodeGetFreeMemory(virConnectPtr conn) { @@ -1802,6 +1882,9 @@ static virHypervisorDriver hypervHypervisorDriver = { .domainCreateWithFlags = hypervDomainCreateWithFlags, /* 0.9.5 */ .domainGetAutostart = hypervDomainGetAutostart, /* 6.9.0 */ .domainSetAutostart = hypervDomainSetAutostart, /* 6.9.0 */ + .domainGetSchedulerType = hypervDomainGetSchedulerType, /* 6.10.0 */ + .domainGetSchedulerParameters = hypervDomainGetSchedulerParameters, /* 6.10.0 */ + .domainGetSchedulerParametersFlags = hypervDomainGetSchedulerParametersFlags, /* 6.10.0 */ .nodeGetFreeMemory = hypervNodeGetFreeMemory, /* 6.9.0 */ .connectIsEncrypted = hypervConnectIsEncrypted, /* 0.9.5 */ .connectIsSecure = hypervConnectIsSecure, /* 0.9.5 */ -- 2.27.0

Signed-off-by: Matt Coleman <matt@datto.com> --- NEWS.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 0e56f5dbca..8b60a5da11 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -13,6 +13,13 @@ v6.10.0 (unreleased) * **New features** + * hyperv: implement new APIs + + The `virDomainGetMaxMemory()``, ``virDomainSetMaxMemory()``, + ``virDomainGetSchedulerType()``, ``virDomainGetSchedulerParameters()``, and + ``virDomainGetSchedulerParametersFlags()`` APIs have been implemented in + the Hyper-V driver. + * **Improvements** * **Bug fixes** -- 2.27.0

On 11/11/20 7:48 AM, Matt Coleman wrote:
Here's a GitLab merge request, if you'd prefer to review it there: https://gitlab.com/iammattcoleman/libvirt/-/merge_requests/9
Matt Coleman (7): hyperv: implement domainGetMaxMemory hyperv: move hypervDomainSetMemory and hypervDomainSetMemoryFlags hyperv: implement domainSetMaxMemory hyperv: add hypervMsvmVSMSModifyResourceSettings hyperv: refactor hypervDomainSetMemoryProperty hyperv: implement domainGetScheduler* news: some memory and scheduler Hyper-V APIs
NEWS.rst | 7 + src/hyperv/hyperv_driver.c | 253 ++++++++++++++++++++++++++----------- src/hyperv/hyperv_wmi.c | 37 ++++++ src/hyperv/hyperv_wmi.h | 8 ++ 4 files changed, 233 insertions(+), 72 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> and pushed. Michal
participants (2)
-
Matt Coleman
-
Michal Privoznik