[libvirt] [PATCH v2 1/3] qemu: Extract logic to determine the mlock limit size for VFIO
John Ferlan
jferlan at redhat.com
Mon Nov 9 18:09:59 UTC 2015
On 11/09/2015 07:50 AM, Peter Krempa wrote:
> New function qemuDomainGetMlockLimitBytes will now handle the
> calculation so that it unifies the logic to one place and allows later
> reuse.
> ---
> src/qemu/qemu_command.c | 18 ++----------------
> src/qemu/qemu_domain.c | 27 +++++++++++++++++++++++++++
> src/qemu/qemu_domain.h | 2 ++
> src/qemu/qemu_hotplug.c | 17 ++---------------
> 4 files changed, 33 insertions(+), 31 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 8824541..9acf8e4 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -11447,22 +11447,8 @@ qemuBuildCommandLine(virConnectPtr conn,
> goto error;
> }
>
> - if (mlock) {
> - 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;
> -
> - virCommandSetMaxMemLock(cmd, memKB * 1024);
> - }
> + if (mlock)
> + virCommandSetMaxMemLock(cmd, qemuDomainGetMlockLimitBytes(def));
>
> if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSG_TIMESTAMP) &&
> cfg->logTimestamp)
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 890d8ed..a06624e 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3616,3 +3616,30 @@ qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
>
> 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. In cases where
> + * mem.hard_limit is set, the value is preferred,otherwise the value may depend
> + * on the device or architecture.
How about?
Returns the size of memory in bytes to allow a process (domain) to be
locked into RAM (e.g setrlimit RLIMIT_MEMLOCK). If a mem.hard_limit is
set, then that value is preferred; otherwise, the value returned may
depend upon the architecture or devices present, such as a VFIO
passthrough device.
ACK -
John
> + */
> +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;
> +}
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 64cd7e1..e34370b 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -482,4 +482,6 @@ bool qemuDomainMachineIsS390CCW(const virDomainDef *def);
> int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
> virDomainObjPtr vm);
>
> +unsigned long long qemuDomainGetMlockLimitBytes(virDomainDefPtr def);
> +
> #endif /* __QEMU_DOMAIN_H__ */
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 8f2fda9..e7fc036 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1254,7 +1254,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
> bool teardowncgroup = false;
> bool teardownlabel = false;
> int backend;
> - unsigned long long memKB;
> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> unsigned int flags = 0;
>
> @@ -1279,20 +1278,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
> goto error;
> }
>
> - /* VFIO requires all of the guest's memory to be locked
> - * resident (plus an additional 1GiB to cover IO space). During
> - * 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);
> + /* setup memory locking limits, that are necessary for VFIO */
> + virProcessSetMaxMemLock(vm->pid, qemuDomainGetMlockLimitBytes(vm->def));
> break;
>
> default:
>
More information about the libvir-list
mailing list