[libvirt] [PATCH 1/2] qemu: Extract logic to determine the mlock limit size for VFIO
John Ferlan
jferlan at redhat.com
Fri Nov 6 16:54:53 UTC 2015
On 11/06/2015 10:47 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 | 17 +++++++++++++++++
> src/qemu/qemu_domain.h | 2 ++
> src/qemu/qemu_hotplug.c | 17 ++---------------
> 4 files changed, 23 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..8441d7a 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3616,3 +3616,20 @@ qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
>
> return 0;
> }
> +
> +
Should have intro comment /**... */ like other functions...
ACK with that
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