mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Extract logic to determine the mlock limit size for VFIO
New function qemuDomainGetMlockLimitBytes will now handle the calculation so that it unifies the logic to one place and allows later reuse.
This commit is contained in:
parent
feaba3e179
commit
fbc58cfcae
@ -11447,22 +11447,8 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mlock) {
|
if (mlock)
|
||||||
unsigned long long memKB;
|
virCommandSetMaxMemLock(cmd, qemuDomainGetMlockLimitBytes(def));
|
||||||
|
|
||||||
/* VFIO requires all of the guest's memory to be
|
|
||||||
* locked resident, plus some amount for IO
|
|
||||||
* space. Alex Williamson suggested adding 1GiB for IO
|
|
||||||
* space just to be safe (some finer tuning might be
|
|
||||||
* nice, though).
|
|
||||||
*/
|
|
||||||
if (virMemoryLimitIsSet(def->mem.hard_limit))
|
|
||||||
memKB = def->mem.hard_limit;
|
|
||||||
else
|
|
||||||
memKB = virDomainDefGetMemoryActual(def) + 1024 * 1024;
|
|
||||||
|
|
||||||
virCommandSetMaxMemLock(cmd, memKB * 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSG_TIMESTAMP) &&
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSG_TIMESTAMP) &&
|
||||||
cfg->logTimestamp)
|
cfg->logTimestamp)
|
||||||
|
@ -3616,3 +3616,30 @@ qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemuDomainGetMlockLimitBytes:
|
||||||
|
*
|
||||||
|
* @def: domain definition
|
||||||
|
*
|
||||||
|
* Returns the size of the memory in bytes that needs to be set as
|
||||||
|
* RLIMIT_MEMLOCK for purpose of VFIO device passthrough.
|
||||||
|
* If a mem.hard_limit is set, then that value is preferred; otherwise, the
|
||||||
|
* value returned may depend upon the architecture or devices present.
|
||||||
|
*/
|
||||||
|
unsigned long long
|
||||||
|
qemuDomainGetMlockLimitBytes(virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
unsigned long long memKB;
|
||||||
|
|
||||||
|
/* VFIO requires all of the guest's memory to be locked resident, plus some
|
||||||
|
* amount for IO space. Alex Williamson suggested adding 1GiB for IO space
|
||||||
|
* just to be safe (some finer tuning might be nice, though). */
|
||||||
|
if (virMemoryLimitIsSet(def->mem.hard_limit))
|
||||||
|
memKB = def->mem.hard_limit;
|
||||||
|
else
|
||||||
|
memKB = virDomainDefGetMemoryActual(def) + 1024 * 1024;
|
||||||
|
|
||||||
|
return memKB << 10;
|
||||||
|
}
|
||||||
|
@ -482,4 +482,6 @@ bool qemuDomainMachineIsS390CCW(const virDomainDef *def);
|
|||||||
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
|
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
|
unsigned long long qemuDomainGetMlockLimitBytes(virDomainDefPtr def);
|
||||||
|
|
||||||
#endif /* __QEMU_DOMAIN_H__ */
|
#endif /* __QEMU_DOMAIN_H__ */
|
||||||
|
@ -1254,7 +1254,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
|
|||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
bool teardownlabel = false;
|
bool teardownlabel = false;
|
||||||
int backend;
|
int backend;
|
||||||
unsigned long long memKB;
|
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
|
|
||||||
@ -1279,20 +1278,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* VFIO requires all of the guest's memory to be locked
|
/* setup memory locking limits, that are necessary for VFIO */
|
||||||
* resident (plus an additional 1GiB to cover IO space). During
|
virProcessSetMaxMemLock(vm->pid, qemuDomainGetMlockLimitBytes(vm->def));
|
||||||
* hotplug, the guest's memory may already be locked, but it
|
|
||||||
* doesn't hurt to "change" the limit to the same value.
|
|
||||||
* NB: the domain's memory tuning parameters are stored as
|
|
||||||
* Kibibytes, but virProcessSetMaxMemLock expects the value in
|
|
||||||
* bytes.
|
|
||||||
*/
|
|
||||||
if (virMemoryLimitIsSet(vm->def->mem.hard_limit))
|
|
||||||
memKB = vm->def->mem.hard_limit;
|
|
||||||
else
|
|
||||||
memKB = virDomainDefGetMemoryActual(vm->def) + (1024 * 1024);
|
|
||||||
|
|
||||||
virProcessSetMaxMemLock(vm->pid, memKB * 1024);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user