diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d556e2186c..b5b4184782 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8026,7 +8026,7 @@ qemuDomainStorageSourceAccessModifyNVMe(virQEMUDriver *driver, goto revoke; } - if (qemuDomainAdjustMaxMemLock(vm, true) < 0) + if (qemuDomainAdjustMaxMemLockNVMe(vm, src) < 0) goto revoke; revoke_maxmemlock = true; @@ -9779,6 +9779,39 @@ qemuDomainAdjustMaxMemLockHostdev(virDomainObj *vm, } +/** + * qemuDomainAdjustMaxMemLockNVMe: + * @vm: domain object + * @src: disk source + * + * Temporarily add the disk source to the domain definition, + * adjust the max memlock based in this new definition and + * restore the original definition. + * + * Returns: 0 on success, + * -1 on failure. + */ +int +qemuDomainAdjustMaxMemLockNVMe(virDomainObj *vm, + virStorageSource *src) +{ + g_autofree virDomainDiskDef *disk = NULL; + int ret = 0; + + disk = g_new0(virDomainDiskDef, 1); + disk->src = src; + + VIR_APPEND_ELEMENT_COPY(vm->def->disks, vm->def->ndisks, disk); + + if (qemuDomainAdjustMaxMemLock(vm, false) < 0) + ret = -1; + + VIR_DELETE_ELEMENT_INPLACE(vm->def->disks, vm->def->ndisks - 1, vm->def->ndisks); + + return ret; +} + + /** * qemuDomainHasVcpuPids: * @vm: Domain object diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index eaa75de3e5..ee2ddda079 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -41,6 +41,7 @@ #include "virdomainmomentobjlist.h" #include "virenum.h" #include "vireventthread.h" +#include "storage_source_conf.h" #define QEMU_DOMAIN_FORMAT_LIVE_FLAGS \ (VIR_DOMAIN_XML_SECURE) @@ -859,6 +860,8 @@ int qemuDomainAdjustMaxMemLock(virDomainObj *vm, bool forceVFIO); int qemuDomainAdjustMaxMemLockHostdev(virDomainObj *vm, virDomainHostdevDef *hostdev); +int qemuDomainAdjustMaxMemLockNVMe(virDomainObj *vm, + virStorageSource *src); int qemuDomainSetMaxMemLock(virDomainObj *vm, unsigned long long limit, unsigned long long *origPtr);