提交 16bcb3b6 编写于 作者: M Michal Privoznik

qemu: Drop qemuDomainMemoryLimit

This function is to guess the correct limit for maximal memory
usage by qemu for given domain. This can never be guessed
correctly, not to mention all the pains and sleepless nights this
code has caused. Once somebody discovers algorithm to solve the
Halting Problem, we can compute the limit algorithmically. But
till then, this code should never see the light of the release
again.
上级 e0139e30
...@@ -428,8 +428,7 @@ qemuSetupMemoryCgroup(virDomainObjPtr vm) ...@@ -428,8 +428,7 @@ qemuSetupMemoryCgroup(virDomainObjPtr vm)
} }
} }
if (virCgroupSetMemoryHardLimit(priv->cgroup, if (virCgroupSetMemoryHardLimit(priv->cgroup, vm->def->mem.hard_limit) < 0)
qemuDomainMemoryLimit(vm->def)) < 0)
return -1; return -1;
if (vm->def->mem.soft_limit != 0 && if (vm->def->mem.soft_limit != 0 &&
......
...@@ -9220,7 +9220,7 @@ qemuBuildCommandLine(virConnectPtr conn, ...@@ -9220,7 +9220,7 @@ qemuBuildCommandLine(virConnectPtr conn,
} }
if (mlock) if (mlock)
virCommandSetMaxMemLock(cmd, qemuDomainMemoryLimit(def) * 1024); virCommandSetMaxMemLock(cmd, def->mem.hard_limit * 1024);
virObjectUnref(cfg); virObjectUnref(cfg);
return cmd; return cmd;
......
...@@ -2306,55 +2306,6 @@ cleanup: ...@@ -2306,55 +2306,6 @@ cleanup:
return ret; return ret;
} }
unsigned long long
qemuDomainMemoryLimit(virDomainDefPtr def)
{
unsigned long long mem;
size_t i;
if (def->mem.hard_limit) {
mem = def->mem.hard_limit;
} else {
/* If there is no hard_limit set, compute a reasonable one to avoid
* system thrashing caused by exploited qemu. A 'reasonable
* limit' has been chosen:
* (1 + k) * (domain memory + total video memory) + (32MB for
* cache per each disk) + F
* where k = 0.5 and F = 400MB. The cache for disks is important as
* kernel cache on the host side counts into the RSS limit.
* Moreover, VFIO requires some amount for IO space. Alex Williamson
* suggested adding 1GiB for IO space just to be safe (some finer
* tuning might be nice, though).
*
* Technically, the disk cache does not have to be included in
* RLIMIT_MEMLOCK but it doesn't hurt as it's just an upper limit and
* it makes this function and its usage simpler.
*/
mem = def->mem.max_balloon;
for (i = 0; i < def->nvideos; i++)
mem += def->videos[i]->vram;
mem *= 1.5;
mem += def->ndisks * 32768;
mem += 409600;
for (i = 0; i < def->nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
hostdev->source.subsys.type ==
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
hostdev->source.subsys.u.pci.backend ==
VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
mem += 1024 * 1024;
break;
}
}
}
return mem;
}
int int
qemuDomainUpdateDeviceList(virQEMUDriverPtr driver, qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
virDomainObjPtr vm) virDomainObjPtr vm)
......
...@@ -365,8 +365,6 @@ extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks; ...@@ -365,8 +365,6 @@ extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace; extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig; extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
unsigned long long qemuDomainMemoryLimit(virDomainDefPtr def);
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver, int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
virDomainObjPtr vm); virDomainObjPtr vm);
......
...@@ -1030,7 +1030,7 @@ int qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, ...@@ -1030,7 +1030,7 @@ int qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
*/ */
vm->def->hostdevs[vm->def->nhostdevs++] = hostdev; vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
virProcessSetMaxMemLock(vm->pid, virProcessSetMaxMemLock(vm->pid,
qemuDomainMemoryLimit(vm->def) * 1024); vm->def->mem.hard_limit * 1024);
vm->def->hostdevs[vm->def->nhostdevs--] = NULL; vm->def->hostdevs[vm->def->nhostdevs--] = NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册