diff --git a/libvirt.spec b/libvirt.spec index 77e0a22480815bd15b5bb45885a23cb78c08ba00..921b3d1c8683451005e6038b9e43883db4784c1c 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -101,7 +101,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 6.2.0 -Release: 59 +Release: 60 License: LGPLv2+ URL: https://libvirt.org/ @@ -489,6 +489,7 @@ Patch0376: selinux-adapt-to-libselinux.patch Patch0377: Revert-selinux-adapt-to-libselinux.patch Patch0378: selinux-Reflect-context_str-type-change.patch Patch0379: virnetsshsession-Adapt-to-change-libssh2-API.patch +Patch0380: support-intel-qat-migration-optimization.patch Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} @@ -2225,6 +2226,9 @@ exit 0 %changelog +* Sat Nov 11 2023 - 6.2.0-60 +- migration:support qat migration feature + * Wed Aug 9 2023 Jiabo Feng - 6.2.0-59 - virnetsshsession: Adapt to change libssh2 API - selinux: Reflect context_str() type change diff --git a/support-intel-qat-migration-optimization.patch b/support-intel-qat-migration-optimization.patch new file mode 100644 index 0000000000000000000000000000000000000000..46166d8e6f5d0cd10791092680a0a72fe6de0e85 --- /dev/null +++ b/support-intel-qat-migration-optimization.patch @@ -0,0 +1,274 @@ +From 47b8dd134afe7d3c347246df90d8d422cef3b93e Mon Sep 17 00:00:00 2001 +From: lishaohui +Date: Sat, 11 Nov 2023 16:40:29 +0800 +Subject: [PATCH] support intel qat migration optimization + +Signed-off-by: lishaohui +Signed-off-by: huaqiang.wang + +--- + src/qemu/qemu.conf | 19 +++++ + .../src/qemu/qemu_migration_params.c | 74 ++++++++++++++++++- + .../src/qemu/qemu_migration_params.h | 1 + + .../tests/qemumigparamsdata/compress-qat.json | 4 + + .../qemumigparamsdata/compress-qat.reply | 7 ++ + .../tests/qemumigparamsdata/compress-qat.xml | 6 ++ + tests/qemumigparamstest.c | 1 + + 7 files changed, 108 insertions(+), 4 deletions(-) + create mode 100644 tests/qemumigparamsdata/compress-qat.json + create mode 100644 tests/qemumigparamsdata/compress-qat.reply + create mode 100644 tests/qemumigparamsdata/compress-qat.xml + +diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf +index 385608724..f8f8ddf6e 100644 +--- a/src/qemu/qemu.conf ++++ b/src/qemu/qemu.conf +@@ -497,6 +497,25 @@ + # "/dev/ptmx", "/dev/kvm", + # "/dev/rtc","/dev/hpet" + #] ++cgroup_device_acl = [ ++ "/dev/usdm_drv", "/dev/qat_dev_processes", "/dev/qat_adf_ctl", ++ "/dev/uio0", "/dev/uio1", "/dev/uio2", "/dev/uio3", "/dev/uio4", "/dev/uio5", "/dev/uio6", "/dev/uio7", "/dev/uio8", ++ "/dev/uio9", "/dev/uio10", "/dev/uio11", "/dev/uio12", "/dev/uio13", "/dev/uio14", "/dev/uio15", "/dev/uio16", ++ "/dev/uio17", "/dev/uio18", "/dev/uio19", "/dev/uio20", "/dev/uio21", "/dev/uio22", "/dev/uio23", "/dev/uio24", ++ "/dev/uio25", "/dev/uio26", "/dev/uio27", "/dev/uio28", "/dev/uio29", "/dev/uio30", "/dev/uio31", "/dev/uio32", ++ "/dev/uio33", "/dev/uio34", "/dev/uio35", "/dev/uio36","/dev/uio37", "/dev/uio38", "/dev/uio39", "/dev/uio40", ++ "/dev/uio41", "/dev/uio42", "/dev/uio43", "/dev/uio44", "/dev/uio45", "/dev/uio46", "/dev/uio47", "/dev/uio48", ++ "/dev/uio49", "/dev/uio50", "/dev/uio51", "/dev/uio52", "/dev/uio53", "/dev/uio54", "/dev/uio55", "/dev/uio56", ++ "/dev/uio57", "/dev/uio58", "/dev/uio59", "/dev/uio60", "/dev/uio61", "/dev/uio62", "/dev/uio63", "/dev/uio64", ++ "/dev/uio65", "/dev/uio66", "/dev/uio67", "/dev/uio68", "/dev/uio69", "/dev/uio70", "/dev/uio71", "/dev/uio72", ++ "/dev/uio73", "/dev/uio74", "/dev/uio75", "/dev/uio76", "/dev/uio77", "/dev/uio78", "/dev/uio79", "/dev/uio80", ++ "/dev/uio81", "/dev/uio82", "/dev/uio83", "/dev/uio84", "/dev/uio85", "/dev/uio86", "/dev/uio87", "/dev/uio88", ++ "/dev/uio89", "/dev/uio90", "/dev/uio91", "/dev/uio92", "/dev/uio93", "/dev/uio94", "/dev/uio95", "/dev/uio96", ++ "/dev/uio97", "/dev/uio98", "/dev/uio99", "/dev/uio100", "/dev/uio101", "/dev/uio102", "/dev/uio103", "/dev/uio104", ++ "/dev/uio105", "/dev/uio106", "/dev/uio107", "/dev/uio108", "/dev/uio109", "/dev/uio110", "/dev/uio111", "/dev/uio112", ++ "/dev/uio113", "/dev/uio114", "/dev/uio115", "/dev/uio116", "/dev/uio117", "/dev/uio118", "/dev/uio119", "/dev/uio120", ++ "/dev/uio121", "/dev/uio122", "/dev/uio123", "/dev/uio124", "/dev/uio125", "/dev/uio126", "/dev/uio127" ++] + # + # RDMA migration requires the following extra files to be added to the list: + # "/dev/infiniband/rdma_cm", +diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c +index d1423ff4c..d9755bbdd 100644 +--- a/src/qemu/qemu_migration_params.c ++++ b/src/qemu/qemu_migration_params.c +@@ -25,6 +25,7 @@ + #include "virerror.h" + #include "viralloc.h" + #include "virstring.h" ++#include "virutil.h" + + #include "qemu_alias.h" + #include "qemu_hotplug.h" +@@ -68,7 +69,7 @@ struct _qemuMigrationParams { + typedef enum { + QEMU_MIGRATION_COMPRESS_XBZRLE = 0, + QEMU_MIGRATION_COMPRESS_MT, +- ++ QEMU_MIGRATION_COMPRESS_QAT, + QEMU_MIGRATION_COMPRESS_LAST + } qemuMigrationCompressMethod; + VIR_ENUM_DECL(qemuMigrationCompressMethod); +@@ -76,6 +77,7 @@ VIR_ENUM_IMPL(qemuMigrationCompressMethod, + QEMU_MIGRATION_COMPRESS_LAST, + "xbzrle", + "mt", ++ "qat", + ); + + VIR_ENUM_IMPL(qemuMigrationCapability, +@@ -110,6 +112,7 @@ VIR_ENUM_IMPL(qemuMigrationParam, + "multifd-channels", + "migrationpin", + "compress-method", ++ "compress-with-qat", + ); + + typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem; +@@ -229,6 +232,7 @@ static const qemuMigrationParamType qemuMigrationParamTypes[] = { + [QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = QEMU_MIGRATION_PARAM_TYPE_INT, + [QEMU_MIGRATION_PARAM_MIGRATIONPIN] = QEMU_MIGRATION_PARAM_TYPE_STRING, + [QEMU_MIGRATION_PARAM_COMPRESS_METHOD] = QEMU_MIGRATION_PARAM_TYPE_STRING, ++ [QEMU_MIGRATION_PARAM_COMPRESS_WITH_QAT] = QEMU_MIGRATION_PARAM_TYPE_BOOL, + }; + G_STATIC_ASSERT(G_N_ELEMENTS(qemuMigrationParamTypes) == QEMU_MIGRATION_PARAM_LAST); + +@@ -471,6 +475,48 @@ qemuMigrationParamsSetTPString(qemuMigrationParamsPtr migParams, + migParams->params[param].value.s); + } + ++static int ++qemuMigrationParamsGetBoolean(qemuMigrationParamsPtr migParams, ++ qemuMigrationParam param, ++ virTypedParameterPtr params, ++ int nparams, ++ const char *name) ++{ ++ int rc; ++ int value; ++ ++ if (qemuMigrationParamsCheckType(param, QEMU_MIGRATION_PARAM_TYPE_BOOL) < 0) ++ return -1; ++ ++ if (!params) ++ return 0; ++ ++ if ((rc = virTypedParamsGetBoolean(params, nparams, name, &value)) < 0) ++ return -1; ++ ++ migParams->params[param].value.b = !!value; ++ migParams->params[param].set = !!rc; ++ return 0; ++} ++ ++ ++static int ++qemuMigrationParamsSetBoolean(qemuMigrationParamsPtr migParams, ++ qemuMigrationParam param, ++ virTypedParameterPtr *params, ++ int *nparams, ++ int *maxparams, ++ const char *name) ++{ ++ if (qemuMigrationParamsCheckType(param, QEMU_MIGRATION_PARAM_TYPE_BOOL) < 0) ++ return -1; ++ ++ if (!migParams->params[param].set) ++ return 0; ++ ++ return virTypedParamsAddBoolean(params, nparams, maxparams, name, ++ migParams->params[param].value.b ? 1 : 0); ++} + + + static int +@@ -481,6 +527,7 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params, + { + size_t i; + int method; ++ size_t param; + qemuMigrationCapability cap; + + for (i = 0; i < nparams; i++) { +@@ -508,7 +555,12 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params, + case QEMU_MIGRATION_COMPRESS_XBZRLE: + cap = QEMU_MIGRATION_CAP_XBZRLE; + break; +- ++ case QEMU_MIGRATION_COMPRESS_QAT: ++ param = QEMU_MIGRATION_PARAM_COMPRESS_WITH_QAT; ++ migParams->params[param].value.b = true; ++ migParams->params[param].set = true; ++ cap = QEMU_MIGRATION_CAP_COMPRESS; ++ break; + case QEMU_MIGRATION_COMPRESS_MT: + cap = QEMU_MIGRATION_CAP_COMPRESS; + break; +@@ -520,8 +572,7 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params, + ignore_value(virBitmapSetBit(migParams->caps, cap)); + } + +- if ((migParams->params[QEMU_MIGRATION_PARAM_COMPRESS_LEVEL].set || +- migParams->params[QEMU_MIGRATION_PARAM_COMPRESS_THREADS].set || ++ if ((migParams->params[QEMU_MIGRATION_PARAM_COMPRESS_THREADS].set || + migParams->params[QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS].set || + migParams->params[QEMU_MIGRATION_PARAM_COMPRESS_METHOD].set) && + !(migParams->compMethods & (1ULL << QEMU_MIGRATION_COMPRESS_MT))) { +@@ -530,6 +581,14 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params, + return -1; + } + ++ if (migParams->params[QEMU_MIGRATION_PARAM_COMPRESS_LEVEL].set && ++ !(migParams->compMethods & (1ULL << QEMU_MIGRATION_COMPRESS_MT | ++ 1ULL << QEMU_MIGRATION_COMPRESS_QAT))) { ++ virReportError(VIR_ERR_INVALID_ARG, "%s", ++ _("Turn multithread or qat compression on to tune it")); ++ return -1; ++ } ++ + if (migParams->params[QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE].set && + !(migParams->compMethods & (1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE))) { + virReportError(VIR_ERR_INVALID_ARG, "%s", +@@ -605,6 +664,9 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, + break; + + case QEMU_MIGRATION_PARAM_TYPE_BOOL: ++ if (qemuMigrationParamsGetBoolean(migParams, item->param, params, ++ nparams, item->typedParam) < 0) ++ goto error; + break; + + case QEMU_MIGRATION_PARAM_TYPE_STRING: +@@ -685,6 +747,10 @@ qemuMigrationParamsDump(qemuMigrationParamsPtr migParams, + break; + + case QEMU_MIGRATION_PARAM_TYPE_BOOL: ++ if (qemuMigrationParamsSetBoolean(migParams, item->param, ++ params, nparams, maxparams, ++ item->typedParam) < 0) ++ return -1; + break; + + case QEMU_MIGRATION_PARAM_TYPE_STRING: +diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h +index ae9572370..f40ce9280 100644 +--- a/src/qemu/qemu_migration_params.h ++++ b/src/qemu/qemu_migration_params.h +@@ -60,6 +60,7 @@ typedef enum { + QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS, + QEMU_MIGRATION_PARAM_MIGRATIONPIN, + QEMU_MIGRATION_PARAM_COMPRESS_METHOD, ++ QEMU_MIGRATION_PARAM_COMPRESS_WITH_QAT, + + QEMU_MIGRATION_PARAM_LAST + } qemuMigrationParam; +diff --git a/tests/qemumigparamsdata/compress-qat.json b/tests/qemumigparamsdata/compress-qat.json +new file mode 100644 +index 000000000..f91389362 +--- /dev/null ++++ b/tests/qemumigparamsdata/compress-qat.json +@@ -0,0 +1,4 @@ ++{ ++ "compress-level": 1, ++ "compress-with-qat": true ++} +diff --git a/tests/qemumigparamsdata/compress-qat.reply b/tests/qemumigparamsdata/compress-qat.reply +new file mode 100644 +index 000000000..b33d301a5 +--- /dev/null ++++ b/tests/qemumigparamsdata/compress-qat.reply +@@ -0,0 +1,7 @@ ++{ ++ "id": "libvirt-1", ++ "return": { ++ "compress-level": 1, ++ "compress-with-qat": true ++ } ++} +diff --git a/tests/qemumigparamsdata/compress-qat.xml b/tests/qemumigparamsdata/compress-qat.xml +new file mode 100644 +index 000000000..16292b776 +--- /dev/null ++++ b/tests/qemumigparamsdata/compress-qat.xml +@@ -0,0 +1,6 @@ ++ ++ ++ ++ ++ ++ +diff --git a/tests/qemumigparamstest.c b/tests/qemumigparamstest.c +index 954cd1c57..aa12c2cab 100644 +--- a/tests/qemumigparamstest.c ++++ b/tests/qemumigparamstest.c +@@ -225,6 +225,7 @@ mymain(void) + DO_TEST("tls"); + DO_TEST("tls-enabled"); + DO_TEST("tls-hostname"); ++ DO_TEST("compress-qat"); + + qemuTestDriverFree(&driver); + +-- +2.33.0