mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-29 20:11:16 +00:00
Move QEMU caps validation of qemuBuildHostdevCommandLine() to qemuDomainDeviceDefValidateHostdev() and qemuDomainMdevDefValidate(), allowing them to be validated at domain define time. Tests were adapted to consider the new caps being needed in this earlier stage. Reviewed-by: Cole Robinson <crobinso@redhat.com> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
175 lines
4.3 KiB
C
175 lines
4.3 KiB
C
#include <config.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
|
|
#include "testutils.h"
|
|
|
|
#ifdef WITH_QEMU
|
|
|
|
# include "datatypes.h"
|
|
# include "internal.h"
|
|
# include "virstring.h"
|
|
# include "conf/domain_conf.h"
|
|
# include "qemu/qemu_domain.h"
|
|
|
|
# include "testutilsqemu.h"
|
|
|
|
# define VIR_FROM_THIS VIR_FROM_QEMU
|
|
|
|
static virQEMUDriver driver;
|
|
|
|
struct testInfo {
|
|
const char *name;
|
|
unsigned long long memlock;
|
|
};
|
|
|
|
static int
|
|
testCompareMemLock(const void *data)
|
|
{
|
|
const struct testInfo *info = data;
|
|
virDomainDefPtr def = NULL;
|
|
char *xml = NULL;
|
|
int ret = -1;
|
|
|
|
xml = g_strdup_printf("%s/qemumemlockdata/qemumemlock-%s.xml", abs_srcdir,
|
|
info->name);
|
|
|
|
if (!(def = virDomainDefParseFile(xml, driver.xmlopt, NULL,
|
|
VIR_DOMAIN_DEF_PARSE_INACTIVE))) {
|
|
goto cleanup;
|
|
}
|
|
|
|
ret = virTestCompareToULL(info->memlock, qemuDomainGetMemLockLimitBytes(def));
|
|
|
|
cleanup:
|
|
virDomainDefFree(def);
|
|
VIR_FREE(xml);
|
|
|
|
return ret;
|
|
}
|
|
|
|
# define FAKEROOTDIRTEMPLATE abs_builddir "/fakerootdir-XXXXXX"
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
char *fakerootdir;
|
|
virQEMUCapsPtr qemuCaps = NULL;
|
|
|
|
fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE);
|
|
|
|
if (!g_mkdtemp(fakerootdir)) {
|
|
fprintf(stderr, "Cannot create fakerootdir");
|
|
abort();
|
|
}
|
|
|
|
setenv("LIBVIRT_FAKE_ROOT_DIR", fakerootdir, 1);
|
|
|
|
if (qemuTestDriverInit(&driver) < 0) {
|
|
VIR_FREE(fakerootdir);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
driver.privileged = true;
|
|
|
|
# define DO_TEST(name, memlock) \
|
|
do { \
|
|
static struct testInfo info = { \
|
|
name, memlock \
|
|
}; \
|
|
if (virTestRun("QEMU MEMLOCK " name, testCompareMemLock, &info) < 0) \
|
|
ret = -1; \
|
|
} while (0)
|
|
|
|
/* The tests below make sure that the memory locking limit is being
|
|
* calculated correctly in a number of situations. Each test is
|
|
* performed both on x86_64/pc and ppc64/pseries in order to account
|
|
* for some architecture-specific details.
|
|
*
|
|
* kvm: simple KMV guest
|
|
* tcg: simple TCG guest
|
|
*
|
|
* hardlimit: guest where <memtune><hard_limit> has been configured
|
|
* locked: guest where <memoryBacking><locked> has been enabled
|
|
* hostdev: guest that has some hostdev assigned
|
|
*
|
|
* The remaining tests cover different combinations of the above to
|
|
* ensure settings are prioritized as expected.
|
|
*/
|
|
|
|
qemuTestSetHostArch(&driver, VIR_ARCH_X86_64);
|
|
|
|
DO_TEST("pc-kvm", 0);
|
|
DO_TEST("pc-tcg", 0);
|
|
|
|
if (!(qemuCaps = virQEMUCapsNew())) {
|
|
ret = -1;
|
|
goto cleanup;
|
|
}
|
|
|
|
virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI);
|
|
|
|
if (qemuTestCapsCacheInsert(driver.qemuCapsCache, qemuCaps) < 0) {
|
|
ret = -1;
|
|
goto cleanup;
|
|
};
|
|
|
|
DO_TEST("pc-hardlimit", 2147483648);
|
|
DO_TEST("pc-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
|
|
DO_TEST("pc-hostdev", 2147483648);
|
|
|
|
DO_TEST("pc-hardlimit+locked", 2147483648);
|
|
DO_TEST("pc-hardlimit+hostdev", 2147483648);
|
|
DO_TEST("pc-hardlimit+locked+hostdev", 2147483648);
|
|
DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
|
|
|
|
qemuTestSetHostArch(&driver, VIR_ARCH_PPC64);
|
|
|
|
virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE);
|
|
if (qemuTestCapsCacheInsert(driver.qemuCapsCache, qemuCaps) < 0) {
|
|
ret = -1;
|
|
goto cleanup;
|
|
};
|
|
|
|
DO_TEST("pseries-kvm", 20971520);
|
|
DO_TEST("pseries-tcg", 0);
|
|
|
|
DO_TEST("pseries-hardlimit", 2147483648);
|
|
DO_TEST("pseries-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
|
|
DO_TEST("pseries-hostdev", 4320133120);
|
|
|
|
DO_TEST("pseries-hardlimit+locked", 2147483648);
|
|
DO_TEST("pseries-hardlimit+hostdev", 2147483648);
|
|
DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648);
|
|
DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
|
|
|
|
cleanup:
|
|
virObjectUnref(qemuCaps);
|
|
|
|
if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
|
|
virFileDeleteTree(fakerootdir);
|
|
|
|
qemuTestDriverFree(&driver);
|
|
VIR_FREE(fakerootdir);
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIR_TEST_MAIN_PRELOAD(mymain,
|
|
VIR_TEST_MOCK("virpci"),
|
|
VIR_TEST_MOCK("domaincaps"))
|
|
|
|
#else
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
return EXIT_AM_SKIP;
|
|
}
|
|
|
|
#endif /* WITH_QEMU */
|