mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-21 20:15:17 +00:00
qemu: Allow qemuDomainAdjustMaxMemLock() to restore previous value
When the function changes the memory lock limit for the first time, it will retrieve the current value and store it inside the virDomainObj for the domain. When the function is called again, if memory locking is no longer needed, it will be able to restore the memory locking limit to its original value.
This commit is contained in:
parent
b583e80cb8
commit
afbe1d4c56
@ -2420,6 +2420,9 @@ struct _virDomainObj {
|
||||
void (*privateDataFreeFunc)(void *);
|
||||
|
||||
int taint;
|
||||
|
||||
unsigned long long original_memlock; /* Original RLIMIT_MEMLOCK, zero if no
|
||||
* restore will be required later */
|
||||
};
|
||||
|
||||
typedef bool (*virDomainObjListACLFilter)(virConnectPtr conn,
|
||||
|
@ -4125,7 +4125,10 @@ qemuDomainRequiresMlock(virDomainDefPtr def)
|
||||
* Adjust the memory locking limit for the QEMU process associated to @vm, in
|
||||
* order to comply with VFIO or architecture requirements.
|
||||
*
|
||||
* The limit will not be changed unless doing so is needed.
|
||||
* The limit will not be changed unless doing so is needed; the first time
|
||||
* the limit is changed, the original (default) limit is stored in @vm and
|
||||
* that value will be restored if qemuDomainAdjustMaxMemLock() is called once
|
||||
* memory locking is no longer required.
|
||||
*
|
||||
* Returns: 0 on success, <0 on failure
|
||||
*/
|
||||
@ -4135,8 +4138,22 @@ qemuDomainAdjustMaxMemLock(virDomainObjPtr vm)
|
||||
unsigned long long bytes = 0;
|
||||
int ret = -1;
|
||||
|
||||
if (qemuDomainRequiresMlock(vm->def))
|
||||
if (qemuDomainRequiresMlock(vm->def)) {
|
||||
/* If this is the first time adjusting the limit, save the current
|
||||
* value so that we can restore it once memory locking is no longer
|
||||
* required. Failing to obtain the current limit is not a critical
|
||||
* failure, it just means we'll be unable to lower it later */
|
||||
if (!vm->original_memlock) {
|
||||
if (virProcessGetMaxMemLock(vm->pid, &(vm->original_memlock)) < 0)
|
||||
vm->original_memlock = 0;
|
||||
}
|
||||
bytes = qemuDomainGetMlockLimitBytes(vm->def);
|
||||
} else {
|
||||
/* Once memory locking is no longer required, we can restore the
|
||||
* original, usually very low, limit */
|
||||
bytes = vm->original_memlock;
|
||||
vm->original_memlock = 0;
|
||||
}
|
||||
|
||||
/* Trying to set the memory locking limit to zero is a no-op */
|
||||
if (virProcessSetMaxMemLock(vm->pid, bytes) < 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user