Re: [libvirt] [RFC v2] external (pull) backup API

2018-04-11 Thread John Snow


On 04/11/2018 12:32 PM, Eric Blake wrote:
> On 04/03/2018 07:01 AM, Nikolay Shirokovskiy wrote:
>> Hi, all. 
>> 
>>  
>> 
>> This is another RFC on pull backup API. This API provides means to read 
>> domain   
>> disks in a snapshotted state so that client can back them up as well as 
>> means
>> to write domain disks to revert them to backed up state. The previous 
>> version
>> of RFC is [1]. I'll also describe the API implementation details to shed 
>> light   
>> on misc qemu dirty bitmap commands usage.
>> 
> 
> This is a first-pass review (making comments as I first encounter
> something, even if it gets explained later in the email)
> 
>>  
>> 
>> This API does not use existent disks snapshots. Instead it introduces 
>> snapshots  
>> provided by qemu's blockdev-backup command. The reason is we need 
>> snapshotted
>> disk state only temporarily for duration of backup operation and newly   
>> 
>> introduced snapshots can be easily discarded at the end of operation without 
>> 
>> block commit operation. Technically difference is next. On usual snapshot we 
>> 
>> create new image backed by original and all new data goes to the new image 
>> thus  
>> original image stays in a snapshotted state. In temporary snapshots we 
>> create
>> new image backed by original and all new data still goes to the original 
>> image   
>> but before new data is written old data to be overwritten is popped out to 
>> the new   
>> image thus we get snapshotted state thru new image.  
>> 
> 

Oh, I see -- you're using blockdev-backup sync=none to accomplish
fleecing snapshots. It's a little confusing here without the sync=none
information, as usually blockdev-backup provides... backups, not snapshots.

Your cover letter would be a little clearer with that information.

For everyone else:

Node fleecing is a very dumb name that means "Live copying of arbitrary
blocks from a live node." In QEMU, it works like this:

(1) Create a new active layer for the node to be fleeced.

[node] <-- [snapshot]

Note that this snapshot node is backed by the node named "node", not a
file named "node". The snapshot is supported by a qcow2 file on local
storage that starts empty.

(2) Start blockdev-backup sync=none FROM the node TO the snapshot:

> blockdev-backup device=node target=snapshot sync=none

This means that any time 'node' is written to, the information will get
written to 'snapshot' on-demand, preserving snapshot as a point-in-time
snapshot of node, while leaving 'node' in-use for any other
nodes/devices using it. It's effectively the opposite of an external
snapshot, facilitated by a live COW job.

(3) an NBD server may be started to export the "snapshot"

nbd-server-add device=snapshot

(4+) At this point, the NBD client can copy the snapshot data out, and
the NBD export can be closed upon completion. Then, the snapshot can be
removed/deleted.

Unlike traditional external snapshot and commit workflow, this snapshot
can be deleted at any time without jeopardizing the data it is a
snapshot of.

> So, rewriting this to make sure I understand, let's start with a disk
> with contents A, then take a snapshot, then write B:
> 
> In the existing libvirt snapshot APIs, the data gets distributed as:
> 
> base (contents A) <- new active (contents B)
> 
> where you want the new API:
> 
> base, remains active (contents B) ~~~ backup (contents A)
> 
>>  
>> 
>> Disks snapshots as well as disks itself are avaiable to read/write thru qemu 
>> 
>> NBD server.  
>> 
> 
> So the biggest reason for a new libvirt API is that we need management
> actions to control which NBD images from qemu are exposed and torn down
> at the appropriate sequences.
> 
>>  
>> 
>> Here is typical actions on domain backup:
>> 
>>  
>> 
>> - create temporary snapshot of domain disks of interest  
>> 
>> - export snaphots thru NBD   

[libvirt] [PATCH v7 2/9] libxl: pass driver config to libxlMakeDomBuildInfo

2018-04-11 Thread Marek Marczykowski-Górecki
Preparation for global nestedhvm configuration - libxlMakeDomBuildInfo
needs access to libxlDriverConfig.
No functional change.

Adjusting tests require slightly more mockup functions, because of
libxlDriverConfigNew() call.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v6:
 - tests: add libxl_get_free_memory mock needed on Xen 4.5
Changes since v4:
 - drop now unneeded parameters
Changes since v3:
 - new patch, preparation
---
 src/libxl/libxl_conf.c | 13 +++--
 src/libxl/libxl_conf.h |  4 +---
 src/libxl/libxl_domain.c   |  2 +-
 tests/libxlxml2domconfigtest.c | 23 ---
 tests/virmocklibxl.c   | 31 +++
 5 files changed, 56 insertions(+), 17 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index ae369bc..2565f64 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -271,11 +271,12 @@ libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf)
 
 static int
 libxlMakeDomBuildInfo(virDomainDefPtr def,
-  libxl_ctx *ctx,
+  libxlDriverConfigPtr cfg,
   virCapsPtr caps,
   libxl_domain_config *d_config)
 {
 virDomainClockDef clock = def->clock;
+libxl_ctx *ctx = cfg->ctx;
 libxl_domain_build_info *b_info = _config->b_info;
 int hvm = def->os.type == VIR_DOMAIN_OSTYPE_HVM;
 size_t i;
@@ -2346,17 +2347,17 @@ libxlDriverNodeGetInfo(libxlDriverPrivatePtr driver, 
virNodeInfoPtr info)
 int
 libxlBuildDomainConfig(virPortAllocatorRangePtr graphicsports,
virDomainDefPtr def,
-   const char *channelDir LIBXL_ATTR_UNUSED,
-   libxl_ctx *ctx,
-   virCapsPtr caps,
+   libxlDriverConfigPtr cfg,
libxl_domain_config *d_config)
 {
+virCapsPtr caps = cfg->caps;
+libxl_ctx *ctx = cfg->ctx;
 libxl_domain_config_init(d_config);
 
 if (libxlMakeDomCreateInfo(ctx, def, _config->c_info) < 0)
 return -1;
 
-if (libxlMakeDomBuildInfo(def, ctx, caps, d_config) < 0)
+if (libxlMakeDomBuildInfo(def, cfg, caps, d_config) < 0)
 return -1;
 
 #ifdef LIBXL_HAVE_VNUMA
@@ -2388,7 +2389,7 @@ libxlBuildDomainConfig(virPortAllocatorRangePtr 
graphicsports,
 #endif
 
 #ifdef LIBXL_HAVE_DEVICE_CHANNEL
-if (libxlMakeChannelList(channelDir, def, d_config) < 0)
+if (libxlMakeChannelList(cfg->channelDir, def, d_config) < 0)
 return -1;
 #endif
 
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index 0e85dff..633ebf5 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -215,9 +215,7 @@ libxlCreateXMLConf(void);
 int
 libxlBuildDomainConfig(virPortAllocatorRangePtr graphicsports,
virDomainDefPtr def,
-   const char *channelDir LIBXL_ATTR_UNUSED,
-   libxl_ctx *ctx,
-   virCapsPtr caps,
+   libxlDriverConfigPtr cfg,
libxl_domain_config *d_config);
 
 static inline void
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index ef9a902..0614589 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -1261,7 +1261,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver,
 goto cleanup_dom;
 
 if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def,
-   cfg->channelDir, cfg->ctx, cfg->caps, 
_config) < 0)
+   cfg, _config) < 0)
 goto cleanup_dom;
 
 if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, _config) < 0)
diff --git a/tests/libxlxml2domconfigtest.c b/tests/libxlxml2domconfigtest.c
index 6eec4c7..9d280e9 100644
--- a/tests/libxlxml2domconfigtest.c
+++ b/tests/libxlxml2domconfigtest.c
@@ -56,8 +56,8 @@ testCompareXMLToDomConfig(const char *xmlfile,
 int ret = -1;
 libxl_domain_config actualconfig;
 libxl_domain_config expectconfig;
+libxlDriverConfigPtr cfg;
 xentoollog_logger *log = NULL;
-libxl_ctx *ctx = NULL;
 virPortAllocatorRangePtr gports = NULL;
 virDomainXMLOptionPtr xmlopt = NULL;
 virDomainDefPtr vmdef = NULL;
@@ -68,10 +68,18 @@ testCompareXMLToDomConfig(const char *xmlfile,
 libxl_domain_config_init();
 libxl_domain_config_init();
 
+if (!(cfg = libxlDriverConfigNew()))
+goto cleanup;
+
+cfg->caps = caps;
+
 if (!(log = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, 
XTL_DEBUG, 0)))
 goto cleanup;
 
-if (libxl_ctx_alloc(, LIBXL_VERSION, 0, log) < 0)
+/* replace logger with stderr one */
+libxl_ctx_free(cfg->ctx);
+
+if (libxl_ctx_alloc(>ctx, LIBXL_VERSION, 0, log) < 0)
 goto cleanup;
 
 if (!(gports = virPortAllocatorRangeNew("vnc", 5900, 6000)))
@@ -84,22 +92,22 @@ 

[libvirt] [PATCH v7 6/9] libxl: add support for CPUID features policy

2018-04-11 Thread Marek Marczykowski-Górecki
Convert CPU features policy into libxl cpuid policy settings. Use new
("libxl") syntax, which allow to enable/disable specific bits, using
host CPU as a base. For this reason, only "host-passthrough" mode is
accepted.
Libxl do not have distinction between "force" and "required" policy
(there is only "force") and also between "forbid" and "disable" (there
is only "disable"). So, merge them appropriately. If anything, "require"
and "forbid" should be enforced outside of specific driver.
Nested HVM (vmx and svm features) is handled separately, so exclude it
from translation.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v4:
 - added spec-ctrl/ibrsb
Changes since v2:
 - drop spurious changes
 - move libxlTranslateCPUFeature function to xen_xl.c, to be reused by
 xenconfig driver
Changes since v1:
 - use new ("libxl") syntax to set only bits explicitly mentioned in
 domain XML
---
 src/libxl/libxl_conf.c | 36 +---
 src/xenconfig/xen_xl.c | 35 +++
 src/xenconfig/xen_xl.h |  2 ++
 3 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 9ea3759..e98fe52 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -50,6 +50,7 @@
 #include "secret_util.h"
 #include "cpu/cpu.h"
 #include "xen_common.h"
+#include "xen_xl.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -394,6 +395,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
 def->cpu && def->cpu->mode == (VIR_CPU_MODE_HOST_PASSTHROUGH)) {
 bool hasHwVirt = false;
 bool svm = false, vmx = false;
+char xlCPU[32];
 
 /* enable nested HVM only if global nested_hvm option enable it and
  * host support it*/
@@ -411,17 +413,45 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
 case VIR_CPU_FEATURE_DISABLE:
 case VIR_CPU_FEATURE_FORBID:
 if ((vmx && STREQ(def->cpu->features[i].name, 
"vmx")) ||
-(svm && STREQ(def->cpu->features[i].name, 
"svm")))
+(svm && STREQ(def->cpu->features[i].name, 
"svm"))) {
 hasHwVirt = false;
+continue;
+}
+
+snprintf(xlCPU,
+sizeof(xlCPU),
+"%s=0",
+xenTranslateCPUFeature(
+def->cpu->features[i].name,
+false));
+if (libxl_cpuid_parse_config(_info->cpuid, 
xlCPU)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+_("unsupported cpu feature '%s'"),
+def->cpu->features[i].name);
+return -1;
+}
 break;
 
 case VIR_CPU_FEATURE_FORCE:
 case VIR_CPU_FEATURE_REQUIRE:
 if ((vmx && STREQ(def->cpu->features[i].name, 
"vmx")) ||
-(svm && STREQ(def->cpu->features[i].name, 
"svm")))
+(svm && STREQ(def->cpu->features[i].name, 
"svm"))) {
 hasHwVirt = true;
+continue;
+}
+
+snprintf(xlCPU,
+sizeof(xlCPU),
+"%s=1",
+xenTranslateCPUFeature(
+def->cpu->features[i].name, false));
+if (libxl_cpuid_parse_config(_info->cpuid, 
xlCPU)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+_("unsupported cpu feature '%s'"),
+def->cpu->features[i].name);
+return -1;
+}
 break;
-
 case VIR_CPU_FEATURE_OPTIONAL:
 case VIR_CPU_FEATURE_LAST:
 break;
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
index ea5cacb..f60ee08 100644
--- a/src/xenconfig/xen_xl.c
+++ b/src/xenconfig/xen_xl.c
@@ -218,6 +218,41 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, 
virCapsPtr caps)
 return 0;
 }
 
+/*
+ * Translate CPU feature name from libvirt to libxl (from_libxl=false) or from
+ * libxl to libvirt (from_libxl=true).
+ */
+const char *
+xenTranslateCPUFeature(const char *feature_name, bool from_libxl)
+{
+

[libvirt] [PATCH v7 1/9] libxl: fix libxlDriverConfigDispose for partially constructed object

2018-04-11 Thread Marek Marczykowski-Górecki
libxlDriverConfigNew() use libxlDriverConfigDispose() for cleanup in
case of errors. Do not call libxlLoggerFree() on not allocated logger
(NULL).

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Jim Fehlig 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v3:
 - new patch, mostly unrelated, but found while adjusting tests
---
 src/libxl/libxl_conf.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index df1cece..ae369bc 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -80,7 +80,8 @@ libxlDriverConfigDispose(void *obj)
 
 virObjectUnref(cfg->caps);
 libxl_ctx_free(cfg->ctx);
-libxlLoggerFree(cfg->logger);
+if (cfg->logger)
+libxlLoggerFree(cfg->logger);
 
 VIR_FREE(cfg->configDir);
 VIR_FREE(cfg->autostartDir);
-- 
git-series 0.9.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v7 5/9] xenconfig: do not override def->cpu if already set elsewhere

2018-04-11 Thread Marek Marczykowski-Górecki
This will help with adding cpuid support.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v4:
 - patch separated from "libxl: do not enable nested HVM unless global
   nested_hvm option enabled"
---
 src/xenconfig/xen_xl.c | 37 -
 1 file changed, 12 insertions(+), 25 deletions(-)

diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
index e1ec8e7..ea5cacb 100644
--- a/src/xenconfig/xen_xl.c
+++ b/src/xenconfig/xen_xl.c
@@ -170,17 +170,8 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, 
virCapsPtr caps)
 if (xenConfigGetBool(conf, "nestedhvm", , -1) < 0)
 return -1;
 
-if (val == 1) {
-virCPUDefPtr cpu;
-
-if (VIR_ALLOC(cpu) < 0)
-return -1;
-
-cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
-cpu->type = VIR_CPU_TYPE_GUEST;
-def->cpu = cpu;
-} else if (val == 0) {
-const char *vtfeature = NULL;
+if (val != -1) {
+const char *vtfeature = "vmx";
 
 if (caps && caps->host.cpu && ARCH_IS_X86(def->os.arch)) {
 if (virCPUCheckFeature(caps->host.arch, caps->host.cpu, "vmx"))
@@ -189,28 +180,24 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, 
virCapsPtr caps)
 vtfeature = "svm";
 }
 
-if (vtfeature) {
+if (!def->cpu) {
 virCPUDefPtr cpu;
-
 if (VIR_ALLOC(cpu) < 0)
 return -1;
 
-if (VIR_ALLOC(cpu->features) < 0) {
-VIR_FREE(cpu);
-return -1;
-}
-
-if (VIR_STRDUP(cpu->features->name, vtfeature) < 0) {
-VIR_FREE(cpu->features);
-VIR_FREE(cpu);
-return -1;
-}
-cpu->features->policy = VIR_CPU_FEATURE_DISABLE;
-cpu->nfeatures = cpu->nfeatures_max = 1;
 cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
 cpu->type = VIR_CPU_TYPE_GUEST;
+cpu->nfeatures = 0;
+cpu->nfeatures_max = 0;
 def->cpu = cpu;
 }
+
+if (val == 0) {
+if (virCPUDefAddFeature(def->cpu,
+vtfeature,
+VIR_CPU_FEATURE_DISABLE) < 0)
+return -1;
+}
 }
 } else {
 if (xenConfigCopyStringOpt(conf, "bootloader", >os.bootloader) < 
0)
-- 
git-series 0.9.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v7 8/9] xenconfig: add CPUID handling to domXML <-> xl.cfg conversion

2018-04-11 Thread Marek Marczykowski-Górecki
Only "libxl" format supported for now. Special care needed around
vmx/svm, because those two are translated into "nestedhvm" setting.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v5:
 - adjust for ignoring mode=custom instead of rejecting it
Changes since v3:
 - improve error reporting (VIR_ERR_CONF_SYNTAX)
 - ignore empty cpuid option - same as libxl
 - fix cleanup on error
Changes since v2:
 - new patch
---
 src/xenconfig/xen_xl.c | 164 ++-
 1 file changed, 164 insertions(+)

diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
index f60ee08..6dcaba9 100644
--- a/src/xenconfig/xen_xl.c
+++ b/src/xenconfig/xen_xl.c
@@ -253,6 +253,91 @@ xenTranslateCPUFeature(const char *feature_name, bool 
from_libxl)
 return feature_name;
 }
 
+static int
+xenParseXLCPUID(virConfPtr conf, virDomainDefPtr def)
+{
+const char *cpuid_str = NULL;
+char **cpuid_pairs = NULL;
+char **name_and_value = NULL;
+size_t i;
+int ret = -1;
+int policy;
+
+if (xenConfigGetString(conf, "cpuid", _str, NULL) < 0)
+return -1;
+
+if (!cpuid_str)
+return 0;
+
+if (!def->cpu) {
+if (VIR_ALLOC(def->cpu) < 0)
+goto cleanup;
+def->cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
+def->cpu->type = VIR_CPU_TYPE_GUEST;
+def->cpu->nfeatures = 0;
+def->cpu->nfeatures_max = 0;
+}
+
+cpuid_pairs = virStringSplit(cpuid_str, ",", 0);
+if (!cpuid_pairs)
+goto cleanup;
+
+if (!cpuid_pairs[0]) {
+ret = 0;
+goto cleanup;
+}
+
+if (STRNEQ(cpuid_pairs[0], "host")) {
+virReportError(VIR_ERR_CONF_SYNTAX,
+   _("cpuid starting with %s is not supported, only libxl 
format is"),
+   cpuid_pairs[0]);
+goto cleanup;
+}
+
+for (i = 1; cpuid_pairs[i]; i++) {
+name_and_value = virStringSplit(cpuid_pairs[i], "=", 2);
+if (!name_and_value)
+goto cleanup;
+if (!name_and_value[0] || !name_and_value[1]) {
+virReportError(VIR_ERR_CONF_SYNTAX,
+   _("Invalid libxl cpuid key=value element: %s"),
+   cpuid_pairs[i]);
+goto cleanup;
+}
+if (STREQ(name_and_value[1], "1")) {
+policy = VIR_CPU_FEATURE_FORCE;
+} else if (STREQ(name_and_value[1], "0")) {
+policy = VIR_CPU_FEATURE_DISABLE;
+} else if (STREQ(name_and_value[1], "x")) {
+policy = VIR_CPU_FEATURE_OPTIONAL;
+} else if (STREQ(name_and_value[1], "k")) {
+policy = VIR_CPU_FEATURE_OPTIONAL;
+} else if (STREQ(name_and_value[1], "s")) {
+policy = VIR_CPU_FEATURE_OPTIONAL;
+} else {
+virReportError(VIR_ERR_CONF_SYNTAX,
+   _("Invalid libxl cpuid value: %s"),
+   cpuid_pairs[i]);
+goto cleanup;
+}
+
+if (virCPUDefAddFeature(def->cpu,
+xenTranslateCPUFeature(name_and_value[0], 
true),
+policy) < 0)
+goto cleanup;
+
+virStringListFree(name_and_value);
+name_and_value = NULL;
+}
+
+ret = 0;
+
+ cleanup:
+virStringListFree(name_and_value);
+virStringListFree(cpuid_pairs);
+return ret;
+}
+
 
 static int
 xenParseXLSpice(virConfPtr conf, virDomainDefPtr def)
@@ -1089,6 +1174,9 @@ xenParseXL(virConfPtr conf,
 goto cleanup;
 #endif
 
+if (xenParseXLCPUID(conf, def) < 0)
+goto cleanup;
+
 if (xenParseXLDisk(conf, def) < 0)
 goto cleanup;
 
@@ -1231,6 +1319,79 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def)
 return 0;
 }
 
+static int
+xenFormatXLCPUID(virConfPtr conf, virDomainDefPtr def)
+{
+char **cpuid_pairs = NULL;
+char *cpuid_string = NULL;
+size_t i, j;
+int ret = -1;
+
+if (!def->cpu)
+return 0;
+
+if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) {
+VIR_WARN("ignoring CPU mode '%s', only host-passthrough mode "
+ "is supported", virCPUModeTypeToString(def->cpu->mode));
+return 0;
+}
+
+/* "host" + all features + NULL */
+if (VIR_ALLOC_N(cpuid_pairs, def->cpu->nfeatures + 2) < 0)
+return -1;
+
+if (VIR_STRDUP(cpuid_pairs[0], "host") < 0)
+goto cleanup;
+
+j = 1;
+for (i = 0; i < def->cpu->nfeatures; i++) {
+const char *feature_name = xenTranslateCPUFeature(
+def->cpu->features[i].name,
+false);
+const char *policy = NULL;
+
+if (STREQ(feature_name, "vmx") || STREQ(feature_name, "svm"))
+/* ignore vmx/svm in cpuid option, translated into nestedhvm
+ * elsewhere */
+continue;
+
+switch 

[libvirt] [PATCH v7 3/9] libxl: warn about ignored CPU mode=custom

2018-04-11 Thread Marek Marczykowski-Górecki
When support for mode=custom will be added in the future, semantics of
current config will change. Reduce the surprise by emitting a warning.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v5:
 - new patch, instead of "libxl: error out on not supported CPU mode,
 instead of silently ignoring"
---
 src/libxl/libxl_conf.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2565f64..2053ed3 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -424,6 +424,12 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
 libxl_defbool_set(_info->u.hvm.nested_hvm, hasHwVirt);
 }
 
+if (def->cpu && def->cpu->mode == VIR_CPU_MODE_CUSTOM) {
+VIR_WARN("Ignoring CPU with mode=custom, update your config to "
+ "mode=host-passthrough to avoid risk of changed guest "
+ "semantics when mode=custom is supported in the future");
+}
+
 if (def->nsounds > 0) {
 /*
  * Use first sound device.  man xl.cfg(5) describes soundhw as
-- 
git-series 0.9.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v7 9/9] tests: add test case for CPUID in xenconfig driver

2018-04-11 Thread Marek Marczykowski-Górecki
Check conversion of "cpuid" setting, check all supported policy settings
("1", "0", "x"). Also, check interaction with "nestedhvm" - should not
be included as "vmx=1" in "cpuid" setting.

Signed-off-by: Marek Marczykowski-Górecki 
Reviewed-by: Jim Fehlig 
Reviewed-by: Daniel P. Berrangé 
---
Changes since v6:
 - rebase on master
Changes since v3:
 - adjust for nested HVM enabled by just  element
Changes since v2:
 - new patch
---
 tests/xlconfigdata/test-fullvirt-cpuid.cfg | 25 -
 tests/xlconfigdata/test-fullvirt-cpuid.xml | 36 +++-
 tests/xlconfigtest.c   |  1 +-
 3 files changed, 62 insertions(+)
 create mode 100644 tests/xlconfigdata/test-fullvirt-cpuid.cfg
 create mode 100644 tests/xlconfigdata/test-fullvirt-cpuid.xml

diff --git a/tests/xlconfigdata/test-fullvirt-cpuid.cfg 
b/tests/xlconfigdata/test-fullvirt-cpuid.cfg
new file mode 100644
index 000..bb7b9c7
--- /dev/null
+++ b/tests/xlconfigdata/test-fullvirt-cpuid.cfg
@@ -0,0 +1,25 @@
+name = "XenGuest2"
+uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809"
+maxmem = 579
+memory = 394
+vcpus = 1
+pae = 1
+acpi = 0
+apic = 0
+viridian = 0
+rtc_timeoffset = 0
+localtime = 0
+on_poweroff = "destroy"
+on_reboot = "restart"
+on_crash = "restart"
+device_model = "/usr/lib/xen/bin/qemu-system-i386"
+sdl = 0
+vnc = 1
+vncunused = 1
+vnclisten = "127.0.0.1"
+parallel = "none"
+serial = "none"
+builder = "hvm"
+boot = "d"
+nestedhvm = 1
+cpuid = "host,tm=0,sse3=1,page1gb=x"
diff --git a/tests/xlconfigdata/test-fullvirt-cpuid.xml 
b/tests/xlconfigdata/test-fullvirt-cpuid.xml
new file mode 100644
index 000..0979b10
--- /dev/null
+++ b/tests/xlconfigdata/test-fullvirt-cpuid.xml
@@ -0,0 +1,36 @@
+
+  XenGuest2
+  c7a5fdb2-cdaf-9455-926a-d65c16db1809
+  592896
+  403456
+  1
+  
+hvm
+/usr/lib/xen/boot/hvmloader
+
+  
+  
+
+  
+  
+
+
+
+  
+  
+  destroy
+  restart
+  restart
+  
+/usr/lib/xen/bin/qemu-system-i386
+
+
+
+  
+
+
+  
+
+
+  
+
diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c
index 57a0a67..39f51e2 100644
--- a/tests/xlconfigtest.c
+++ b/tests/xlconfigtest.c
@@ -270,6 +270,7 @@ mymain(void)
 DO_TEST("fullvirt-multi-timer");
 DO_TEST("fullvirt-nestedhvm");
 DO_TEST("fullvirt-nestedhvm-disabled");
+DO_TEST("fullvirt-cpuid");
 #ifdef LIBXL_HAVE_VNUMA
 DO_TEST("fullvirt-vnuma");
 DO_TEST_PARSE("fullvirt-vnuma-autocomplete", false);
-- 
git-series 0.9.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 08/10] qemu: Handle genid processing during startup/launch

2018-04-11 Thread John Ferlan
Before we generate the command line for qemu, if the domain about to
be launched desires to utilize the VM Generation ID functionality, then
handle both the regenerating the GUID value for backup recovery (restore
operation) and the startup after snapshot as well as checking that the
genid value that's about to be placed on the command line doesn't
duplicate some other already running domain.

Signed-off-by: John Ferlan 
---
 src/qemu/qemu_driver.c  |  22 +++---
 src/qemu/qemu_process.c | 110 +++-
 src/qemu/qemu_process.h |   1 +
 3 files changed, 126 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 56ac64630f..c417680dac 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6611,7 +6611,8 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
 if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL,
  asyncJob, "stdio", *fd, path, NULL,
  VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
- VIR_QEMU_PROCESS_START_PAUSED) == 0)
+ VIR_QEMU_PROCESS_START_PAUSED |
+ VIR_QEMU_PROCESS_START_GEN_VMID) == 0)
 restored = true;
 
 if (intermediatefd != -1) {
@@ -15873,6 +15874,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr 
snapshot,
  * the migratable XML or it will always fail otherwise */
 if (config) {
 bool compatible;
+bool abiflags = VIR_DOMAIN_DEF_ABI_CHECK_SKIP_GENID;
 
 /* Replace the CPU in config and put the original one in priv
  * once we're done. When we have the updated CPU def in the
@@ -15886,10 +15888,19 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr 
snapshot,
 goto endjob;
 
 compatible = qemuDomainDefCheckABIStability(driver, 
vm->def,
-config, 0);
+config, 
abiflags);
 } else {
 compatible = qemuDomainCheckABIStability(driver, vm, 
config,
- 0);
+ abiflags);
+}
+
+/* If using VM GenID, there is no way currently to change
+ * the genid for the running guest, so set an error and
+ * mark as incompatible. */
+if (compatible && config->genidRequested) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+   _("domain genid update requires restart"));
+compatible = false;
 }
 
 if (!compatible) {
@@ -15972,7 +15983,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr 
snapshot,
   cookie ? cookie->cpu : NULL,
   QEMU_ASYNC_JOB_START, NULL, -1, NULL, snap,
   VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
-  VIR_QEMU_PROCESS_START_PAUSED);
+  VIR_QEMU_PROCESS_START_PAUSED |
+  VIR_QEMU_PROCESS_START_GEN_VMID);
 virDomainAuditStart(vm, "from-snapshot", rc >= 0);
 detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
 event = virDomainEventLifecycleNewFromObj(vm,
@@ -16058,7 +16070,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr 
snapshot,
  VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
 /* Flush first event, now do transition 2 or 3 */
 bool paused = (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED) != 0;
-unsigned int start_flags = 0;
+unsigned int start_flags = VIR_QEMU_PROCESS_START_GEN_VMID;
 
 start_flags |= paused ? VIR_QEMU_PROCESS_START_PAUSED : 0;
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f02114c693..20fcdf7f26 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5882,6 +5882,107 @@ qemuProcessPrepareHost(virQEMUDriverPtr driver,
 
 
 /**
+ * qemuProcessCheckGenID:
+ * @vm: Domain to be checked
+ * @opaque: Domain about to be started
+ *
+ * For each running domain, let's make sure the domain to be started doesn't
+ * duplicate any running domain's genid GUID value
+ *
+ * Returns 0 on success, -1 on failure w/ error message set
+ */
+static int
+qemuProcessCheckGenID(virDomainObjPtr vm,
+  void *opaque)
+{
+int ret = 0;
+virDomainObjPtr startvm = opaque;
+
+/* Ignore ourselves as we're already locked */
+if (vm == startvm)
+return 0;
+
+virObjectLock(vm);
+
+if (!virDomainObjIsActive(vm))
+goto cleanup;
+
+if (!vm->def->genidRequested)
+goto 

[libvirt] [PATCH 10/10] docs: Add news article for VM Generation ID

2018-04-11 Thread John Ferlan
Signed-off-by: John Ferlan 
---
 docs/news.xml | 12 
 1 file changed, 12 insertions(+)

diff --git a/docs/news.xml b/docs/news.xml
index 798ab6da40..8246ef0509 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -44,6 +44,18 @@
   add this controller when traditional PCI devices are in use.
 
   
+  
+
+  Add support for VM Generation ID
+
+
+  The VM Generatation ID exposes a 128-bit, cryptographically
+  random, integer value identifier, referred to as a Globally
+  Unique Identifier (GUID) to the guest in order to notify the
+  guest operating system when the virtual machine is executed
+  with a different configuration.
+
+  
 
 
   
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 09/10] qemu: Add VM Generation ID to qemu command line

2018-04-11 Thread John Ferlan
https://bugzilla.redhat.com/show_bug.cgi?id=1149445

If the domain requests usage of the genid functionality,
then add the QEMU '-device vmgenid' to the command line
providing either the supplied or generated GUID value.

Add tests for both a generated and supplied GUID value.

Signed-off-by: John Ferlan 
---
 src/qemu/qemu_command.c| 31 +++
 tests/qemuxml2argvdata/genid-auto.args | 21 +
 tests/qemuxml2argvdata/genid.args  | 21 +
 tests/qemuxml2argvtest.c   |  4 
 4 files changed, 77 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/genid-auto.args
 create mode 100644 tests/qemuxml2argvdata/genid.args

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 955134d019..3b43cd4b56 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6023,6 +6023,34 @@ qemuBuildSmbiosCommandLine(virCommandPtr cmd,
 
 
 static int
+qemuBuildVMGenIDCommandLine(virCommandPtr cmd,
+const virDomainDef *def,
+virQEMUCapsPtr qemuCaps)
+{
+virBuffer opts = VIR_BUFFER_INITIALIZER;
+char guid[VIR_UUID_STRING_BUFLEN];
+
+if (!def->genidRequested)
+return 0;
+
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMGENID)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+   _("genid is not supported with this QEMU binary"));
+return -1;
+}
+
+virUUIDFormat(def->genid, guid);
+virBufferAsprintf(, "vmgenid,guid=%s,id=vmgenid0", guid);
+
+virCommandAddArg(cmd, "-device");
+virCommandAddArgBuffer(cmd, );
+
+virBufferFreeAndReset();
+return 0;
+}
+
+
+static int
 qemuBuildSgaCommandLine(virCommandPtr cmd,
 const virDomainDef *def,
 virQEMUCapsPtr qemuCaps)
@@ -10078,6 +10106,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
 if (qemuBuildSmbiosCommandLine(cmd, driver, def, qemuCaps) < 0)
 goto error;
 
+if (qemuBuildVMGenIDCommandLine(cmd, def, qemuCaps) < 0)
+goto error;
+
 /*
  * NB, -nographic *MUST* come before any serial, or monitor
  * or parallel port flags due to QEMU craziness, where it
diff --git a/tests/qemuxml2argvdata/genid-auto.args 
b/tests/qemuxml2argvdata/genid-auto.args
new file mode 100644
index 00..980cc077b9
--- /dev/null
+++ b/tests/qemuxml2argvdata/genid-auto.args
@@ -0,0 +1,21 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-device vmgenid,guid=00010203-0405-4607-8809-0a0b0c0d0e0f,id=vmgenid0 \
+-nographic \
+-nodefaults \
+-chardev 
socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-boot c \
+-usb
diff --git a/tests/qemuxml2argvdata/genid.args 
b/tests/qemuxml2argvdata/genid.args
new file mode 100644
index 00..0d5dfde98f
--- /dev/null
+++ b/tests/qemuxml2argvdata/genid.args
@@ -0,0 +1,21 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-device vmgenid,guid=e9392370-2917-565e-692b-d057f46512d6,id=vmgenid0 \
+-nographic \
+-nodefaults \
+-chardev 
socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-boot c \
+-usb
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 3a328e02a2..343d8eb221 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -731,6 +731,10 @@ mymain(void)
 DO_TEST("minimal", NONE);
 DO_TEST_PARSE_ERROR("minimal-no-memory", NONE);
 DO_TEST("minimal-msg-timestamp", QEMU_CAPS_MSG_TIMESTAMP);
+
+DO_TEST("genid", QEMU_CAPS_DEVICE_VMGENID);
+DO_TEST("genid-auto", QEMU_CAPS_DEVICE_VMGENID);
+
 DO_TEST("machine-aliases1", NONE);
 DO_TEST("machine-aliases2", QEMU_CAPS_KVM);
 DO_TEST("machine-core-on", QEMU_CAPS_MACHINE_OPT,
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 06/10] conf: Add VM Generation ID parse/format support

2018-04-11 Thread John Ferlan
The VM Generation ID is a mechanism to provide a unique 128-bit,
cryptographically random, and integer value identifier known as
the GUID (Globally Unique Identifier) to the guest OS. The value
is used to help notify the guest operating system when the virtual
machine is executed with a different configuration.

This patch adds support for a new "genid" XML element similar to
the "uuid" element. The "genid" element can have two forms ""
or "$GUID". If the $GUID is not provided, libvirt
will generate one.

For the ABI checks add avoidance for the genid comparison if the
appropriate flag is set.

Since adding support for a generated GUID (or UUID like) value to
be displayed only for an active guest, modifying the xml2xml test
to include virrandommock.so is necessary since it will generate a
"known" UUID value that can be compared against for the active test.

Signed-off-by: John Ferlan 
---
 docs/formatdomain.html.in| 29 
 docs/schemas/domaincommon.rng|  8 
 src/conf/domain_conf.c   | 59 
 src/conf/domain_conf.h   |  3 ++
 tests/qemuxml2argvdata/genid-auto.xml| 32 +
 tests/qemuxml2argvdata/genid.xml | 32 +
 tests/qemuxml2xmloutdata/genid-active.xml| 32 +
 tests/qemuxml2xmloutdata/genid-auto-active.xml   | 32 +
 tests/qemuxml2xmloutdata/genid-auto-inactive.xml | 32 +
 tests/qemuxml2xmloutdata/genid-inactive.xml  | 32 +
 tests/qemuxml2xmltest.c  |  5 +-
 11 files changed, 295 insertions(+), 1 deletion(-)
 create mode 100644 tests/qemuxml2argvdata/genid-auto.xml
 create mode 100644 tests/qemuxml2argvdata/genid.xml
 create mode 100644 tests/qemuxml2xmloutdata/genid-active.xml
 create mode 100644 tests/qemuxml2xmloutdata/genid-auto-active.xml
 create mode 100644 tests/qemuxml2xmloutdata/genid-auto-inactive.xml
 create mode 100644 tests/qemuxml2xmloutdata/genid-inactive.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 5e99884dc5..fe9c3b19f0 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -34,6 +34,7 @@
 domain type='kvm' id='1'
   nameMyGuest/name
   uuid4dea22b3-1d52-d8f3-2516-782e98ab3fa0/uuid
+  genid43dc0cf8-809b-4adb-9bea-a9abb5f3d90e/genid
   titleA short description - title - of the domain/title
   descriptionSome human readable description/description
   metadata
@@ -61,6 +62,34 @@
 specification. Since 0.0.1, sysinfo
 since 0.8.7
 
+  genid
+  Since 4.3.0, the genid
+element can be used to add a Virtual Machine Generation ID which
+exposes a 128-bit, cryptographically random, integer value identifier,
+referred to as a Globally Unique Identifier (GUID) using the same
+format as the uuid. The value is used to help notify
+the guest operating system when the virtual machine is executed
+with a different configuration, such as:
+
+
+  snapshot execution
+  backup recovery
+  failover in a disaster recovery environment
+  creation from template (import, copy, clone)
+
+
+The guest operating system notices the change and is then able to
+react as appropriate by marking its copies of distributed databases
+as dirty, re-initializing its random number generator, etc.
+
+
+When a GUID value is not provided, e.g. using the XML syntax
+genid/, then libvirt will automatically generate a GUID.
+This is the recommended configuration since the hypervisor then
+can handle changing the GUID value for specific state transitions.
+Using a static GUID value may result in failures for starting from
+snapshot, restoring from backup, starting a cloned domain, 
etc.
+
   title
   The optional element title provides space for a
 short description of the domain. The title should not contain
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 4cab55f05d..1892a7c63c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -502,6 +502,14 @@
   
 
   
+  
+
+  
+
+
+  
+
+  
 
   
   
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 385ba4ce8c..0fa9386270 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18791,6 +18791,34 @@ virDomainDefParseXML(xmlDocPtr xml,
 VIR_FREE(tmp);
 }
 
+/* Extract domain genid - a genid can either be provided or generated */
+if ((n = virXPathNodeSet("./genid", ctxt, )) < 0)
+goto error;
+
+if (n > 0) {
+if (n != 1) {
+virReportError(VIR_ERR_XML_ERROR, "%s",
+  _("element 'genid' can only appear once"));
+  

[libvirt] [PATCH 07/10] qemu: Add VM Generation ID device capability

2018-04-11 Thread John Ferlan
Add the query of the device objects for the vmgenid device

Signed-off-by: John Ferlan 
---
 src/qemu/qemu_capabilities.c  | 2 ++
 src/qemu/qemu_capabilities.h  | 1 +
 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 1 +
 tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml | 1 +
 tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml  | 1 +
 5 files changed, 6 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 91b7aa31ec..bd1d800098 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -468,6 +468,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
   "virtio-tablet-ccw",
   "qcow2-luks",
   "pcie-pci-bridge",
+  "vmgenid",
 );
 
 
@@ -1104,6 +1105,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
 { "virtio-mouse-ccw", QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW },
 { "virtio-tablet-ccw", QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW },
 { "pcie-pci-bridge", QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE },
+{ "vmgenid", QEMU_CAPS_DEVICE_VMGENID },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index bec28cae92..a562385b4f 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -452,6 +452,7 @@ typedef enum {
 QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW, /* -device virtio-tablet-ccw */
 QEMU_CAPS_QCOW2_LUKS, /* qcow2 format support LUKS encryption */
 QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE, /* -device pcie-pci-bridge */
+QEMU_CAPS_DEVICE_VMGENID, /* -device vmgenid */
 
 QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml 
b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
index 4dd5602014..35c16e400e 100644
--- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
@@ -230,6 +230,7 @@
   
   
   
+  
   201
   0
   344938
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml 
b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml
index 4ed2e1ea96..81515980b2 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml
@@ -227,6 +227,7 @@
   
   
   
+  
   2011090
   0
   390060
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml 
b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
index 13fc8c143f..972cee5f25 100644
--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -225,6 +225,7 @@
   
   
   
+  
   2009000
   0
   320947
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 03/10] qemu: Add flags to qemuDomainMigratableDefCheckABIStability

2018-04-11 Thread John Ferlan
Allow the caller to qemuDomainMigratableDefCheckABIStability to also
provide a flag to be used for virDomainDefCheckABIStabilityFlags.

Signed-off-by: John Ferlan 
---
 src/qemu/qemu_domain.c| 18 --
 src/qemu/qemu_domain.h|  6 --
 src/qemu/qemu_driver.c|  7 ---
 src/qemu/qemu_migration.c |  4 ++--
 4 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 6568054d7d..9c4bdf1ee4 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7997,12 +7997,14 @@ 
qemuDomainMigratableDefCheckABIStability(virQEMUDriverPtr driver,
  virDomainDefPtr src,
  virDomainDefPtr migratableSrc,
  virDomainDefPtr dst,
- virDomainDefPtr migratableDst)
+ virDomainDefPtr migratableDst,
+ unsigned flags)
 {
+flags |= VIR_DOMAIN_DEF_ABI_CHECK_SKIP_VOLATILE;
 if (!virDomainDefCheckABIStabilityFlags(migratableSrc,
 migratableDst,
 driver->xmlopt,
-
VIR_DOMAIN_DEF_ABI_CHECK_SKIP_VOLATILE))
+flags))
 return false;
 
 /* Force update any skipped values from the volatile flag */
@@ -8018,7 +8020,8 @@ qemuDomainMigratableDefCheckABIStability(virQEMUDriverPtr 
driver,
 bool
 qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
virDomainDefPtr src,
-   virDomainDefPtr dst)
+   virDomainDefPtr dst,
+   unsigned int flags)
 {
 virDomainDefPtr migratableDefSrc = NULL;
 virDomainDefPtr migratableDefDst = NULL;
@@ -8030,7 +8033,8 @@ qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
 
 ret = qemuDomainMigratableDefCheckABIStability(driver,
src, migratableDefSrc,
-   dst, migratableDefDst);
+   dst, migratableDefDst,
+   flags);
 
  cleanup:
 virDomainDefFree(migratableDefSrc);
@@ -8042,7 +8046,8 @@ qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
 bool
 qemuDomainCheckABIStability(virQEMUDriverPtr driver,
 virDomainObjPtr vm,
-virDomainDefPtr dst)
+virDomainDefPtr dst,
+unsigned int flags)
 {
 virDomainDefPtr migratableSrc = NULL;
 virDomainDefPtr migratableDst = NULL;
@@ -8056,7 +8061,8 @@ qemuDomainCheckABIStability(virQEMUDriverPtr driver,
 
 ret = qemuDomainMigratableDefCheckABIStability(driver,
vm->def, migratableSrc,
-   dst, migratableDst);
+   dst, migratableDst,
+   flags);
 
  cleanup:
 VIR_FREE(xml);
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 21e12f6594..73463a681e 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -718,11 +718,13 @@ int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr 
driver,
 
 bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
 virDomainDefPtr src,
-virDomainDefPtr dst);
+virDomainDefPtr dst,
+unsigned int flags);
 
 bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
- virDomainDefPtr dst);
+ virDomainDefPtr dst,
+ unsigned int flags);
 
 bool qemuDomainAgentAvailable(virDomainObjPtr vm,
   bool reportError);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3fede93687..261b680775 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3387,7 +3387,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver,
 
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) {
 goto endjob;
 }
-if (!qemuDomainCheckABIStability(driver, vm, def)) {
+if (!qemuDomainCheckABIStability(driver, vm, def, 0)) {
 virDomainDefFree(def);
 goto endjob;
 }
@@ -15885,9 +15885,10 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr 
snapshot,
 goto endjob;
 
 compatible = 

[libvirt] [PATCH 01/10] Check return status for virUUIDGenerate

2018-04-11 Thread John Ferlan
Although legal, a few paths were not checking a return value < 0
for failure instead they checked a non zero failure.

Clean them all up to be consistent.

Signed-off-by: John Ferlan 
---
 src/conf/domain_conf.c | 2 +-
 src/conf/network_conf.c| 2 +-
 src/conf/secret_conf.c | 2 +-
 src/openvz/openvz_conf.c   | 2 +-
 src/xenconfig/xen_common.c | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d23182f18a..f57f956503 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18776,7 +18776,7 @@ virDomainDefParseXML(xmlDocPtr xml,
  * also serve as the uuid. */
 tmp = virXPathString("string(./uuid[1])", ctxt);
 if (!tmp) {
-if (virUUIDGenerate(def->uuid)) {
+if (virUUIDGenerate(def->uuid) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Failed to generate UUID"));
 goto error;
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 54109a3d2e..630a87fc07 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -1619,7 +1619,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 /* Extract network uuid */
 tmp = virXPathString("string(./uuid[1])", ctxt);
 if (!tmp) {
-if (virUUIDGenerate(def->uuid)) {
+if (virUUIDGenerate(def->uuid) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Failed to generate UUID"));
 goto error;
diff --git a/src/conf/secret_conf.c b/src/conf/secret_conf.c
index 989705234c..7a2e4b28aa 100644
--- a/src/conf/secret_conf.c
+++ b/src/conf/secret_conf.c
@@ -177,7 +177,7 @@ secretXMLParseNode(xmlDocPtr xml, xmlNodePtr root)
 
 uuidstr = virXPathString("string(./uuid)", ctxt);
 if (!uuidstr) {
-if (virUUIDGenerate(def->uuid)) {
+if (virUUIDGenerate(def->uuid) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Failed to generate UUID"));
 goto cleanup;
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 23a02d749e..deb2520ced 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -1020,7 +1020,7 @@ openvzSetUUID(int vpsid)
 {
 unsigned char uuid[VIR_UUID_BUFLEN];
 
-if (virUUIDGenerate(uuid)) {
+if (virUUIDGenerate(uuid) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed to generate UUID"));
 return -1;
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
index bc43185363..7db365f363 100644
--- a/src/xenconfig/xen_common.c
+++ b/src/xenconfig/xen_common.c
@@ -202,7 +202,7 @@ xenConfigGetUUID(virConfPtr conf, const char *name, 
unsigned char *uuid)
 }
 
 if (!(val = virConfGetValue(conf, name))) {
-if (virUUIDGenerate(uuid)) {
+if (virUUIDGenerate(uuid) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Failed to generate UUID"));
 return -1;
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 02/10] conf: Modify last arg to virDomainDefCopy

2018-04-11 Thread John Ferlan
Rather than single boolean, let's create a virDomainDefCopyFlags
and have the last argument be an unsigned int using the new
VIR_DOMAIN_DEF_COPY_MIGRATABLE bit.

Signed-off-by: John Ferlan 
---
 src/conf/domain_conf.c   | 8 
 src/conf/domain_conf.h   | 6 +-
 src/libxl/libxl_domain.c | 4 ++--
 src/qemu/qemu_domain.c   | 5 +++--
 src/qemu/qemu_driver.c   | 5 +++--
 src/test/test_driver.c   | 5 +++--
 6 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f57f956503..5fdcddfa91 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3320,7 +3320,7 @@ virDomainObjSetDefTransient(virCapsPtr caps,
 if (domain->newDef)
 return 0;
 
-if (!(domain->newDef = virDomainDefCopy(domain->def, caps, xmlopt, NULL, 
false)))
+if (!(domain->newDef = virDomainDefCopy(domain->def, caps, xmlopt, NULL, 
0)))
 goto out;
 
 ret = 0;
@@ -27891,7 +27891,7 @@ virDomainDefCopy(virDomainDefPtr src,
  virCapsPtr caps,
  virDomainXMLOptionPtr xmlopt,
  void *parseOpaque,
- bool migratable)
+ unsigned int flags)
 {
 char *xml;
 virDomainDefPtr ret;
@@ -27899,7 +27899,7 @@ virDomainDefCopy(virDomainDefPtr src,
 unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE;
 
-if (migratable)
+if (flags & VIR_DOMAIN_DEF_COPY_MIGRATABLE)
 format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE | 
VIR_DOMAIN_DEF_FORMAT_MIGRATABLE;
 
 /* Easiest to clone via a round-trip through XML.  */
@@ -27920,7 +27920,7 @@ virDomainObjCopyPersistentDef(virDomainObjPtr dom,
 virDomainDefPtr cur;
 
 cur = virDomainObjGetPersistentDef(caps, xmlopt, dom);
-return virDomainDefCopy(cur, caps, xmlopt, NULL, false);
+return virDomainDefCopy(cur, caps, xmlopt, NULL, 0);
 }
 
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 89a7131fdb..4ca22d3617 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2862,11 +2862,15 @@ virDomainDefPtr 
virDomainObjGetOneDefState(virDomainObjPtr vm,
bool *state);
 virDomainDefPtr virDomainObjGetOneDef(virDomainObjPtr vm, unsigned int flags);
 
+typedef enum {
+/* Set when creating a copy of a definition for the purpose of migration */
+VIR_DOMAIN_DEF_COPY_MIGRATABLE = 1 << 0,
+} virDomainDefCopyFlags;
 virDomainDefPtr virDomainDefCopy(virDomainDefPtr src,
  virCapsPtr caps,
  virDomainXMLOptionPtr xmlopt,
  void *parseOpaque,
- bool migratable);
+ unsigned int flags);
 virDomainDefPtr virDomainObjCopyPersistentDef(virDomainObjPtr dom,
   virCapsPtr caps,
   virDomainXMLOptionPtr xmlopt);
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index e76740247d..c58a9c7d72 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -1443,8 +1443,8 @@ libxlDomainDefCheckABIStability(libxlDriverPrivatePtr 
driver,
 libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
 bool ret = false;
 
-if (!(migratableDefSrc = virDomainDefCopy(src, cfg->caps, driver->xmlopt, 
NULL, true)) ||
-!(migratableDefDst = virDomainDefCopy(dst, cfg->caps, driver->xmlopt, 
NULL, true)))
+if (!(migratableDefSrc = virDomainDefCopy(src, cfg->caps, driver->xmlopt, 
NULL, VIR_DOMAIN_DEF_COPY_MIGRATABLE)) ||
+!(migratableDefDst = virDomainDefCopy(dst, cfg->caps, driver->xmlopt, 
NULL, VIR_DOMAIN_DEF_COPY_MIGRATABLE)))
 goto cleanup;
 
 ret = virDomainDefCheckABIStability(migratableDefSrc,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 100304fd05..6568054d7d 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6182,6 +6182,8 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
 virDomainDefPtr copy = NULL;
 virCapsPtr caps = NULL;
 virQEMUCapsPtr qemuCaps = NULL;
+unsigned int copyFlags = (flags & VIR_DOMAIN_XML_MIGRATABLE) ?
+ VIR_DOMAIN_DEF_COPY_MIGRATABLE : 0;
 
 if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
 goto cleanup;
@@ -6189,8 +6191,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
 if (!(flags & (VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE)))
 goto format;
 
-if (!(copy = virDomainDefCopy(def, caps, driver->xmlopt, NULL,
-  flags & VIR_DOMAIN_XML_MIGRATABLE)))
+if (!(copy = virDomainDefCopy(def, caps, driver->xmlopt, NULL, copyFlags)))
 goto cleanup;
 
 def = copy;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 

[libvirt] [PATCH] tests: Xen: use qemu-system-i386 for emulator

2018-04-11 Thread Jim Fehlig
Many of the old xm and sexpr test files used qemu-dm as the emulator.
Modern Xen systems no longer use the old, forked qemu-dm, instead
preferring the distro provided qemu or an "upstream" qemu that is
built when the Xen tools are built. This qemu is typically installed
in /usr/lib/xen/bin/qemu-system-i386.

The libxl test files already use /usr/lib/xen/bin/qemu-system-i386.
For consistency, change the old test files to use the same emulator

Signed-off-by: Jim Fehlig 
---

These config files can serve as examples too, so best not to
encourage use of outdated/deprecated config.

 tests/sexpr2xmldata/sexpr2xml-fv-autoport.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-autoport.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-empty-kernel.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-empty-kernel.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-legacy-vfb.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-legacy-vfb.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-localtime.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-localtime.xml | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-net-netfront.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-net-netfront.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-parallel-tcp.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-parallel-tcp.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2nd-port.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2nd-port.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-file.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-file.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-null.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-null.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-pipe.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-pipe.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-pty.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-pty.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-stdio.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-stdio.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-tcp-telnet.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-tcp-telnet.xml | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-tcp.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-tcp.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-udp.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-udp.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-unix.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-serial-unix.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-sound-all.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-sound-all.xml | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-sound.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-sound.xml | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-usbmouse.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-usbmouse.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-usbtablet.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-usbtablet.xml | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-utc.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-utc.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv-v2.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv.sexpr | 2 +-
 tests/sexpr2xmldata/sexpr2xml-fv.xml   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.sexpr| 2 +-
 tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-pv-vfb-type-crash.sexpr  | 2 +-
 tests/sexpr2xmldata/sexpr2xml-pv-vfb-type-crash.xml| 2 +-
 tests/sexpr2xmldata/sexpr2xml-vif-rate.sexpr   | 2 +-
 tests/sexpr2xmldata/sexpr2xml-vif-rate.xml | 2 +-
 tests/xmconfigdata/test-escape-paths.cfg   | 2 +-
 tests/xmconfigdata/test-escape-paths.xml   | 2 +-
 tests/xmconfigdata/test-fullvirt-default-feature.cfg   | 2 +-
 tests/xmconfigdata/test-fullvirt-default-feature.xml   | 2 +-
 tests/xmconfigdata/test-fullvirt-force-hpet.cfg| 2 +-
 tests/xmconfigdata/test-fullvirt-force-hpet.xml| 2 +-
 tests/xmconfigdata/test-fullvirt-force-nohpet.cfg  | 2 +-
 

Re: [libvirt] [PATCH] news: announce dropping of legacy Xen driver

2018-04-11 Thread Jim Fehlig

On 04/10/2018 02:17 AM, Andrea Bolognani wrote:

On Mon, 2018-04-09 at 15:00 -0600, Jim Fehlig wrote:

Signed-off-by: Jim Fehlig 
---

Not sure if removal of a feature is a feature, but this seems better
placed under "New features" than "Improvements" or "Bug fixes".


It definitely counts as an improvement for those of us working on
the codebase ;)

I think it would make sense to have a "Removed features" section
in between "New features" and "Improvements", at least for this
release: the old Xen driver is not the only chunk of legacy code
being dropped...


  docs/news.xml | 10 ++
  1 file changed, 10 insertions(+)

diff --git a/docs/news.xml b/docs/news.xml
index 798ab6da4..106979cc1 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -44,6 +44,16 @@
add this controller when traditional PCI devices are in use.
  

+  
+
+  Xen: Drop the legacy xend-based driver
+
+
+  The xm/xend toolstack was deprecated in Xen 4.2 and removed
+  from the Xen sources in the 4.5 development cycle. The libvirt
+  driver based on xend is now removed from the libvirt sources.
+
+  
  
  



With a "Removed features" section introduced and the entry moved
to it,

   Reviewed-by: Andrea Bolognani 

but maybe don't push right away to give other people a chance to
chime in.


Crickets...

Pushed now.

Regards,
Jim

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [RFC v2] external (pull) backup API

2018-04-11 Thread John Snow


On 04/11/2018 09:56 AM, Eric Blake wrote:
> On 04/03/2018 07:01 AM, Nikolay Shirokovskiy wrote:
>> Hi, all. 
>> 
>>  
>> 
>> This is another RFC on pull backup API. This API provides means to read 
>> domain   
>> disks in a snapshotted state so that client can back them up as well as 
>> means
>> to write domain disks to revert them to backed up state. The previous 
>> version
>> of RFC is [1]. I'll also describe the API implementation details to shed 
>> light   
>> on misc qemu dirty bitmap commands usage.
>> 
> 
> Thanks for such a detailed message!  It's got enough that I want to
> spend some time thinking about the implications, but this is an early
> reply to let you know I'm at least working on it now.
> 
> The first thing that caught my eye:
> 
>> Here is a list of bitmap commands used in implementation but not yet in 
>> upstream (AFAIK).
>>
>> x-vz-block-dirty-bitmap-remove

We have clear and transactionless remove; this is fine.

>> x-vz-block-dirty-bitmap-merge

Vladimir has a prototype for this I am dragging my feet on because I
wanted to see the anticipated use case, which is provided here. The code
is not complicated.

>> x-vz-block-dirty-bitmap-disable

Same story.

>> x-vz-block-dirty-bitmap-enable (not in the examples; used when removing most 
>> recent checkpoint)

Same.

>> x-vz-nbd-server-add-bitmap

< 
> How close are we to having upstream implementations of any of those
> commands?  If not, what are their specifications?  Libvirt is very
> hesitant to add code that depends on a qemu x-* command, but if we can
> get the actual command into qemu.git without the x-* prefix, it is
> easier to justify libvirt adding the API even if qemu 2.13 is not yet
> released.
> 

Answered in part above, I was hesitant to check in new bitmap commands
like "merge" without the x- prefix to QEMU before I could see the
anticipated workflow and usage for these commands, so I'm going to try
to read this email very carefully to offer any critique.

At one point I offered an alternative workflow that was ... too complex
and at odds with our existing primitives, and I decided to be a little
more hands-off after that.

I'll try to be brief and prudent here.

--js



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 1/2] openvz: Remove unnecessary Unref in openvzLoadDomains

2018-04-11 Thread John Ferlan
Since there is no way to get to cleanup without dom being NULL,
this is a unnecessary Unref.

Signed-off-by: John Ferlan 
---
 src/openvz/openvz_conf.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 23a02d749e..a25eaf570e 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -626,7 +626,6 @@ int openvzLoadDomains(struct openvz_driver *driver)
 virCommandFree(cmd);
 VIR_FREE(temp);
 VIR_FREE(outbuf);
-virObjectUnref(dom);
 virDomainDefFree(def);
 return -1;
 }
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/2] A couple of openvz fixups

2018-04-11 Thread John Ferlan
Patch 1 came from "the next part" of the code when I determined
that the Unref was unnecessary

Patch 2 is a result of Jim Fehlig's review that openvzDomainGetHostname
doesn't really need the error/cleanup logic.

John Ferlan (2):
  openvz: Remove unnecessary Unref in openvzLoadDomains
  openvz: Clean up openvzDomainGetHostname

 src/openvz/openvz_conf.c   | 1 -
 src/openvz/openvz_driver.c | 8 ++--
 2 files changed, 2 insertions(+), 7 deletions(-)

-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [RFC v2] external (pull) backup API

2018-04-11 Thread Eric Blake
On 04/03/2018 07:01 AM, Nikolay Shirokovskiy wrote:
> Hi, all.  
>
>   
>
> This is another RFC on pull backup API. This API provides means to read 
> domain   
> disks in a snapshotted state so that client can back them up as well as means 
>
> to write domain disks to revert them to backed up state. The previous version 
>
> of RFC is [1]. I'll also describe the API implementation details to shed 
> light   
> on misc qemu dirty bitmap commands usage. 
>

This is a first-pass review (making comments as I first encounter
something, even if it gets explained later in the email)

>   
>
> This API does not use existent disks snapshots. Instead it introduces 
> snapshots  
> provided by qemu's blockdev-backup command. The reason is we need snapshotted 
>
> disk state only temporarily for duration of backup operation and newly
>
> introduced snapshots can be easily discarded at the end of operation without  
>
> block commit operation. Technically difference is next. On usual snapshot we  
>
> create new image backed by original and all new data goes to the new image 
> thus  
> original image stays in a snapshotted state. In temporary snapshots we create 
>
> new image backed by original and all new data still goes to the original 
> image   
> but before new data is written old data to be overwritten is popped out to 
> the new   
> image thus we get snapshotted state thru new image.   
>

So, rewriting this to make sure I understand, let's start with a disk
with contents A, then take a snapshot, then write B:

In the existing libvirt snapshot APIs, the data gets distributed as:

base (contents A) <- new active (contents B)

where you want the new API:

base, remains active (contents B) ~~~ backup (contents A)

>   
>
> Disks snapshots as well as disks itself are avaiable to read/write thru qemu  
>
> NBD server.   
>

So the biggest reason for a new libvirt API is that we need management
actions to control which NBD images from qemu are exposed and torn down
at the appropriate sequences.

>   
>
> Here is typical actions on domain backup: 
>
>   
>
> - create temporary snapshot of domain disks of interest   
>
> - export snaphots thru NBD
>
> - back them up
>
> - remove disks from export
>
> - delete temporary snapshot   
>
>   
>
> and typical actions on domain restore:
>
>   
>
> - start domain in paused state
>
> - export domain disks of interest thru NBD for write  
>
> - restore them
>
> - remove disks from export
>
> - resume or destroy domain
>
>   
>
> Now let's write down API in more details. There are minor changes in 
> comparison  
> with previous version [1].
>
>   
>
>  
> *Temporary snapshot API*
> 
> In previous version it is called 

Re: [libvirt] [libvirt PATCH v2 07/44] Clean up qemuDomainAttachNetDevice

2018-04-11 Thread Andrea Bolognani
On Mon, 2018-04-09 at 17:20 +0200, Ján Tomko wrote:
> Now that we assume -netdev support, we no longer set the VLAN
> or need the hostPlugged bool.
> 
> Signed-off-by: Ján Tomko 
> ---
>  src/qemu/qemu_hotplug.c | 42 +-
>  1 file changed, 13 insertions(+), 29 deletions(-)

Reviewed-by: Andrea Bolognani 

-- 
Andrea Bolognani / Red Hat / Virtualization

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [libvirt PATCH v2 06/44] Deprecate QEMU_CAPS_NETDEV

2018-04-11 Thread Andrea Bolognani
On Mon, 2018-04-09 at 17:19 +0200, Ján Tomko wrote:
> This makes qemuDomainSupportsNetdev identical to
> qemuDomainSupportsNicdev and leaves some code in
> qemuDomainAttachNetDevice to be cleaned up later.

[...]
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index f0d549de38..d2e00516e8 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1029,18 +1029,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
>  
>  releaseaddr = true;
>  
> -if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NETDEV)) {
> -vlan = -1;
> -} else {
> -vlan = qemuDomainNetVLAN(net);
> -
> -if (vlan < 0) {
> -virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -   _("Unable to attach network devices without 
> vlan"));
> -goto cleanup;
> -}
> -}
> -
> +vlan = -1;

I was about to comment about how you can drop vlan entirely now,
but then I re-read the commit message and saw the next patch :)

[...]
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 288de59de1..8ff23f2ba9 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -1204,8 +1204,7 @@ mymain(void)
>  DO_TEST("graphics-spice-auto-socket",
>  QEMU_CAPS_SPICE,
>  QEMU_CAPS_SPICE_UNIX,
> -QEMU_CAPS_DEVICE_CIRRUS_VGA);
> -driver.config->spiceAutoUnixSocket = true;
> +QEMU_CAPS_DEVICE_CIRRUS_VGA); driver.config->spiceAutoUnixSocket 
> = true;
>  DO_TEST("graphics-spice-auto-socket-cfg",
>  QEMU_CAPS_SPICE,
>  QEMU_CAPS_SPICE_UNIX,

This hunk must have slipped in, please make sure you drop it
before pushing.

Reviewed-by: Andrea Bolognani 

-- 
Andrea Bolognani / Red Hat / Virtualization

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 6/6] tests: qemuxml2argv: Test formatting of 'write-cache' parameter

2018-04-11 Thread Ján Tomko

On Wed, Apr 04, 2018 at 10:13:59AM +0200, Peter Krempa wrote:

Signed-off-by: Peter Krempa 
---
tests/qemuxml2argvdata/disk-drive-write-cache.args | 45 ++
tests/qemuxml2argvdata/disk-drive-write-cache.xml  | 45 ++
tests/qemuxml2argvtest.c   |  1 +
3 files changed, 91 insertions(+)
create mode 100644 tests/qemuxml2argvdata/disk-drive-write-cache.args
create mode 100644 tests/qemuxml2argvdata/disk-drive-write-cache.xml



ACK

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 5/6] qemu: Format 'write-cache' parameter for disk frontends

2018-04-11 Thread Ján Tomko

On Wed, Apr 04, 2018 at 10:13:58AM +0200, Peter Krempa wrote:

The disk cache mode translates to various frontend and backend
attributes for the qemu block layer. For the frontend device the
'writeback' parameter is used and provided as 'write-cache'. Implement
this so that we can later switch to using -blockdev where we will not
pass the cachemode directly any more.

Signed-off-by: Peter Krempa 
---
src/qemu/qemu_command.c | 27 +++
1 file changed, 27 insertions(+)



ACK

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 3/6] qemu: domain: Add helper for translating disk cachemode to qemu flags

2018-04-11 Thread Ján Tomko

On Wed, Apr 04, 2018 at 10:13:56AM +0200, Peter Krempa wrote:

Add helper which will map values of disk cache mode to the flags which
are accepted by various parts of the qemu block layer.

Signed-off-by: Peter Krempa 
---
src/qemu/qemu_domain.c | 75 ++
src/qemu/qemu_domain.h |  6 
2 files changed, 81 insertions(+)



ACK

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 1/8] qemu: introduce capability for virtual-css-bridge

2018-04-11 Thread Shalini Chellathurai Saroja
Let us introduce the capability QEMU_CAPS_CCW for virtual-css-bridge
and replace QEMU_CAPS_VIRTIO_CCW with QEMU_CAPS_CCW in code segments
which identify support for ccw devices.

The virtual-css-bridge is part of the ccw support introduced in QEMU 2.7.
The QEMU_CAPS_CCW capability is based on the existence of the QEMU type.

Let us also add the capability QEMU_CAPS_CCW to the tests which
require support for ccw devices.

Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
---
 src/qemu/qemu_capabilities.c |  9 +++
 src/qemu/qemu_capabilities.h |  1 +
 src/qemu/qemu_domain.c   |  2 +-
 src/qemu/qemu_domain_address.c   |  4 +-
 src/qemu/qemu_hotplug.c  |  4 +-
 tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml |  1 +
 tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml |  1 +
 tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml  |  1 +
 tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml  |  1 +
 tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml  |  1 +
 tests/qemuhotplugtest.c  |  2 +-
 tests/qemuxml2argvtest.c | 86 
 tests/qemuxml2xmltest.c  | 26 +++
 13 files changed, 77 insertions(+), 62 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 91b7aa31ec..719f527362 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -468,6 +468,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
   "virtio-tablet-ccw",
   "qcow2-luks",
   "pcie-pci-bridge",
+  "virtual-css-bridge",
 );
 
 
@@ -1104,6 +1105,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
 { "virtio-mouse-ccw", QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW },
 { "virtio-tablet-ccw", QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW },
 { "pcie-pci-bridge", QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE },
+{ "virtual-css-bridge", QEMU_CAPS_CCW },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
@@ -3926,6 +3928,13 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
 virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
 virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_CACHE);
 
+if (ARCH_IS_S390(qemuCaps->arch)) {
+/* Legacy assurance for QEMU_CAPS_CCW */
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW) &&
+virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW))
+virQEMUCapsSet(qemuCaps, QEMU_CAPS_CCW);
+}
+
 ret = 0;
  cleanup:
 return ret;
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index bec28cae92..728d7fa7d2 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -452,6 +452,7 @@ typedef enum {
 QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW, /* -device virtio-tablet-ccw */
 QEMU_CAPS_QCOW2_LUKS, /* qcow2 format support LUKS encryption */
 QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE, /* -device pcie-pci-bridge */
+QEMU_CAPS_CCW, /* -device virtual-css-bridge */
 
 QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 100304fd05..9f1f6a218f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -11780,7 +11780,7 @@ qemuDomainCheckCCWS390AddressSupport(const virDomainDef 
*def,
  "'%s' using machine type '%s'"),
devicename, def->os.machine);
 return false;
-} else if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW)) {
+} else if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW)) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("CCW address type is not supported by "
  "this QEMU"));
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 7fe9d5926c..ae6c59bb01 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -396,7 +396,7 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def,
 virDomainCCWAddressSetPtr addrs = NULL;
 
 if (qemuDomainIsS390CCW(def) &&
-virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW)) {
+virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW)) {
 qemuDomainPrimeVirtioDeviceAddresses(
 def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW);
 
@@ -2985,7 +2985,7 @@ qemuDomainEnsureVirtioAddress(bool *releaseAddr,
 
 if (!info->type) {
 if (qemuDomainIsS390CCW(vm->def) &&
-virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW))
+virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CCW))
 info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW;
 else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_S390))
 info->type 

[libvirt] [PATCH 5/8] qemu: command line generation for vfio-ccw device

2018-04-11 Thread Shalini Chellathurai Saroja
Generates the QEMU command line for the vfio-ccw device.

Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
Reviewed-by: Marc Hartmayer 
---
 src/qemu/qemu_command.c | 33 -
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index e47f915fc8..ad60a7b433 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5123,11 +5123,17 @@ qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
 virDomainHostdevSubsysMediatedDevPtr mdevsrc = >source.subsys.u.mdev;
 char *ret = NULL;
 char *mdevPath = NULL;
+const char *dev_str = NULL;
 
 if (!(mdevPath = virMediatedDeviceGetSysfsPath(mdevsrc->uuidstr)))
 goto cleanup;
 
-virBufferAddLit(, "vfio-pci");
+dev_str = virMediatedDeviceModelTypeToString(mdevsrc->model);
+
+if (!dev_str)
+goto cleanup;
+
+virBufferAdd(, dev_str, -1);
 virBufferAsprintf(, ",id=%s,sysfsdev=%s", dev->info->alias, mdevPath);
 
 if (qemuBuildDeviceAddressStr(, def, dev->info, qemuCaps) < 0)
@@ -5347,11 +5353,28 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
 
 /* MDEV */
 if (virHostdevIsMdevDevice(hostdev)) {
-if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("VFIO PCI device assignment is not "
- "supported by this version of qemu"));
+switch ((virMediatedDeviceModelType) subsys->u.mdev.model) {
+case VIR_MDEV_MODEL_TYPE_VFIO_PCI:
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+   _("VFIO PCI device assignment is not "
+ "supported by this version of QEMU"));
+return -1;
+}
+break;
+case VIR_MDEV_MODEL_TYPE_VFIO_CCW:
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+   _("VFIO CCW device assignment is not "
+ "supported by this version of QEMU"));
+return -1;
+}
+break;
+case VIR_MDEV_MODEL_TYPE_LAST:
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("unexpected vfio type '%d'"), 
subsys->u.mdev.model);
 return -1;
+break;
 }
 
 virCommandAddArg(cmd, "-device");
-- 
2.13.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/8] vfio-ccw passthrough support

2018-04-11 Thread Shalini Chellathurai Saroja
Let us support the basic channel I/O passthrough infrastructure based on
vfio, which have been introduced in QEMU 2.10. The current focus is to
support dasd-eckd (cu_type/dev_type = 0x3990/0x3390) as the target
device.

Shalini Chellathurai Saroja (8):
  qemu: introduce capability for virtual-css-bridge
  qemu: introduce vfio-ccw capability
  util: virhostdev: add virHostdevIsMdevDevice()
  qemu: vfio-ccw device address generation
  qemu: command line generation for vfio-ccw device
  tests: tests for vfio-ccw passthrough
  docs: documentation for vfio-ccw passthrough
  news: documentation of new feature

 docs/drvnodedev.html.in|  21 -
 docs/formatdomain.html.in  |  20 +++-
 docs/news.xml  |   9 ++
 docs/schemas/domaincommon.rng  |   5 +-
 src/libvirt_private.syms   |   1 +
 src/qemu/qemu_capabilities.c   |  23 +
 src/qemu/qemu_capabilities.h   |   5 +
 src/qemu/qemu_command.c|  37 ++--
 src/qemu/qemu_domain.c |   2 +-
 src/qemu/qemu_domain_address.c |  32 +--
 src/qemu/qemu_hostdev.c|   3 +-
 src/qemu/qemu_hotplug.c|   4 +-
 src/util/virhostdev.c  |  26 --
 src/util/virhostdev.h  |   3 +
 src/util/virmdev.c |   3 +-
 src/util/virmdev.h |   1 +
 .../qemucapabilitiesdata/caps_2.10.0.s390x.replies |  28 --
 tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml   |   3 +-
 .../qemucapabilitiesdata/caps_2.11.0.s390x.replies |  28 --
 tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml   |   3 +-
 .../qemucapabilitiesdata/caps_2.12.0.s390x.replies |  31 +--
 tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml   |   3 +
 .../qemucapabilitiesdata/caps_2.7.0.s390x.replies  |  24 +++--
 tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml|   3 +-
 .../qemucapabilitiesdata/caps_2.8.0.s390x.replies  |  28 --
 tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml|   3 +-
 .../qemucapabilitiesdata/caps_2.9.0.s390x.replies  |  28 --
 tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml|   3 +-
 tests/qemuhotplugtest.c|   2 +-
 ...tdev-subsys-mdev-vfio-ccw-duplicate-address.xml |  29 ++
 ...ostdev-subsys-mdev-vfio-ccw-invalid-address.xml |  23 +
 .../hostdev-subsys-mdev-vfio-ccw.args  |  23 +
 .../hostdev-subsys-mdev-vfio-ccw.xml   |  22 +
 tests/qemuxml2argvtest.c   | 102 -
 .../hostdev-subsys-mdev-vfio-ccw.xml   |  28 ++
 tests/qemuxml2xmltest.c|  31 ---
 36 files changed, 491 insertions(+), 149 deletions(-)
 create mode 100644 
tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml
 create mode 100644 
tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml
 create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args
 create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.xml
 create mode 100644 tests/qemuxml2xmloutdata/hostdev-subsys-mdev-vfio-ccw.xml

-- 
2.13.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 6/8] tests: tests for vfio-ccw passthrough

2018-04-11 Thread Shalini Chellathurai Saroja
Let us test the following functionalities of vfio-ccw in libvirt
1. Generation of QEMU command line from domain xml file
2. Generation of dump xml from domain xml file
3. Checks duplicate/invalid addresses for vfio-ccw devices.

Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
Reviewed-by: Marc Hartmayer 
Reviewed-by: Stefan Zimmermann 
---
 ...tdev-subsys-mdev-vfio-ccw-duplicate-address.xml | 29 ++
 ...ostdev-subsys-mdev-vfio-ccw-invalid-address.xml | 23 +
 .../hostdev-subsys-mdev-vfio-ccw.args  | 23 +
 .../hostdev-subsys-mdev-vfio-ccw.xml   | 22 
 tests/qemuxml2argvtest.c   | 16 
 .../hostdev-subsys-mdev-vfio-ccw.xml   | 28 +
 tests/qemuxml2xmltest.c|  5 
 7 files changed, 146 insertions(+)
 create mode 100644 
tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml
 create mode 100644 
tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml
 create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args
 create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.xml
 create mode 100644 tests/qemuxml2xmloutdata/hostdev-subsys-mdev-vfio-ccw.xml

diff --git 
a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml 
b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml
new file mode 100644
index 00..4b95fe277c
--- /dev/null
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml
@@ -0,0 +1,29 @@
+
+  QEMUGuest1
+  c7a5fdbd-edaf-9455-926a-d65c16db1809
+  524288
+  524288
+  2
+  
+hvm
+  
+  
+  destroy
+  restart
+  destroy
+  
+/usr/bin/qemu-system-s390x
+
+  
+
+  
+  
+
+
+  
+
+  
+  
+
+  
+
diff --git 
a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml 
b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml
new file mode 100644
index 00..680090e2b0
--- /dev/null
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml
@@ -0,0 +1,23 @@
+
+  QEMUGuest1
+  c7a5fdbd-edaf-9455-926a-d65c16db1809
+  524288
+  524288
+  2
+  
+hvm
+  
+  
+  destroy
+  restart
+  destroy
+  
+/usr/bin/qemu-system-s390x
+
+  
+
+  
+  
+
+  
+
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args 
b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args
new file mode 100644
index 00..a359f40e2e
--- /dev/null
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args
@@ -0,0 +1,23 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-s390x \
+-name QEMUGuest1 \
+-S \
+-M s390-ccw-virtio \
+-m 512 \
+-smp 2,sockets=2,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-chardev 
socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-boot c \
+-device vfio-ccw,id=hostdev0,\
+sysfsdev=/sys/bus/mdev/devices/90c6c135-ad44-41d0-b1b7-bae47de48627,\
+devno=fe.0. \
+-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0001
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.xml 
b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.xml
new file mode 100644
index 00..96f30f5e9c
--- /dev/null
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.xml
@@ -0,0 +1,22 @@
+
+  QEMUGuest1
+  c7a5fdbd-edaf-9455-926a-d65c16db1809
+  524288
+  524288
+  2
+  
+hvm
+  
+  
+  destroy
+  restart
+  destroy
+  
+/usr/bin/qemu-system-s390x
+
+  
+
+  
+
+  
+
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index de5bf6fe5a..64ab04817a 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1659,6 +1659,22 @@ mymain(void)
 DO_TEST("pci-rom",
 QEMU_CAPS_NODEFCONFIG);
 
+DO_TEST("hostdev-subsys-mdev-vfio-ccw",
+QEMU_CAPS_CCW,
+QEMU_CAPS_CCW_CSSID_UNRESTRICTED,
+QEMU_CAPS_DEVICE_VFIO_CCW);
+DO_TEST_FAILURE("hostdev-subsys-mdev-vfio-ccw",
+QEMU_CAPS_CCW,
+QEMU_CAPS_CCW_CSSID_UNRESTRICTED);
+DO_TEST_PARSE_ERROR("hostdev-subsys-mdev-vfio-ccw-duplicate-address",
+QEMU_CAPS_CCW,
+QEMU_CAPS_CCW_CSSID_UNRESTRICTED,
+QEMU_CAPS_DEVICE_VFIO_CCW);
+DO_TEST_PARSE_ERROR("hostdev-subsys-mdev-vfio-ccw-invalid-address",
+QEMU_CAPS_CCW,
+QEMU_CAPS_CCW_CSSID_UNRESTRICTED,
+QEMU_CAPS_DEVICE_VFIO_CCW);
+
 

[libvirt] [PATCH 7/8] docs: documentation for vfio-ccw passthrough

2018-04-11 Thread Shalini Chellathurai Saroja
Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
---
 docs/drvnodedev.html.in   | 21 -
 docs/formatdomain.html.in | 20 +++-
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/docs/drvnodedev.html.in b/docs/drvnodedev.html.in
index 885904d67d..71a8a57b0c 100644
--- a/docs/drvnodedev.html.in
+++ b/docs/drvnodedev.html.in
@@ -335,8 +335,27 @@
 $ ls /sys/class/mdev_bus/device/mdev_supported_types
 
 
+  Before creating a mediated device, unbind the device from the respective
+  device driver, eg. subchannel I/O driver for a CCW device. Then bind the
+  device to the respective VFIO driver. For a CCW device, also unbind the
+  corresponding subchannel of the CCW device from the subchannel I/O driver
+  and then bind the subchannel (instead of the CCW device) to the vfio_ccw
+  driver. The below example shows the unbinding and binding steps for a CCW
+  device.
+
+
+
+device="0.0.1234"
+subchannel="0.0.0123"
+echo $device  /sys/bus/ccw/devices/$device/driver/unbind
+echo $subchannel  /sys/bus/css/devices/$subchannel/driver/unbind
+echo $subchannel  /sys/bus/css/drivers/vfio_ccw/bind
+
+
+
   To manually instantiate a mediated device, use one of the following as a
-  reference:
+  reference. For a CCW device, use the subchannel ID instead of the device
+  ID.
 
 
 
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 5e99884dc5..ff8ec25928 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4308,6 +4308,12 @@
   address uuid='c2177883-f1bb-47f0-914d-32a22e3a8804'/
 /source
 /hostdev
+hostdev mode='subsystem' type='mdev' model='vfio-ccw'
+source
+  address uuid='9063cba3-ecef-47b6-abcf-3fef4fdcad85'/
+/source
+address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0001'/
+/hostdev
   /devices
   ...
 
@@ -4359,10 +4365,13 @@
   For mediated devices (Since 3.2.0)
   the model attribute specifies the device API which
   determines how the host's vfio driver will expose the device to the
-  guest. Currently, only model='vfio-pci' is supported.
-  There are also some implications on the usage of guest's address type
-  depending on the model attribute, see the
-  address element below.
+  guest. Currently, model='vfio-pci' and
+  model='vfio-ccw' (Since 
4.3.0)
+  is supported. Refer MDEV to create
+  a mediated device on the host. There are also some implications on 
the
+  usage of guest's address type depending on the model
+  attribute, see the address element below.
+  
 
 
   Note: The managed attribute is only used with
@@ -4488,7 +4497,8 @@
   devices defining an allocation of resources on the physical parent 
device,
   the address type used must conform to the model attribute
   of element hostdev, e.g. any address type other than PCI for
-  vfio-pci device API will result in an error.
+  vfio-pci device API or any address type other than CCW for
+  vfio-ccw device API will result in an error.
   See above for more details on the address
   element.
   driver
-- 
2.13.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 2/6] tests: qemuxm2argv: Add infrastructure for testing with real qemuCaps

2018-04-11 Thread Ján Tomko

s/xm/xml/ in the summary

On Wed, Apr 04, 2018 at 10:13:55AM +0200, Peter Krempa wrote:

Allow testing of XML->argv conversion with using a real capability map
as used in the qemucapabilitiestest. This allows specifying the required
qemu version with the test rather than having to enumerate all the
required capabilities.

Signed-off-by: Peter Krempa 
---
tests/qemuxml2argvtest.c | 31 +++
1 file changed, 31 insertions(+)



ACK

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 4/8] qemu: vfio-ccw device address generation

2018-04-11 Thread Shalini Chellathurai Saroja
Introduces the vfio-ccw model for mediated devices and prime vfio-ccw
devices such that CCW address will be generated.

Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
Reviewed-by: Marc Hartmayer 
Reviewed-by: Stefan Zimmermann 
---
 docs/schemas/domaincommon.rng  |  5 -
 src/qemu/qemu_domain_address.c | 20 
 src/util/virmdev.c |  3 ++-
 src/util/virmdev.h |  1 +
 4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 4cab55f05d..dfb4a3c43a 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4475,7 +4475,10 @@
   mdev
 
 
-  vfio-pci
+  
+vfio-pci
+vfio-ccw
+  
 
 
   
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 8acd5a7b71..1b4d8bf66c 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -282,6 +282,23 @@ qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def)
 
 
 static void
+qemuDomainPrimeVfioDeviceAddresses(virDomainDefPtr def,
+  virDomainDeviceAddressType type)
+{
+size_t i;
+
+for (i = 0; i < def->nhostdevs; i++) {
+virDomainHostdevSubsysPtr subsys = >hostdevs[i]->source.subsys;
+
+if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
+subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
+def->hostdevs[i]->info->type == 
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
+def->hostdevs[i]->info->type = type;
+}
+}
+
+
+static void
 qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def,
  virDomainDeviceAddressType type)
 {
@@ -397,6 +414,9 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def,
 
 if (qemuDomainIsS390CCW(def) &&
 virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW)) {
+if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW))
+qemuDomainPrimeVfioDeviceAddresses(
+def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW);
 qemuDomainPrimeVirtioDeviceAddresses(
 def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW);
 
diff --git a/src/util/virmdev.c b/src/util/virmdev.c
index 27541cf34f..1ac5cb403d 100644
--- a/src/util/virmdev.c
+++ b/src/util/virmdev.c
@@ -48,7 +48,8 @@ struct _virMediatedDeviceList {
 };
 
 VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
-  "vfio-pci")
+  "vfio-pci",
+  "vfio-ccw")
 
 static virClassPtr virMediatedDeviceListClass;
 
diff --git a/src/util/virmdev.h b/src/util/virmdev.h
index 01ab02e751..cfda2cacab 100644
--- a/src/util/virmdev.h
+++ b/src/util/virmdev.h
@@ -25,6 +25,7 @@
 
 typedef enum {
 VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
+VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
 
 VIR_MDEV_MODEL_TYPE_LAST
 } virMediatedDeviceModelType;
-- 
2.13.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 1/6] tests: utils: Allow parsing test capability file without virCaps

2018-04-11 Thread Ján Tomko

On Wed, Apr 04, 2018 at 10:13:54AM +0200, Peter Krempa wrote:

virCaps was used only to propagate the host architecture, so the
function can be extracted in a way which does not require it.

Signed-off-by: Peter Krempa 
---
tests/testutilsqemu.c | 21 +++--
tests/testutilsqemu.h |  3 +++
2 files changed, 18 insertions(+), 6 deletions(-)



ACK

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 2/8] qemu: introduce vfio-ccw capability

2018-04-11 Thread Shalini Chellathurai Saroja
Let us introduce the capability vfio-ccw for supporting the basic
channel I/O passthrough, which have been introduced in QEMU 2.10. The
current focus is to support dasd-eckd (cu_type/dev_type = 0x3990/0x3390)
as the target device.

Let us also introduce the capability QEMU_CAPS_CCW_CSSID_UNRESTRICTED
for virtual-css-bridge. This capability is based on the
cssid-unrestricted property which exists if QEMU no longer enforces
cssid restrictions based on ccw device types.

Vfio-ccw capability is dependent on the hidden virtual-css-bridge, so
that we are able to probe for the cssid-unrestriced property.

Signed-off-by: Shalini Chellathurai Saroja 
Reviewed-by: Bjoern Walk 
Reviewed-by: Boris Fiuczynski 
---
 src/qemu/qemu_capabilities.c   | 14 ++
 src/qemu/qemu_capabilities.h   |  4 +++
 .../qemucapabilitiesdata/caps_2.10.0.s390x.replies | 28 ---
 tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml   |  2 +-
 .../qemucapabilitiesdata/caps_2.11.0.s390x.replies | 28 ---
 tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml   |  2 +-
 .../qemucapabilitiesdata/caps_2.12.0.s390x.replies | 31 --
 tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml   |  3 +++
 .../qemucapabilitiesdata/caps_2.7.0.s390x.replies  | 24 -
 tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml|  2 +-
 .../qemucapabilitiesdata/caps_2.8.0.s390x.replies  | 28 ---
 tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml|  2 +-
 .../qemucapabilitiesdata/caps_2.9.0.s390x.replies  | 28 ---
 tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml|  2 +-
 14 files changed, 142 insertions(+), 56 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 719f527362..a0816de80d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -469,6 +469,10 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
   "qcow2-luks",
   "pcie-pci-bridge",
   "virtual-css-bridge",
+  "virtual-css-bridge.cssid-unrestricted",
+
+  /* 290 */
+  "vfio-ccw",
 );
 
 
@@ -1106,6 +1110,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
 { "virtio-tablet-ccw", QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW },
 { "pcie-pci-bridge", QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE },
 { "virtual-css-bridge", QEMU_CAPS_CCW },
+{ "vfio-ccw", QEMU_CAPS_DEVICE_VFIO_CCW },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
@@ -1244,6 +1249,10 @@ static struct virQEMUCapsStringFlags 
virQEMUCapsObjectPropsIntelIOMMU[] = {
 { "device-iotlb", QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB },
 };
 
+static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtualCSSBridge[] 
= {
+{ "cssid-unrestricted", QEMU_CAPS_CCW_CSSID_UNRESTRICTED },
+};
+
 /* see documentation for virQEMUQAPISchemaPathGet for the query format */
 static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
 { "blockdev-add/arg-type/options/+gluster/debug-level", 
QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
@@ -1363,6 +1372,9 @@ static struct virQEMUCapsObjectTypeProps 
virQEMUCapsObjectProps[] = {
 { "virtio-gpu-ccw", virQEMUCapsObjectPropsVirtioGpu,
   ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioGpu),
   QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
+{ "virtual-css-bridge", virQEMUCapsObjectPropsVirtualCSSBridge,
+  ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtualCSSBridge),
+  QEMU_CAPS_CCW },
 };
 
 
@@ -3933,6 +3945,8 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
 if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW) &&
 virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW))
 virQEMUCapsSet(qemuCaps, QEMU_CAPS_CCW);
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW_CSSID_UNRESTRICTED))
+virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW);
 }
 
 ret = 0;
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 728d7fa7d2..c489aeb9c3 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -453,6 +453,10 @@ typedef enum {
 QEMU_CAPS_QCOW2_LUKS, /* qcow2 format support LUKS encryption */
 QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE, /* -device pcie-pci-bridge */
 QEMU_CAPS_CCW, /* -device virtual-css-bridge */
+QEMU_CAPS_CCW_CSSID_UNRESTRICTED, /* 
virtual-css-bridge.cssid-unrestricted= */
+
+/* 290 */
+QEMU_CAPS_DEVICE_VFIO_CCW, /* -device vfio-ccw */
 
 QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.replies 
b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.replies
index 534756f0b3..3e19ac67da 100644
--- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.replies
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.replies
@@ -3405,6 +3405,16 @@
 {
   

Re: [libvirt] [PATCH 6/6] tests: qemuxml2argv: Test formatting of 'write-cache' parameter

2018-04-11 Thread John Ferlan


On 04/04/2018 04:13 AM, Peter Krempa wrote:
> Signed-off-by: Peter Krempa 
> ---
>  tests/qemuxml2argvdata/disk-drive-write-cache.args | 45 
> ++
>  tests/qemuxml2argvdata/disk-drive-write-cache.xml  | 45 
> ++
>  tests/qemuxml2argvtest.c   |  1 +
>  3 files changed, 91 insertions(+)
>  create mode 100644 tests/qemuxml2argvdata/disk-drive-write-cache.args
>  create mode 100644 tests/qemuxml2argvdata/disk-drive-write-cache.xml
> 

This should be merged with patch 5 - there's also no xml2xml test

Also considering patch 2, all we're testing is x86_64 on 2.12 even
though we have the feature available on other arches for other versions.

I don't believe we have any existing test that sets cache= to anything
other than 'none' (e.g. qemuDiskCacheV2 isn't really used or checked
currently).

Why wouldn't any of the existing cache=none would change too...  OK
other than the fact that you're only testing for 2.12 and beyond...

Perhaps it would have been interesting to see the results of this test
before the new capability and how it changes afterwards.

John

> diff --git a/tests/qemuxml2argvdata/disk-drive-write-cache.args 
> b/tests/qemuxml2argvdata/disk-drive-write-cache.args
> new file mode 100644
> index 00..3973249d18
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-write-cache.args
> @@ -0,0 +1,45 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name guest=QEMUGuest1,debug-threads=on \
> +-S \
> +-object secret,id=masterKey0,format=raw,\
> +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
> +-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \
> +-m 214 \
> +-realtime mlock=off \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-display none \
> +-no-user-config \
> +-nodefaults \
> +-chardev 
> socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=control \
> +-rtc base=utc \
> +-no-shutdown \
> +-no-acpi \
> +-boot strict=on \
> +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
> +-device lsi,id=scsi0,bus=pci.0,addr=0x2 \
> +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-ide0-0-0,\
> +cache=writeback \
> +-device 
> ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1,\
> +write-cache=on \
> +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-scsi0-0-0,\
> +cache=none \
> +-device scsi-hd,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0,\
> +write-cache=on \
> +-drive 
> file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-virtio-disk0,\
> +cache=writethrough \
> +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\
> +id=virtio-disk0,write-cache=off \
> +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,if=none,id=drive-usb-disk1,\
> +cache=directsync \
> +-device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk1,id=usb-disk1,\
> +removable=off,write-cache=off \
> +-msg timestamp=on
> diff --git a/tests/qemuxml2argvdata/disk-drive-write-cache.xml 
> b/tests/qemuxml2argvdata/disk-drive-write-cache.xml
> new file mode 100644
> index 00..dc7bdd6050
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-write-cache.xml
> @@ -0,0 +1,45 @@
> +
> +  QEMUGuest1
> +  c7a5fdbd-edaf-9455-926a-d65c16db1809
> +  219136
> +  219136
> +  1
> +  
> +hvm
> +
> +  
> +  
> +  destroy
> +  restart
> +  destroy
> +  
> +/usr/bin/qemu-system-i686
> +
> +  
> +  
> +  
> +  
> +
> +
> +  
> +  
> +  
> +
> +
> +  
> +  
> +  
> +
> +
> +  
> +  
> +  
> +
> +
> +
> +
> +
> +
> +
> +  
> +
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index c540ce2f50..b70780bf4e 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -998,6 +998,7 @@ mymain(void)
>  DO_TEST("disk-drive-cache-v2-wt", NONE);
>  DO_TEST("disk-drive-cache-v2-wb", NONE);
>  DO_TEST("disk-drive-cache-v2-none", NONE);
> +DO_TEST_CAPS("disk-drive-write-cache", "2.12.0");
>  DO_TEST("disk-drive-cache-directsync",
>  QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
>  DO_TEST("disk-drive-cache-unsafe",
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 3/6] qemu: domain: Add helper for translating disk cachemode to qemu flags

2018-04-11 Thread John Ferlan


On 04/04/2018 04:13 AM, Peter Krempa wrote:
> Add helper which will map values of disk cache mode to the flags which
> are accepted by various parts of the qemu block layer.
> 
> Signed-off-by: Peter Krempa 
> ---
>  src/qemu/qemu_domain.c | 75 
> ++
>  src/qemu/qemu_domain.h |  6 
>  2 files changed, 81 insertions(+)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 9d1c33b54a..20333c9568 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -11920,6 +11920,81 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk,
>  }
> 
> 
> +/**
> + * qemuDomainDiskCachemodeFlags:
> + *
> + * Converts disk cachemode to the cache mode options for qemu. Returns -1 for
> + * invalid @cachemode values and fills the flags and returns 0 on success.
> + * Flags may be NULL.
> + */
> +int
> +qemuDomainDiskCachemodeFlags(int cachemode,
> + bool *writeback,
> + bool *direct,
> + bool *noflush)

Yuck, multiple boolean returns and when a new mode is added, we
possibly get another bool argument leading to another useless argument.
This could conceivably do nothing if each of the return args was NULL.

It seems what you're doing is translating or converting the
VIR_DOMAIN_DISK_CACHE_* values into some mask that you'll use elsewhere
perhaps similar to virDomainDefFormatConvertXMLFlags.

I think this just returns an unsigned int mask that's particular to some
to be defined enum that would set the right bits so that when building
the command line we can add features based on those bits.

That way it really doesn't matter that direct and noflush aren't used
(yet) in any patch that's been posted...

> +{
> +bool dummy;
> +
> +if (!writeback)
> +writeback = 
> +
> +if (!direct)
> +direct = 
> +
> +if (!noflush)
> +noflush = 
> +
> +/* Mapping of cache modes to the attributes according to qemu-options.hx
> + *  │ cache.writeback   cache.direct   cache.no-flush
> + * ─┼─
> + * writeback│ true  false  false
> + * none │ true  true   false
> + * writethrough │ false false  false
> + * directsync   │ false true   false
> + * unsafe   │ true  false  true
> + */
> +switch ((virDomainDiskCache) cachemode) {
> +case VIR_DOMAIN_DISK_CACHE_DISABLE: /* 'none' */
> +*writeback = true;
> +*direct = true;
> +*noflush = false;
> +break;
> +
> +case VIR_DOMAIN_DISK_CACHE_WRITETHRU:
> +*writeback = false;
> +*direct = false;
> +*noflush = false;
> +break;
> +
> +case VIR_DOMAIN_DISK_CACHE_WRITEBACK:
> +*writeback = true;
> +*direct = false;
> +*noflush = false;
> +break;
> +
> +case VIR_DOMAIN_DISK_CACHE_DIRECTSYNC:
> +*writeback = false;
> +*direct = true;
> +*noflush = false;
> +break;
> +
> +case VIR_DOMAIN_DISK_CACHE_UNSAFE:
> +*writeback = true;
> +*direct = false;
> +*noflush = true;
> +break;
> +
> +case VIR_DOMAIN_DISK_CACHE_DEFAULT:

Based on the patch 5 consumer qemuBuildDriveDevCacheStr - this would
DEFAULT would never happen.

> +case VIR_DOMAIN_DISK_CACHE_LAST:
> +default:

Considering how/when this helper is being used, one would hope by the
time this is used that cachemode has already been verified to be in
range. It would seem that's true because virDomainDiskDefDriverParseXML
would have failed the virDomainDiskCacheTypeFromString.

John

> +virReportEnumRangeError(virDomainDiskCache, cachemode);
> +return -1;
> +}
> +
> +return 0;
> +}
> +
> +
>  void
>  qemuProcessEventFree(struct qemuProcessEvent *event)
>  {
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 21e12f6594..bbc2e83760 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -1003,4 +1003,10 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk,
>  qemuDomainObjPrivatePtr priv,
>  virQEMUDriverConfigPtr cfg);
> 
> +int
> +qemuDomainDiskCachemodeFlags(int cachemode,
> + bool *writeback,
> + bool *direct,
> + bool *noflush);
> +
>  #endif /* __QEMU_DOMAIN_H__ */
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] path for user provided all-guest-read-only content

2018-04-11 Thread Christian Ehrhardt
Feel free to read [1] for context, here the quote that made me poll for
opinions:
  "it would be nice in the future to have some standardized path for user
provided guest-read-only stuff"

The TL;DR of their case is:
- extra info they want to pass, but is not part of libvirts guest
description (qemu-cmdline in their case)
- apparmor blocks their access to an unknown path

There are no reliable paths today to put data for a guest. Guests are names
with their ID in the paths - so even knowing the guest name - they are not
predictable (for example /var/lib/libvirt/qemu/domain-1-guestname/ might be
different next time).

Due to that I can see their use-case for "let all read from there", but
OTOH "let all" always feels wrong at first from a security POV.

Therefore i wanted to poll for opinions on this before suggesting any
change.

[1]: https://github.com/coreos/bugs/issues/2083#issuecomment-380404427


-- 
Christian Ehrhardt
Software Engineer, Ubuntu Server
Canonical Ltd
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 1/6] tests: utils: Allow parsing test capability file without virCaps

2018-04-11 Thread John Ferlan


On 04/04/2018 04:13 AM, Peter Krempa wrote:
> virCaps was used only to propagate the host architecture, so the
> function can be extracted in a way which does not require it.
> 
> Signed-off-by: Peter Krempa 
> ---
>  tests/testutilsqemu.c | 21 +++--
>  tests/testutilsqemu.h |  3 +++
>  2 files changed, 18 insertions(+), 6 deletions(-)
> 

Reviewed-by: John Ferlan 

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 73/73] qemuxml2xmltest: Add status XML tests for migration params

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 .../migration-in-params-in.xml| 400 +
 .../migration-in-params-out.xml   |   1 +
 .../migration-out-params-in.xml   | 414 ++
 .../migration-out-params-out.xml  |   1 +
 tests/qemuxml2xmltest.c   |   2 +
 5 files changed, 818 insertions(+)
 create mode 100644 tests/qemustatusxml2xmldata/migration-in-params-in.xml
 create mode 12 tests/qemustatusxml2xmldata/migration-in-params-out.xml
 create mode 100644 tests/qemustatusxml2xmldata/migration-out-params-in.xml
 create mode 12 tests/qemustatusxml2xmldata/migration-out-params-out.xml

diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml 
b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
new file mode 100644
index 00..b0caa34e61
--- /dev/null
+++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
@@ -0,0 +1,400 @@
+
+  
+  
+  
+  
+
+  
+  
+
+
+  
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+  
+  
+  
+  
+  
+  
+nest
+994cee0d-2a70-4937-9693-0431e39d20f7
+virt-builder
+524288
+524288
+2
+
+  /machine
+
+
+  hvm
+  
+
+
+  
+  
+  
+
+
+
+  
+  
+  
+
+destroy
+restart
+restart
+
+  
+  
+
+
+  /usr/bin/qemu-kvm
+  
+
+
+
+
+
+
+
+  
+  
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+  
+  
+
+
+  
+  
+
+  
+  
+
+
+
+  
+
+
+
+
+
+  
+  
+
+
+  
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+
+  
+  
+
+
+
+  
+  
+
+
+  
+  
+
+  
+  
+
+  
+  
+
+
+  
+  
+
+
+
+  
+  
+
+
+  
+  
+
+
+  
+  
+
+
+  unconfined_u:unconfined_r:svirt_t:s0:c708,c793
+  unconfined_u:object_r:svirt_image_t:s0:c708,c793
+
+
+  +0:+0
+  +0:+0
+
+  
+
diff --git a/tests/qemustatusxml2xmldata/migration-in-params-out.xml 
b/tests/qemustatusxml2xmldata/migration-in-params-out.xml
new file mode 12
index 00..384747c5b1
--- /dev/null
+++ b/tests/qemustatusxml2xmldata/migration-in-params-out.xml
@@ -0,0 +1 @@
+migration-in-params-in.xml
\ No newline at end of file
diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml 
b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
new file mode 100644
index 00..17649796ff
--- /dev/null
+++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
@@ -0,0 +1,414 @@
+
+  
+  
+  
+  
+
+  
+  
+
+
+  
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

[libvirt] [PATCH v2 70/73] qemu: Drop priv->job.postcopyEnabled bool

2018-04-11 Thread Jiri Denemark
We store the flags passed to the API which started the migration. Let's
use them instead of a separate bool to check if post-copy migration was
requested.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c| 1 -
 src/qemu/qemu_domain.h| 1 -
 src/qemu/qemu_driver.c| 2 +-
 src/qemu/qemu_migration.c | 4 
 4 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 9343f41f57..71c3a917c1 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -332,7 +332,6 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
 job->abortJob = false;
 job->spiceMigration = false;
 job->spiceMigrated = false;
-job->postcopyEnabled = false;
 job->dumpCompleted = false;
 VIR_FREE(job->error);
 VIR_FREE(job->current);
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 8d608da121..91385da2a9 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -176,7 +176,6 @@ struct _qemuDomainJobObj {
 bool spiceMigration;/* we asked for spice migration and we
  * should wait for it to finish */
 bool spiceMigrated; /* spice migration completed */
-bool postcopyEnabled;   /* post-copy migration was enabled */
 char *error;/* job event completion error */
 bool dumpCompleted; /* dump completed */
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3fac038583..1b37c0b45a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13840,7 +13840,7 @@ qemuDomainMigrateStartPostCopy(virDomainPtr dom,
 goto endjob;
 }
 
-if (!priv->job.postcopyEnabled) {
+if (!(priv->job.apiFlags & VIR_MIGRATE_POSTCOPY)) {
 virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("switching to post-copy requires migration to be "
  "started with VIR_MIGRATE_POSTCOPY flag"));
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 431875c762..ad87aebd3b 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2406,8 +2406,6 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
  migParams) < 0)
 goto stopjob;
 
-priv->job.postcopyEnabled = flags & VIR_MIGRATE_POSTCOPY;
-
 if (mig->nbd &&
 flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC) &&
 virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NBD_SERVER)) {
@@ -3346,8 +3344,6 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
  migParams) < 0)
 goto error;
 
-priv->job.postcopyEnabled = flags & VIR_MIGRATE_POSTCOPY;
-
 if (migrate_flags & (QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
  QEMU_MONITOR_MIGRATE_NON_SHARED_INC)) {
 if (mig->nbd) {
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 69/73] qemu: Drop priv->job.dump_memory_only bool

2018-04-11 Thread Jiri Denemark
We store the flags passed to the API which started QEMU_ASYNC_JOB_DUMP
and we can use them to check whether a memory-only dump is running.
There's no need for a specific bool flag.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c | 1 -
 src/qemu/qemu_domain.h | 1 -
 src/qemu/qemu_driver.c | 4 +---
 3 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index bf04053607..9343f41f57 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -329,7 +329,6 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
 job->asyncStarted = 0;
 job->phase = 0;
 job->mask = QEMU_JOB_DEFAULT_MASK;
-job->dump_memory_only = false;
 job->abortJob = false;
 job->spiceMigration = false;
 job->spiceMigrated = false;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 2146ff00a9..8d608da121 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -170,7 +170,6 @@ struct _qemuDomainJobObj {
 unsigned long long asyncStarted;/* When the current async job started 
*/
 int phase;  /* Job phase (mainly for migrations) */
 unsigned long long mask;/* Jobs allowed during async job */
-bool dump_memory_only;  /* use dump-guest-memory to do dump */
 qemuDomainJobInfoPtr current;   /* async job progress data */
 qemuDomainJobInfoPtr completed; /* statistics data of a recently 
completed job */
 bool abortJob;  /* abort of the job requested */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4af6d58fb1..3fac038583 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3794,8 +3794,6 @@ qemuDumpToFd(virQEMUDriverPtr driver,
 if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) < 0)
 return -1;
 
-priv->job.dump_memory_only = true;
-
 if (detach)
 priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP;
 else
@@ -13486,7 +13484,7 @@ static int qemuDomainAbortJob(virDomainPtr dom)
 }
 
 if (priv->job.asyncJob == QEMU_ASYNC_JOB_DUMP &&
-priv->job.dump_memory_only) {
+priv->job.apiFlags & VIR_DUMP_MEMORY_ONLY) {
 virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("cannot abort memory-only dump"));
 goto endjob;
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 59/73] qemu: Add support for sending capabilities in migration cookie

2018-04-11 Thread Jiri Denemark
Some migration capabilities may be enabled automatically, but only if
both sides of migration support them. Thus we need to be able transfer
the list of supported migration capabilities in migration cookie.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c|  15 ++--
 src/qemu/qemu_migration_cookie.c | 136 ++-
 src/qemu/qemu_migration_cookie.h |  15 
 src/qemu/qemu_migration_params.c |  20 +
 src/qemu/qemu_migration_params.h |   3 +
 5 files changed, 183 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 319b4d000a..f573bd3eba 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1917,6 +1917,7 @@ qemuMigrationSrcBeginPhase(virQEMUDriverPtr driver,
 goto cleanup;
 
 if (qemuMigrationBakeCookie(mig, driver, vm,
+QEMU_MIGRATION_SOURCE,
 cookieout, cookieoutlen,
 cookieFlags) < 0)
 goto cleanup;
@@ -2429,8 +2430,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 goto stopjob;
 
  done:
-if (qemuMigrationBakeCookie(mig, driver, vm, cookieout,
-cookieoutlen, cookieFlags) < 0) {
+if (qemuMigrationBakeCookie(mig, driver, vm,
+QEMU_MIGRATION_DESTINATION,
+cookieout, cookieoutlen, cookieFlags) < 0) {
 /* We could tear down the whole guest here, but
  * cookie data is (so far) non-critical, so that
  * seems a little harsh. We'll just warn for now.
@@ -3523,8 +3525,9 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
QEMU_MIGRATION_COOKIE_STATS;
 
 if (qemuMigrationCookieAddPersistent(mig, ) < 0 ||
-qemuMigrationBakeCookie(mig, driver, vm, cookieout,
-cookieoutlen, cookieFlags) < 0) {
+qemuMigrationBakeCookie(mig, driver, vm,
+QEMU_MIGRATION_SOURCE,
+cookieout, cookieoutlen, cookieFlags) < 0) {
 VIR_WARN("Unable to encode migration cookie");
 }
 
@@ -5019,7 +5022,9 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
 priv->job.completed->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
 }
 
-if (qemuMigrationBakeCookie(mig, driver, vm, cookieout, cookieoutlen,
+if (qemuMigrationBakeCookie(mig, driver, vm,
+QEMU_MIGRATION_DESTINATION,
+cookieout, cookieoutlen,
 QEMU_MIGRATION_COOKIE_STATS) < 0)
 VIR_WARN("Unable to encode migration cookie");
 
diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
index 5a1e299ca2..eca1b74d63 100644
--- a/src/qemu/qemu_migration_cookie.c
+++ b/src/qemu/qemu_migration_cookie.c
@@ -33,6 +33,7 @@
 
 #include "qemu_domain.h"
 #include "qemu_migration_cookie.h"
+#include "qemu_migration_params.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
@@ -50,7 +51,8 @@ VIR_ENUM_IMPL(qemuMigrationCookieFlag,
   "memory-hotplug",
   "cpu-hotplug",
   "cpu",
-  "allowReboot");
+  "allowReboot",
+  "capabilities");
 
 
 static void
@@ -94,6 +96,18 @@ qemuMigrationCookieNBDFree(qemuMigrationCookieNBDPtr nbd)
 }
 
 
+static void
+qemuMigrationCookieCapsFree(qemuMigrationCookieCapsPtr caps)
+{
+if (!caps)
+return;
+
+virBitmapFree(caps->supported);
+virBitmapFree(caps->automatic);
+VIR_FREE(caps);
+}
+
+
 void
 qemuMigrationCookieFree(qemuMigrationCookiePtr mig)
 {
@@ -112,6 +126,7 @@ qemuMigrationCookieFree(qemuMigrationCookiePtr mig)
 VIR_FREE(mig->lockDriver);
 VIR_FREE(mig->jobInfo);
 virCPUDefFree(mig->cpu);
+qemuMigrationCookieCapsFree(mig->caps);
 VIR_FREE(mig);
 }
 
@@ -550,6 +565,33 @@ qemuMigrationCookieAddAllowReboot(qemuMigrationCookiePtr 
mig,
 }
 
 
+static int
+qemuMigrationCookieAddCaps(qemuMigrationCookiePtr mig,
+   virDomainObjPtr vm,
+   qemuMigrationParty party)
+{
+qemuDomainObjPrivatePtr priv = vm->privateData;
+
+qemuMigrationCookieCapsFree(mig->caps);
+if (VIR_ALLOC(mig->caps) < 0)
+return -1;
+
+if (priv->migrationCaps)
+mig->caps->supported = virBitmapNewCopy(priv->migrationCaps);
+else
+mig->caps->supported = virBitmapNew(0);
+
+mig->caps->automatic = qemuMigrationParamsGetAlwaysOnCaps(party);
+
+if (!mig->caps->supported || !mig->caps->automatic)
+return -1;
+
+mig->flags |= QEMU_MIGRATION_COOKIE_CAPS;
+
+return 0;
+}
+
+
 static void
 qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf,
  qemuMigrationCookieGraphicsPtr grap)
@@ -710,6 +752,33 @@ qemuMigrationCookieStatisticsXMLFormat(virBufferPtr 

[libvirt] [PATCH v2 66/73] qemumigparamstest: Add test data for TLS parameters

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 tests/qemumigparamsdata/tls-enabled.json   | 11 +++
 tests/qemumigparamsdata/tls-enabled.reply  | 14 ++
 tests/qemumigparamsdata/tls-enabled.xml| 13 +
 tests/qemumigparamsdata/tls-hostname.json  | 11 +++
 tests/qemumigparamsdata/tls-hostname.reply | 14 ++
 tests/qemumigparamsdata/tls-hostname.xml   | 13 +
 tests/qemumigparamsdata/tls.json   | 11 +++
 tests/qemumigparamsdata/tls.reply  | 14 ++
 tests/qemumigparamsdata/tls.xml| 13 +
 tests/qemumigparamstest.c  |  3 +++
 10 files changed, 117 insertions(+)
 create mode 100644 tests/qemumigparamsdata/tls-enabled.json
 create mode 100644 tests/qemumigparamsdata/tls-enabled.reply
 create mode 100644 tests/qemumigparamsdata/tls-enabled.xml
 create mode 100644 tests/qemumigparamsdata/tls-hostname.json
 create mode 100644 tests/qemumigparamsdata/tls-hostname.reply
 create mode 100644 tests/qemumigparamsdata/tls-hostname.xml
 create mode 100644 tests/qemumigparamsdata/tls.json
 create mode 100644 tests/qemumigparamsdata/tls.reply
 create mode 100644 tests/qemumigparamsdata/tls.xml

diff --git a/tests/qemumigparamsdata/tls-enabled.json 
b/tests/qemumigparamsdata/tls-enabled.json
new file mode 100644
index 00..d42684a9de
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-enabled.json
@@ -0,0 +1,11 @@
+{
+  "compress-level": 1,
+  "compress-threads": 8,
+  "decompress-threads": 2,
+  "cpu-throttle-initial": 20,
+  "cpu-throttle-increment": 10,
+  "tls-creds": "objlibvirt_migrate_tls0",
+  "tls-hostname": "",
+  "max-bandwidth": 33554432,
+  "downtime-limit": 300
+}
diff --git a/tests/qemumigparamsdata/tls-enabled.reply 
b/tests/qemumigparamsdata/tls-enabled.reply
new file mode 100644
index 00..001241b075
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-enabled.reply
@@ -0,0 +1,14 @@
+{
+  "id": "libvirt-1",
+  "return": {
+"decompress-threads": 2,
+"cpu-throttle-increment": 10,
+"compress-threads": 8,
+"tls-hostname": "",
+"compress-level": 1,
+"cpu-throttle-initial": 20,
+"tls-creds": "objlibvirt_migrate_tls0",
+"max-bandwidth": 33554432,
+"downtime-limit": 300
+  }
+}
diff --git a/tests/qemumigparamsdata/tls-enabled.xml 
b/tests/qemumigparamsdata/tls-enabled.xml
new file mode 100644
index 00..3e60c4dec3
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-enabled.xml
@@ -0,0 +1,13 @@
+
+  
+
+
+
+
+
+
+
+
+
+  
+
diff --git a/tests/qemumigparamsdata/tls-hostname.json 
b/tests/qemumigparamsdata/tls-hostname.json
new file mode 100644
index 00..abbd9f124b
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-hostname.json
@@ -0,0 +1,11 @@
+{
+  "compress-level": 1,
+  "compress-threads": 8,
+  "decompress-threads": 2,
+  "cpu-throttle-initial": 20,
+  "cpu-throttle-increment": 10,
+  "tls-creds": "objlibvirt_migrate_tls0",
+  "tls-hostname": "f27-1.virt",
+  "max-bandwidth": 33554432,
+  "downtime-limit": 300
+}
diff --git a/tests/qemumigparamsdata/tls-hostname.reply 
b/tests/qemumigparamsdata/tls-hostname.reply
new file mode 100644
index 00..74f069f780
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-hostname.reply
@@ -0,0 +1,14 @@
+{
+  "id": "libvirt-1",
+  "return": {
+"decompress-threads": 2,
+"cpu-throttle-increment": 10,
+"compress-threads": 8,
+"tls-hostname": "f27-1.virt",
+"compress-level": 1,
+"cpu-throttle-initial": 20,
+"tls-creds": "objlibvirt_migrate_tls0",
+"max-bandwidth": 33554432,
+"downtime-limit": 300
+  }
+}
diff --git a/tests/qemumigparamsdata/tls-hostname.xml 
b/tests/qemumigparamsdata/tls-hostname.xml
new file mode 100644
index 00..4310e789a0
--- /dev/null
+++ b/tests/qemumigparamsdata/tls-hostname.xml
@@ -0,0 +1,13 @@
+
+  
+
+
+
+
+
+
+
+
+
+  
+
diff --git a/tests/qemumigparamsdata/tls.json b/tests/qemumigparamsdata/tls.json
new file mode 100644
index 00..02e90c60ea
--- /dev/null
+++ b/tests/qemumigparamsdata/tls.json
@@ -0,0 +1,11 @@
+{
+  "compress-level": 1,
+  "compress-threads": 8,
+  "decompress-threads": 2,
+  "cpu-throttle-initial": 20,
+  "cpu-throttle-increment": 10,
+  "tls-creds": "",
+  "tls-hostname": "",
+  "max-bandwidth": 33554432,
+  "downtime-limit": 300
+}
diff --git a/tests/qemumigparamsdata/tls.reply 
b/tests/qemumigparamsdata/tls.reply
new file mode 100644
index 00..591eca6926
--- /dev/null
+++ b/tests/qemumigparamsdata/tls.reply
@@ -0,0 +1,14 @@
+{
+  "id": "libvirt-1",
+  "return": {
+"decompress-threads": 2,
+"cpu-throttle-increment": 10,
+"compress-threads": 8,
+"tls-hostname": "",
+"compress-level": 1,
+"cpu-throttle-initial": 20,
+"tls-creds": "",
+"max-bandwidth": 33554432,
+"downtime-limit": 300
+  }
+}
diff --git a/tests/qemumigparamsdata/tls.xml b/tests/qemumigparamsdata/tls.xml
new file 

[libvirt] [PATCH v2 71/73] qemu: Store API flags for async jobs in status XML

2018-04-11 Thread Jiri Denemark
This will help us decide what to do when libvirtd is restarted while an
async job is running.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c|   8 +
 .../migration-out-nbd-out.xml | 450 +-
 2 files changed, 457 insertions(+), 1 deletion(-)
 mode change 12 => 100644 
tests/qemustatusxml2xmldata/migration-out-nbd-out.xml

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 71c3a917c1..8cd00576c8 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2087,6 +2087,9 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
   priv->job.phase));
 }
 
+if (priv->job.asyncJob != QEMU_ASYNC_JOB_NONE)
+virBufferAsprintf(, " flags='0x%lx'", priv->job.apiFlags);
+
 if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
 size_t i;
 virDomainDiskDefPtr disk;
@@ -2382,6 +2385,11 @@ qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm,
 }
 }
 
+if (virXPathULongHex("string(@flags)", ctxt, >job.apiFlags) == -2) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid job flags"));
+goto cleanup;
+}
+
 if ((n = virXPathNodeSet("./disk[@migrating='yes']", ctxt, )) < 0)
 goto cleanup;
 
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml 
b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
deleted file mode 12
index a4830f04a8..00
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
+++ /dev/null
@@ -1 +0,0 @@
-migration-out-nbd-in.xml
\ No newline at end of file
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml 
b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
new file mode 100644
index 00..05da1f81c6
--- /dev/null
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
@@ -0,0 +1,449 @@
+
+  
+  
+  
+
+
+  
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+
+
+  
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+  
+upstream
+dcf47dbd-46d1-4d5b-b442-262a806a333a
+1024000
+1024000
+
+  
+
+8
+
+  
+
+
+  /machine
+
+
+  hvm
+  
+
+
+  
+  
+  
+
+
+  
+
+
+  
+
+
+  
+  
+  
+
+destroy
+restart
+restart
+
+  
+  
+
+
+  /usr/bin/qemu-system-x86_64
+  
+
+
+
+  
+  
+
+  base.qcow2
+
+  
+  
+
+
+
+
+  
+  
+
+
+
+
+
+
+
+
+  
+  
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+  
+  
+
+  
+  
+
+
+  
+  
+
+
+  
+  
+
+
+  
+  
+
+  
+  
+
+
+
+  
+
+
+
+
+
+  
+  
+
+
+  
+
+
+  
+  
+
+
+
+  
+  
+
+
+
+
+  
+  
+
+
+
+  
+  
+
+
+  
+  
+
+  
+  
+
+  
+  
+
+
+  
+  
+
+
+  
+  
+   

[libvirt] [PATCH v2 64/73] tests: Add tests for QEMU migration parameters

2018-04-11 Thread Jiri Denemark
This is an enhanced replacement for the original test from
qemumonitorjsontest which was dropped earlier in this series. More data
files with some real data will be added in the following patches.

Signed-off-by: Jiri Denemark 
---
 tests/Makefile.am |  12 ++
 tests/qemumigparamsdata/unsupported.json  |   3 +
 tests/qemumigparamsdata/unsupported.reply |   7 +
 tests/qemumigparamsdata/unsupported.xml   |   4 +
 tests/qemumigparamstest.c | 237 ++
 5 files changed, 263 insertions(+)
 create mode 100644 tests/qemumigparamsdata/unsupported.json
 create mode 100644 tests/qemumigparamsdata/unsupported.reply
 create mode 100644 tests/qemumigparamsdata/unsupported.xml
 create mode 100644 tests/qemumigparamstest.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index a4f231d2a7..2c0d1311c2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -124,6 +124,7 @@ EXTRA_DIST = \
qemuhotplugtestcpus \
qemuhotplugtestdevices \
qemuhotplugtestdomains \
+   qemumigparamsdata \
qemumonitorjsondata \
qemuxml2argvdata \
qemuxml2startupxmloutdata \
@@ -284,6 +285,7 @@ test_programs += qemuxml2argvtest qemuxml2xmltest \
qemumemlocktest \
qemucommandutiltest \
qemublocktest \
+   qemumigparamstest \
$(NULL)
 test_helpers += qemucapsprobe
 test_libraries += libqemumonitortestutils.la \
@@ -670,6 +672,15 @@ qemumemlocktest_SOURCES = \
testutilsqemu.c testutilsqemu.h \
testutils.c testutils.h
 qemumemlocktest_LDADD = $(qemu_LDADDS) $(LDADDS)
+
+qemumigparamstest_SOURCES = \
+   qemumigparamstest.c \
+   testutils.c testutils.h \
+   testutilsqemu.c testutilsqemu.h \
+   $(NULL)
+qemumigparamstest_LDADD = libqemumonitortestutils.la \
+   $(qemu_LDADDS) $(LDADDS)
+
 else ! WITH_QEMU
 EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \
domainsnapshotxml2xmltest.c \
@@ -680,6 +691,7 @@ EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c 
qemuargv2xmltest.c \
qemucaps2xmltest.c qemucommandutiltest.c \
qemumemlocktest.c qemucpumock.c testutilshostcpus.h \
qemublocktest.c \
+   qemumigparamstest.c \
$(QEMUMONITORTESTUTILS_SOURCES)
 endif ! WITH_QEMU
 
diff --git a/tests/qemumigparamsdata/unsupported.json 
b/tests/qemumigparamsdata/unsupported.json
new file mode 100644
index 00..0db3279e44
--- /dev/null
+++ b/tests/qemumigparamsdata/unsupported.json
@@ -0,0 +1,3 @@
+{
+
+}
diff --git a/tests/qemumigparamsdata/unsupported.reply 
b/tests/qemumigparamsdata/unsupported.reply
new file mode 100644
index 00..2b88ba10c3
--- /dev/null
+++ b/tests/qemumigparamsdata/unsupported.reply
@@ -0,0 +1,7 @@
+{
+  "id": "libvirt-1",
+  "error": {
+"class": "CommandNotFound",
+"desc": "The command query-migrate-parameters has not been found"
+  }
+}
diff --git a/tests/qemumigparamsdata/unsupported.xml 
b/tests/qemumigparamsdata/unsupported.xml
new file mode 100644
index 00..8aa3abefc0
--- /dev/null
+++ b/tests/qemumigparamsdata/unsupported.xml
@@ -0,0 +1,4 @@
+
+  
+  
+
diff --git a/tests/qemumigparamstest.c b/tests/qemumigparamstest.c
new file mode 100644
index 00..4cc27bcf52
--- /dev/null
+++ b/tests/qemumigparamstest.c
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2011-2013 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * .
+ *
+ */
+
+#include 
+
+#include "virjson.h"
+#include "virbuffer.h"
+#include "virxml.h"
+#include "testutils.h"
+#include "testutilsqemu.h"
+#include "qemumonitortestutils.h"
+#include "qemu/qemu_migration_params.h"
+#include "qemu/qemu_migration_paramspriv.h"
+#include "qemu/qemu_monitor.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+typedef struct _qemuMigParamsData qemuMigParamsData;
+struct _qemuMigParamsData {
+virDomainXMLOptionPtr xmlopt;
+const char *name;
+};
+
+
+static void
+qemuMigParamsTestFormatXML(virBufferPtr buf,
+   qemuMigrationParamsPtr migParams)
+{
+virBufferAddLit(buf, "\n");
+virBufferAdjustIndent(buf, 2);
+
+if (migParams)
+qemuMigrationParamsFormat(buf, migParams);
+
+virBufferAdjustIndent(buf, -2);
+virBufferAddLit(buf, "\n");
+}
+
+
+static int
+qemuMigParamsTestXML2XML(const void *opaque)
+{
+const 

[libvirt] [PATCH v2 30/73] qemu: Set XBZRLE cache size via migration parameters

2018-04-11 Thread Jiri Denemark
Prefer xbzrle-cache-size migration parameter over the special
migrate-set-cache-size QMP command.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c|  6 ++---
 src/qemu/qemu_migration_params.c | 42 +---
 src/qemu/qemu_migration_params.h |  4 +--
 3 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index e01c2a209d..476417c15d 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2383,8 +2383,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
 goto stopjob;
 
-if (qemuMigrationParamsSetCompression(driver, vm, 
QEMU_ASYNC_JOB_MIGRATION_IN,
-  compression, migParams) < 0)
+if (qemuMigrationParamsSetCompression(vm, compression, migParams) < 0)
 goto stopjob;
 
 /* Migrations using TLS need to add the "tls-creds-x509" object and
@@ -3383,8 +3382,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 goto error;
 }
 
-if (qemuMigrationParamsSetCompression(driver, vm, 
QEMU_ASYNC_JOB_MIGRATION_OUT,
-  compression, migParams) < 0)
+if (qemuMigrationParamsSetCompression(vm, compression, migParams) < 0)
 goto error;
 
 if (qemuMigrationParamsSetCapability(vm,
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 53e105bec8..f29cc9 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -141,6 +141,7 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
  qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
+bool xbzrleCacheSize_old = false;
 int ret = -1;
 
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
@@ -150,6 +151,20 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 migParams->caps) < 0)
 goto cleanup;
 
+/* If QEMU is too old to support xbzrle-cache-size migration parameter,
+ * we need to set it via migrate-set-cache-size and tell
+ * qemuMonitorSetMigrationParams to ignore this parameter.
+ */
+if (migParams->params.xbzrleCacheSize_set &&
+(!priv->job.migParams ||
+ !priv->job.migParams->params.xbzrleCacheSize_set)) {
+if (qemuMonitorSetMigrationCacheSize(priv->mon,
+ 
migParams->params.xbzrleCacheSize) < 0)
+goto cleanup;
+xbzrleCacheSize_old = true;
+migParams->params.xbzrleCacheSize_set = false;
+}
+
 if (qemuMonitorSetMigrationParams(priv->mon, >params) < 0)
 goto cleanup;
 
@@ -159,6 +174,9 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 if (qemuDomainObjExitMonitor(driver, vm) < 0)
 ret = -1;
 
+if (xbzrleCacheSize_old)
+migParams->params.xbzrleCacheSize_set = true;
+
 return ret;
 }
 
@@ -321,15 +339,10 @@ qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
 
 
 int
-qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
-  virDomainObjPtr vm,
-  int asyncJob,
+qemuMigrationParamsSetCompression(virDomainObjPtr vm,
   qemuMigrationCompressionPtr compression,
   qemuMigrationParamsPtr migParams)
 {
-int ret = -1;
-qemuDomainObjPrivatePtr priv = vm->privateData;
-
 if (qemuMigrationParamsSetCapability(vm,
  QEMU_MONITOR_MIGRATION_CAPS_XBZRLE,
  compression->methods &
@@ -344,9 +357,6 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
  migParams) < 0)
 return -1;
 
-if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
-return -1;
-
 migParams->params.compressLevel_set = compression->level_set;
 migParams->params.compressLevel = compression->level;
 
@@ -356,18 +366,10 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
 migParams->params.decompressThreads_set = compression->dthreads_set;
 migParams->params.decompressThreads = compression->dthreads;
 
-if (compression->xbzrle_cache_set &&
-qemuMonitorSetMigrationCacheSize(priv->mon,
- compression->xbzrle_cache) < 0)
-goto cleanup;
+migParams->params.xbzrleCacheSize_set = compression->xbzrle_cache_set;
+migParams->params.xbzrleCacheSize = compression->xbzrle_cache;
 
-ret = 0;
-
- cleanup:
-if (qemuDomainObjExitMonitor(driver, vm) < 0)
-ret = -1;
-
-return ret;
+return 0;
 }
 
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index e341f73900..4cb70f62a4 100644
--- 

[libvirt] [PATCH v2 40/73] qemu: Call qemuMigrationAnyCompressionParse only from driver

2018-04-11 Thread Jiri Denemark
Propagate the calls up the stack to the point where
qemuMigrationParamsFromFlags is called. The end goal achieved in the
following few patches is to merge compression parameters into the
general migration parameters code.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c| 21 ++---
 src/qemu/qemu_migration.c | 25 +++--
 src/qemu/qemu_migration.h |  1 +
 3 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5271e01d92..85755257aa 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12126,6 +12126,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
+qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12137,6 +12138,9 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 goto cleanup;
 }
 
+if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
+goto cleanup;
+
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,

QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
@@ -12156,9 +12160,10 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 
 ret = qemuMigrationDstPrepareTunnel(driver, dconn,
 NULL, 0, NULL, NULL, /* No cookies in 
v2 */
-st, , origname, migParams, flags);
+st, , origname, compression, 
migParams, flags);
 
  cleanup:
+VIR_FREE(compression);
 qemuMigrationParamsFree(migParams);
 VIR_FREE(origname);
 virDomainDefFree(def);
@@ -12597,6 +12602,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
+qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12608,6 +12614,9 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
 goto cleanup;
 }
 
+if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
+goto cleanup;
+
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,

QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
@@ -12621,9 +12630,10 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
 ret = qemuMigrationDstPrepareTunnel(driver, dconn,
 cookiein, cookieinlen,
 cookieout, cookieoutlen,
-st, , origname, migParams, flags);
+st, , origname, compression, 
migParams, flags);
 
  cleanup:
+VIR_FREE(compression);
 qemuMigrationParamsFree(migParams);
 VIR_FREE(origname);
 virDomainDefFree(def);
@@ -12646,6 +12656,7 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr 
dconn,
 const char *dom_xml = NULL;
 const char *dname = NULL;
 char *origname = NULL;
+qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12667,6 +12678,9 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr 
dconn,
 goto cleanup;
 }
 
+if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
+goto cleanup;
+
 if (!(migParams = qemuMigrationParamsFromFlags(params, nparams, flags,

QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
@@ -12680,9 +12694,10 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr 
dconn,
 ret = qemuMigrationDstPrepareTunnel(driver, dconn,
 cookiein, cookieinlen,
 cookieout, cookieoutlen,
-st, , origname, migParams, flags);
+st, , origname, compression, 
migParams, flags);
 
  cleanup:
+VIR_FREE(compression);
 qemuMigrationParamsFree(migParams);
 VIR_FREE(origname);
 virDomainDefFree(def);
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index e1a29d9569..d4c5994f25 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2531,12 +2531,10 @@ qemuMigrationDstPrepareTunnel(virQEMUDriverPtr driver,
   virStreamPtr st,
   virDomainDefPtr *def,
   const char *origname,
+  qemuMigrationCompressionPtr compression,
   qemuMigrationParamsPtr migParams,
   unsigned long flags)
 {
-qemuMigrationCompressionPtr 

[libvirt] [PATCH v2 38/73] qemu: Set always-on migration caps in ParamsCheck

2018-04-11 Thread Jiri Denemark
Some migration capabilities are always enabled if QEMU supports them. We
can just drop the explicit code for them and let
qemuMigrationParamsCheck automatically set such capabilities.

QEMU_MONITOR_MIGRATION_CAPS_EVENTS would normally be one of the always
on features, but it is the only feature we want to enable even for other
jobs which internally use migration (such as save and snapshot). Hence
this capability is set very early after libvirtd connects to QEMU
monitor.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c|  6 --
 src/qemu/qemu_migration_params.c | 31 +++
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 400eb0710c..0446003f47 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3359,12 +3359,6 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
  migParams) < 0)
 goto error;
 
-if (qemuMigrationCapsGet(vm, 
QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER) &&
-qemuMigrationParamsSetCapability(vm,
- 
QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
- true, migParams) < 0)
-goto error;
-
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
  migParams) < 0)
 goto error;
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index bf95fb4f59..03056eed09 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -43,6 +43,19 @@ struct _qemuMigrationParams {
 qemuMonitorMigrationParams params;
 };
 
+typedef struct _qemuMigrationParamsAlwaysOnItem 
qemuMigrationParamsAlwaysOnItem;
+struct _qemuMigrationParamsAlwaysOnItem {
+qemuMonitorMigrationCaps cap;
+int party; /* bit-wise OR of qemuMigrationParty */
+};
+
+/* Migration capabilities which should always be enabled as long as they
+ * are supported by QEMU. */
+static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = {
+{QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
+ QEMU_MIGRATION_SOURCE},
+};
+
 
 static qemuMigrationParamsPtr
 qemuMigrationParamsNew(void)
@@ -399,8 +412,15 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
 qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuMigrationParamsPtr origParams = NULL;
 qemuMonitorMigrationCaps cap;
+qemuMigrationParty party;
+size_t i;
 int ret = -1;
 
+if (asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT)
+party = QEMU_MIGRATION_SOURCE;
+else
+party = QEMU_MIGRATION_DESTINATION;
+
 for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
 bool state = false;
 
@@ -414,6 +434,17 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
 }
 }
 
+for (i = 0; i < ARRAY_CARDINALITY(qemuMigrationParamsAlwaysOn); i++) {
+cap = qemuMigrationParamsAlwaysOn[i].cap;
+
+if (qemuMigrationParamsAlwaysOn[i].party & party &&
+qemuMigrationCapsGet(vm, cap)) {
+VIR_DEBUG("Enabling migration capability '%s'",
+  qemuMonitorMigrationCapsTypeToString(cap));
+ignore_value(virBitmapSetBit(migParams->caps, cap));
+}
+}
+
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
 return -1;
 
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 61/73] qemu: Generalize qemuMigrationParamsGetDowntimeLimit

2018-04-11 Thread Jiri Denemark
The API is renamed as qemuMigrationParamsGetULL and it can be used with
any migration parameter stored as unsigned long long.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   |  9 -
 src/qemu/qemu_migration_params.c | 15 ++-
 src/qemu/qemu_migration_params.h |  5 +++--
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0cf08759c6..8917beae35 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13557,6 +13557,7 @@ qemuDomainMigrateGetMaxDowntime(virDomainPtr dom,
 virDomainObjPtr vm;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
+int rc;
 
 virCheckFlags(0, -1);
 
@@ -13579,7 +13580,13 @@ qemuDomainMigrateGetMaxDowntime(virDomainPtr dom,
  ) < 0)
 goto endjob;
 
-if (qemuMigrationParamsGetDowntimeLimit(migParams, downtime) == 1) {
+if ((rc = qemuMigrationParamsGetULL(migParams,
+QEMU_MIGRATION_PARAM_DOWNTIME_LIMIT,
+downtime)) < 0) {
+goto endjob;
+}
+
+if (rc == 1) {
 virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("Querying migration downtime is not supported by "
  "QEMU binary"));
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 979610c3a8..3e131207a8 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -950,17 +950,22 @@ qemuMigrationParamsSetString(qemuMigrationParamsPtr 
migParams,
 
 
 /**
- * Returns  0 on success,
+ * Returns -1 on error,
+ *  0 on success,
  *  1 if the parameter is not supported by QEMU.
  */
 int
-qemuMigrationParamsGetDowntimeLimit(qemuMigrationParamsPtr migParams,
-unsigned long long *value)
+qemuMigrationParamsGetULL(qemuMigrationParamsPtr migParams,
+  qemuMigrationParam param,
+  unsigned long long *value)
 {
-if (!migParams->params[QEMU_MIGRATION_PARAM_DOWNTIME_LIMIT].set)
+if (qemuMigrationParamsCheckType(param, QEMU_MIGRATION_PARAM_TYPE_ULL) < 0)
+return -1;
+
+if (!migParams->params[param].set)
 return 1;
 
-*value = migParams->params[QEMU_MIGRATION_PARAM_DOWNTIME_LIMIT].value.ull;
+*value = migParams->params[param].value.ull;
 return 0;
 }
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index eb4016806d..6950eca8ef 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -116,8 +116,9 @@ qemuMigrationParamsSetString(qemuMigrationParamsPtr 
migParams,
  const char *value);
 
 int
-qemuMigrationParamsGetDowntimeLimit(qemuMigrationParamsPtr migParams,
-unsigned long long *value);
+qemuMigrationParamsGetULL(qemuMigrationParamsPtr migParams,
+  qemuMigrationParam param,
+  unsigned long long *value);
 
 int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 19/73] qemu: Rename qemuMigrationParamsSetEmptyTLS

2018-04-11 Thread Jiri Denemark
The new name is qemuMigrationParamsDisableTLS.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 4 ++--
 src/qemu/qemu_migration_params.c | 6 +++---
 src/qemu/qemu_migration_params.h | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index e6239576ef..efc5734b1a 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2462,7 +2462,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 goto stopjob;
 
 } else {
-if (qemuMigrationParamsSetEmptyTLS(vm, migParams) < 0)
+if (qemuMigrationParamsDisableTLS(vm, migParams) < 0)
 goto stopjob;
 }
 
@@ -3424,7 +3424,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 goto error;
 }
 } else {
-if (qemuMigrationParamsSetEmptyTLS(vm, migParams) < 0)
+if (qemuMigrationParamsDisableTLS(vm, migParams) < 0)
 goto error;
 }
 
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 451d799efb..1f3549a7b4 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -210,7 +210,7 @@ qemuMigrationParamsAddTLSObjects(virQEMUDriverPtr driver,
 }
 
 
-/* qemuMigrationParamsSetEmptyTLS
+/* qemuMigrationParamsDisableTLS
  * @vm: domain object
  * @migParams: Pointer to a migration parameters block
  *
@@ -221,8 +221,8 @@ qemuMigrationParamsAddTLSObjects(virQEMUDriverPtr driver,
  * Returns 0 on success, -1 on failure
  */
 int
-qemuMigrationParamsSetEmptyTLS(virDomainObjPtr vm,
-   qemuMigrationParamsPtr migParams)
+qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
+  qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index c6cc2aaff6..4eefe409df 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -82,8 +82,8 @@ qemuMigrationParamsAddTLSObjects(virQEMUDriverPtr driver,
  qemuMigrationParamsPtr migParams);
 
 int
-qemuMigrationParamsSetEmptyTLS(virDomainObjPtr vm,
-   qemuMigrationParamsPtr migParams);
+qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
+  qemuMigrationParamsPtr migParams);
 
 int
 qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 48/73] qemu: Introduce qemuMigrationParamsFetch

2018-04-11 Thread Jiri Denemark
Let's separate the code which queries QEMU for migration parameters from
qemuMigrationParamsCheck into a dedicated function.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 56 +++-
 src/qemu/qemu_migration_params.h |  6 
 2 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 388a1f5804..94de0458f5 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -520,6 +520,39 @@ qemuMigrationParamsResetTLS(virQEMUDriverPtr driver,
 }
 
 
+int
+qemuMigrationParamsFetch(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob,
+ qemuMigrationParamsPtr *migParams)
+{
+qemuDomainObjPrivatePtr priv = vm->privateData;
+qemuMigrationParamsPtr params = NULL;
+int ret = -1;
+int rc;
+
+*migParams = NULL;
+
+if (!(params = qemuMigrationParamsNew()))
+return -1;
+
+if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+goto cleanup;
+
+rc = qemuMonitorGetMigrationParams(priv->mon, >params);
+
+if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
+goto cleanup;
+
+VIR_STEAL_PTR(*migParams, params);
+ret = 0;
+
+ cleanup:
+qemuMigrationParamsFree(params);
+return ret;
+}
+
+
 /**
  * qemuMigrationParamsCheck:
  *
@@ -535,11 +568,9 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
-qemuMigrationParamsPtr origParams = NULL;
 qemuMonitorMigrationCaps cap;
 qemuMigrationParty party;
 size_t i;
-int ret = -1;
 
 if (asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT)
 party = QEMU_MIGRATION_SOURCE;
@@ -570,31 +601,12 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
 }
 }
 
-if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
-return -1;
-
-if (!(origParams = qemuMigrationParamsNew()))
-goto cleanup;
-
 /*
  * We want to disable all migration capabilities after migration, no need
  * to ask QEMU for their current settings.
  */
 
-if (qemuMonitorGetMigrationParams(priv->mon, >params) < 0)
-goto cleanup;
-
-ret = 0;
-
- cleanup:
-if (qemuDomainObjExitMonitor(driver, vm) < 0)
-ret = -1;
-
-if (ret == 0)
-VIR_STEAL_PTR(priv->job.migParams, origParams);
-qemuMigrationParamsFree(origParams);
-
-return ret;
+return qemuMigrationParamsFetch(driver, vm, asyncJob, 
>job.migParams);
 }
 
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 3d1ada1a61..0a30dcd623 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -73,6 +73,12 @@ int
 qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
   qemuMigrationParamsPtr migParams);
 
+int
+qemuMigrationParamsFetch(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob,
+ qemuMigrationParamsPtr *migParams);
+
 int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 28/73] qemu: Drop unused qemuMonitorSetMigrationCapability

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_monitor.c  | 14 --
 src/qemu/qemu_monitor.h  |  3 --
 src/qemu/qemu_monitor_json.c | 53 
 src/qemu/qemu_monitor_json.h |  3 --
 4 files changed, 73 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 7ea72af788..09f21ba77d 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3977,20 +3977,6 @@ qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon,
 }
 
 
-int
-qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
-  qemuMonitorMigrationCaps capability,
-  bool state)
-{
-VIR_DEBUG("capability=%s, state=%d",
-  qemuMonitorMigrationCapsTypeToString(capability), state);
-
-QEMU_CHECK_MONITOR_JSON(mon);
-
-return qemuMonitorJSONSetMigrationCapability(mon, capability, state);
-}
-
-
 int
 qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon,
 virBitmapPtr caps,
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 870aae5cbd..c95b3a2ef4 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -760,9 +760,6 @@ VIR_ENUM_DECL(qemuMonitorMigrationCaps);
 
 int qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon,
 char ***capabilities);
-int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
-  qemuMonitorMigrationCaps capability,
-  bool state);
 int qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon,
 virBitmapPtr caps,
 virBitmapPtr states);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 7ab73657a0..c6cb71addf 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -6198,59 +6198,6 @@ qemuMonitorJSONGetMigrationCapabilities(qemuMonitorPtr 
mon,
 }
 
 
-int
-qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon,
-  qemuMonitorMigrationCaps capability,
-  bool state)
-{
-int ret = -1;
-
-virJSONValuePtr cmd = NULL;
-virJSONValuePtr reply = NULL;
-virJSONValuePtr cap = NULL;
-virJSONValuePtr caps;
-
-if (!(caps = virJSONValueNewArray()))
-goto cleanup;
-
-if (!(cap = virJSONValueNewObject()))
-goto cleanup;
-
-if (virJSONValueObjectAppendString(
-cap, "capability",
-qemuMonitorMigrationCapsTypeToString(capability)) < 0)
-goto cleanup;
-
-if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0)
-goto cleanup;
-
-if (virJSONValueArrayAppend(caps, cap) < 0)
-goto cleanup;
-
-cap = NULL;
-
-cmd = qemuMonitorJSONMakeCommand("migrate-set-capabilities",
- "a:capabilities", ,
- NULL);
-if (!cmd)
-goto cleanup;
-
-if (qemuMonitorJSONCommand(mon, cmd, ) < 0)
-goto cleanup;
-
-if (qemuMonitorJSONCheckError(cmd, reply) < 0)
-goto cleanup;
-
-ret = 0;
- cleanup:
-virJSONValueFree(caps);
-virJSONValueFree(cap);
-virJSONValueFree(cmd);
-virJSONValueFree(reply);
-return ret;
-}
-
-
 int
 qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon,
 virBitmapPtr caps,
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 76e6738f44..a73e98815c 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -145,9 +145,6 @@ int qemuMonitorJSONGetMigrationStats(qemuMonitorPtr mon,
 
 int qemuMonitorJSONGetMigrationCapabilities(qemuMonitorPtr mon,
 char ***capabilities);
-int qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon,
-  qemuMonitorMigrationCaps capability,
-  bool state);
 int qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon,
 virBitmapPtr caps,
 virBitmapPtr states);
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 60/73] qemu: Check remote caps when enabling always-on capabilities

2018-04-11 Thread Jiri Denemark
When an always-on migration capability is supposed to be enabled on both
sides of migration, each side can only enable the feature if it is
enabled by the other side.

Thus the source host sends a list of supported migration capabilities in
the migration cookie generated in the Begin phase. The destination host
consumes the list in the Prepare phase and decides what capabilities can
be enabled when starting a QEMU process for incoming migration. Once
done the destination sends the list of supported capabilities back to
the source where it is used during the Perform phase to determine what
capabilities can be automatically enabled.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 17 -
 src/qemu/qemu_migration_params.c | 22 --
 src/qemu/qemu_migration_params.h |  3 ++-
 3 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f573bd3eba..42194c0ea8 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1913,6 +1913,9 @@ qemuMigrationSrcBeginPhase(virQEMUDriverPtr driver,
 
 cookieFlags |= QEMU_MIGRATION_COOKIE_ALLOW_REBOOT;
 
+if (!(flags & VIR_MIGRATE_OFFLINE))
+cookieFlags |= QEMU_MIGRATION_COOKIE_CAPS;
+
 if (!(mig = qemuMigrationEatCookie(driver, vm, NULL, 0, 0)))
 goto cleanup;
 
@@ -2205,7 +2208,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 }
 cookieFlags = 0;
 } else {
-cookieFlags = QEMU_MIGRATION_COOKIE_GRAPHICS;
+cookieFlags = QEMU_MIGRATION_COOKIE_GRAPHICS |
+  QEMU_MIGRATION_COOKIE_CAPS;
 }
 
 if (flags & VIR_MIGRATE_POSTCOPY &&
@@ -2299,7 +2303,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG |
QEMU_MIGRATION_COOKIE_CPU_HOTPLUG |
QEMU_MIGRATION_COOKIE_CPU |
-   QEMU_MIGRATION_COOKIE_ALLOW_REBOOT)))
+   QEMU_MIGRATION_COOKIE_ALLOW_REBOOT |
+   QEMU_MIGRATION_COOKIE_CAPS)))
 goto cleanup;
 
 if (STREQ_NULLABLE(protocol, "rdma") &&
@@ -2378,7 +2383,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 }
 
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
- migParams) < 0)
+ migParams, mig->caps->automatic) < 0)
 goto stopjob;
 
 /* Migrations using TLS need to add the "tls-creds-x509" object and
@@ -3302,7 +3307,9 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 }
 
 mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
- cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
+ cookieFlags |
+ QEMU_MIGRATION_COOKIE_GRAPHICS |
+ QEMU_MIGRATION_COOKIE_CAPS);
 if (!mig)
 goto error;
 
@@ -3310,7 +3317,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 VIR_WARN("unable to provide data for graphics client relocation");
 
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
- migParams) < 0)
+ migParams, mig->caps->automatic) < 0)
 goto error;
 
 if (flags & VIR_MIGRATE_TLS) {
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 1b1e5829e8..979610c3a8 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -116,7 +116,9 @@ struct _qemuMigrationParamsFlagMapItem {
 };
 
 /* Migration capabilities which should always be enabled as long as they
- * are supported by QEMU. */
+ * are supported by QEMU. If the capability is supposed to be enabled on both
+ * sides of migration, it won't be enabled unless both sides support it.
+ */
 static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = {
 {QEMU_MIGRATION_CAP_PAUSE_BEFORE_SWITCHOVER,
  QEMU_MIGRATION_SOURCE},
@@ -975,7 +977,8 @@ int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
  int asyncJob,
- qemuMigrationParamsPtr migParams)
+ qemuMigrationParamsPtr migParams,
+ virBitmapPtr remoteCaps)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuMigrationCapability cap;
@@ -1005,6 +1008,21 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
 
 if (qemuMigrationParamsAlwaysOn[i].party & party &&
 qemuMigrationCapsGet(vm, cap)) {
+if (qemuMigrationParamsAlwaysOn[i].party != party) {
+bool remote = false;
+
+if (remoteCaps)
+

[libvirt] [PATCH v2 51/73] util: Introduce virJSONValueObjectStealObject

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/libvirt_private.syms | 1 +
 src/util/virjson.c   | 8 
 src/util/virjson.h   | 2 ++
 3 files changed, 11 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index cab324c4d7..0918e69525 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2098,6 +2098,7 @@ virJSONValueObjectIsNull;
 virJSONValueObjectKeysNumber;
 virJSONValueObjectRemoveKey;
 virJSONValueObjectStealArray;
+virJSONValueObjectStealObject;
 virJSONValueToString;
 
 
diff --git a/src/util/virjson.c b/src/util/virjson.c
index 3ddefc34ca..dfe00d9280 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -1400,6 +1400,14 @@ virJSONValueObjectStealArray(virJSONValuePtr object, 
const char *key)
 }
 
 
+virJSONValuePtr
+virJSONValueObjectStealObject(virJSONValuePtr object,
+  const char *key)
+{
+return virJSONValueObjectStealByType(object, key, VIR_JSON_TYPE_OBJECT);
+}
+
+
 int
 virJSONValueObjectIsNull(virJSONValuePtr object,
  const char *key)
diff --git a/src/util/virjson.h b/src/util/virjson.h
index f7283dcf97..0f098892b4 100644
--- a/src/util/virjson.h
+++ b/src/util/virjson.h
@@ -112,6 +112,8 @@ virJSONValuePtr virJSONValueObjectGetArray(virJSONValuePtr 
object,
const char *key);
 virJSONValuePtr virJSONValueObjectStealArray(virJSONValuePtr object,
  const char *key);
+virJSONValuePtr virJSONValueObjectStealObject(virJSONValuePtr object,
+  const char *key);
 
 const char *virJSONValueObjectGetString(virJSONValuePtr object, const char 
*key);
 const char *virJSONValueObjectGetStringOrNumber(virJSONValuePtr object, const 
char *key);
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 23/73] qemu: Rename qemuMigrationParamsSet

2018-04-11 Thread Jiri Denemark
The new name is qemuMigrationParamsApply and it will soon become the
only API which will send all requested migration parameters and
capabilities to QEMU. All other qemuMigrationParams* APIs will just
operate on the qemuMigrationParams structure.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c|  8 
 src/qemu/qemu_migration_params.c | 21 -
 src/qemu/qemu_migration_params.h |  8 
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 54d9dfa025..602ccdfdd5 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2476,8 +2476,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
 goto stopjob;
 
-if (qemuMigrationParamsSet(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
-   migParams) < 0)
+if (qemuMigrationParamsApply(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
+ migParams) < 0)
 goto stopjob;
 
 if (mig->nbd &&
@@ -3471,8 +3471,8 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
true, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
 goto error;
 
-if (qemuMigrationParamsSet(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
-   migParams) < 0)
+if (qemuMigrationParamsApply(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ migParams) < 0)
 goto error;
 
 if (qemuDomainObjEnterMonitorAsync(driver, vm,
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index dd8cf68842..92fe84d324 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -108,11 +108,22 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
 }
 
 
+/**
+ * qemuMigrationParamsApply
+ * @driver: qemu driver
+ * @vm: domain object
+ * @asyncJob: migration job
+ * @migParams: migration parameters to send to QEMU
+ *
+ * Send all parameters stored in @migParams to QEMU.
+ *
+ * Returns 0 on success, -1 on failure.
+ */
 int
-qemuMigrationParamsSet(virQEMUDriverPtr driver,
-   virDomainObjPtr vm,
-   int asyncJob,
-   qemuMigrationParamsPtr migParams)
+qemuMigrationParamsApply(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob,
+ qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 int ret = -1;
@@ -391,7 +402,7 @@ qemuMigrationParamsReset(virQEMUDriverPtr driver,
 goto cleanup;
 
 if (origParams) {
-if (qemuMigrationParamsSet(driver, vm, asyncJob, origParams) < 0)
+if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams) < 0)
 goto cleanup;
 qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams);
 }
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index e8323dc9bb..ce7f84fd66 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -66,10 +66,10 @@ void
 qemuMigrationParamsFree(qemuMigrationParamsPtr migParams);
 
 int
-qemuMigrationParamsSet(virQEMUDriverPtr driver,
-   virDomainObjPtr vm,
-   int asyncJob,
-   qemuMigrationParamsPtr migParams);
+qemuMigrationParamsApply(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob,
+ qemuMigrationParamsPtr migParams);
 
 int
 qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 35/73] qemu: Use qemuMigrationParamsFromFlags everywhere

2018-04-11 Thread Jiri Denemark
Every migration entry point in qemu_driver is supposed to call
qemuMigrationParamsFromFlags to transform flags and parameters into
qemuMigrationParams structure and pass the result to qemuMigration*
APIs.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c| 64 +++
 src/qemu/qemu_migration.c | 23 ++
 src/qemu/qemu_migration.h |  2 ++
 3 files changed, 62 insertions(+), 27 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index d8a641f77d..5271e01d92 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12126,6 +12126,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@@ -12136,6 +12137,10 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 goto cleanup;
 }
 
+if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
+   
QEMU_MIGRATION_DESTINATION)))
+goto cleanup;
+
 if (virLockManagerPluginUsesState(driver->lockManager)) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_("Cannot use migrate v2 protocol with lock manager 
%s"),
@@ -12151,9 +12156,10 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 
 ret = qemuMigrationDstPrepareTunnel(driver, dconn,
 NULL, 0, NULL, NULL, /* No cookies in 
v2 */
-st, , origname, flags);
+st, , origname, migParams, flags);
 
  cleanup:
+qemuMigrationParamsFree(migParams);
 VIR_FREE(origname);
 virDomainDefFree(def);
 return ret;
@@ -12178,6 +12184,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 virDomainDefPtr def = NULL;
 char *origname = NULL;
 qemuMigrationCompressionPtr compression = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@@ -12195,6 +12202,10 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
 goto cleanup;
 
+if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
+   
QEMU_MIGRATION_DESTINATION)))
+goto cleanup;
+
 if (virLockManagerPluginUsesState(driver->lockManager)) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_("Cannot use migrate v2 protocol with lock manager 
%s"),
@@ -12216,9 +12227,10 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 NULL, 0, NULL, NULL, /* No cookies */
 uri_in, uri_out,
 , origname, NULL, 0, NULL, 0,
-compression, flags);
+compression, migParams, flags);
 
  cleanup:
+qemuMigrationParamsFree(migParams);
 VIR_FREE(compression);
 VIR_FREE(origname);
 virDomainDefFree(def);
@@ -12252,10 +12264,11 @@ qemuDomainMigratePerform(virDomainPtr dom,
 goto cleanup;
 }
 
-if (!(migParams = qemuMigrationParamsNew()))
+if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
 goto cleanup;
 
-if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
+if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
+   QEMU_MIGRATION_SOURCE)))
 goto cleanup;
 
 if (!(vm = qemuDomObjFromDomain(dom)))
@@ -12430,6 +12443,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 virDomainDefPtr def = NULL;
 char *origname = NULL;
 qemuMigrationCompressionPtr compression = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@@ -12447,6 +12461,10 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
 goto cleanup;
 
+if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
+   
QEMU_MIGRATION_DESTINATION)))
+goto cleanup;
+
 if (!(def = qemuMigrationAnyPrepareDef(driver, dom_xml, dname, )))
 goto cleanup;
 
@@ -12458,9 +12476,10 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 cookieout, cookieoutlen,
 uri_in, uri_out,
 , origname, NULL, 0, NULL, 0,
-compression, flags);
+compression, migParams, flags);
 
  cleanup:
+

[libvirt] [PATCH v2 36/73] qemu: Hide qemuMigrationParamsNew

2018-04-11 Thread Jiri Denemark
It is no longer used outside qemu_migration_params.c.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 2 +-
 src/qemu/qemu_migration_params.h | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index b55abc2e36..a0a00d0fc7 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -44,7 +44,7 @@ struct _qemuMigrationParams {
 };
 
 
-qemuMigrationParamsPtr
+static qemuMigrationParamsPtr
 qemuMigrationParamsNew(void)
 {
 qemuMigrationParamsPtr params;
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index d66fdb7cde..4350b14d6d 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -56,9 +56,6 @@ typedef enum {
 } qemuMigrationParty;
 
 
-qemuMigrationParamsPtr
-qemuMigrationParamsNew(void);
-
 qemuMigrationParamsPtr
 qemuMigrationParamsFromFlags(virTypedParameterPtr params,
  int nparams,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 57/73] qemu: Move migration capabilities JSON formatting

2018-04-11 Thread Jiri Denemark
We want to have all migration capabilities parsing and formatting at one
place, i.e., in qemu_migration_params.c. The parsing is already there in
qemuMigrationCapsCheck.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 66 ++--
 src/qemu/qemu_migration_paramspriv.h |  4 ++
 src/qemu/qemu_monitor.c  | 27 +++-
 src/qemu/qemu_monitor.h  |  3 +-
 src/qemu/qemu_monitor_json.c | 40 ++---
 src/qemu/qemu_monitor_json.h |  3 +-
 tests/qemumonitorjsontest.c  | 11 +++--
 7 files changed, 96 insertions(+), 58 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 77abc7191f..548bb1c0dd 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -591,6 +591,53 @@ qemuMigrationParamsToJSON(qemuMigrationParamsPtr migParams)
 }
 
 
+virJSONValuePtr
+qemuMigrationCapsToJSON(virBitmapPtr caps,
+virBitmapPtr states)
+{
+virJSONValuePtr json = NULL;
+virJSONValuePtr cap = NULL;
+qemuMonitorMigrationCaps bit;
+const char *name;
+
+if (!(json = virJSONValueNewArray()))
+return NULL;
+
+for (bit = 0; bit < QEMU_MONITOR_MIGRATION_CAPS_LAST; bit++) {
+bool supported = false;
+bool state = false;
+
+ignore_value(virBitmapGetBit(caps, bit, ));
+if (!supported)
+continue;
+
+ignore_value(virBitmapGetBit(states, bit, ));
+
+if (!(cap = virJSONValueNewObject()))
+goto error;
+
+name = qemuMonitorMigrationCapsTypeToString(bit);
+if (virJSONValueObjectAppendString(cap, "capability", name) < 0)
+goto error;
+
+if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0)
+goto error;
+
+if (virJSONValueArrayAppend(json, cap) < 0)
+goto error;
+
+cap = NULL;
+}
+
+return json;
+
+ error:
+virJSONValueFree(json);
+virJSONValueFree(cap);
+return NULL;
+}
+
+
 /**
  * qemuMigrationParamsApply
  * @driver: qemu driver
@@ -611,6 +658,7 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 qemuDomainObjPrivatePtr priv = vm->privateData;
 bool xbzrleCacheSize_old = false;
 virJSONValuePtr params = NULL;
+virJSONValuePtr caps = NULL;
 qemuMigrationParam xbzrle = QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE;
 int ret = -1;
 int rc;
@@ -618,10 +666,16 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
 return -1;
 
-if (qemuMonitorSetMigrationCapabilities(priv->mon, priv->migrationCaps,
-migParams->caps) < 0)
+if (!(caps = qemuMigrationCapsToJSON(priv->migrationCaps, 
migParams->caps)))
 goto cleanup;
 
+if (virJSONValueArraySize(caps) > 0) {
+rc = qemuMonitorSetMigrationCapabilities(priv->mon, caps);
+caps = NULL;
+if (rc < 0)
+goto cleanup;
+}
+
 /* If QEMU is too old to support xbzrle-cache-size migration parameter,
  * we need to set it via migrate-set-cache-size and tell
  * qemuMonitorSetMigrationParams to ignore this parameter.
@@ -974,6 +1028,7 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver,
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 virBitmapPtr migEvent = NULL;
+virJSONValuePtr json = NULL;
 char **caps = NULL;
 char **capStr;
 int ret = -1;
@@ -1014,10 +1069,14 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver,
 
 ignore_value(virBitmapSetBit(migEvent, 
QEMU_MONITOR_MIGRATION_CAPS_EVENTS));
 
+if (!(json = qemuMigrationCapsToJSON(migEvent, migEvent)))
+goto cleanup;
+
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
 goto cleanup;
 
-rc = qemuMonitorSetMigrationCapabilities(priv->mon, migEvent, 
migEvent);
+rc = qemuMonitorSetMigrationCapabilities(priv->mon, json);
+json = NULL;
 
 if (qemuDomainObjExitMonitor(driver, vm) < 0)
 goto cleanup;
@@ -1039,6 +1098,7 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver,
 ret = 0;
 
  cleanup:
+virJSONValueFree(json);
 virStringListFree(caps);
 return ret;
 }
diff --git a/src/qemu/qemu_migration_paramspriv.h 
b/src/qemu/qemu_migration_paramspriv.h
index 350973b6f9..30773a679d 100644
--- a/src/qemu/qemu_migration_paramspriv.h
+++ b/src/qemu/qemu_migration_paramspriv.h
@@ -28,4 +28,8 @@ qemuMigrationParamsToJSON(qemuMigrationParamsPtr migParams);
 qemuMigrationParamsPtr
 qemuMigrationParamsFromJSON(virJSONValuePtr params);
 
+virJSONValuePtr
+qemuMigrationCapsToJSON(virBitmapPtr caps,
+virBitmapPtr states);
+
 #endif /* __QEMU_MIGRATION_PARAMSPRIV_H__ */
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 641465f227..13d885ffc5 100644
--- a/src/qemu/qemu_monitor.c

[libvirt] [PATCH v2 47/73] qemu: Drop qemuMigrationCompression structure

2018-04-11 Thread Jiri Denemark
By merging qemuMigrationAnyCompressionParse into
qemuMigrationParamsSetCompression we can drop the useless intermediate
qemuMigrationCompression structure and parse compression related typed
parameters and flags directly into qemuMigrationParams.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   |  63 ++-
 src/qemu/qemu_migration_params.c | 181 +--
 src/qemu/qemu_migration_params.h |  26 +
 3 files changed, 85 insertions(+), 185 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5e79e90609..8e880280ec 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12126,7 +12126,6 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
-qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12138,11 +12137,8 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 goto cleanup;
 }
 
-if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
-goto cleanup;
-
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
-   QEMU_MIGRATION_DESTINATION, 
compression)))
+   
QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
 
 if (virLockManagerPluginUsesState(driver->lockManager)) {
@@ -12163,7 +12159,6 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
 st, , origname, migParams, flags);
 
  cleanup:
-VIR_FREE(compression);
 qemuMigrationParamsFree(migParams);
 VIR_FREE(origname);
 virDomainDefFree(def);
@@ -12188,7 +12183,6 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
-qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12204,11 +12198,8 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 goto cleanup;
 }
 
-if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
-goto cleanup;
-
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
-   QEMU_MIGRATION_DESTINATION, 
compression)))
+   
QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
 
 if (virLockManagerPluginUsesState(driver->lockManager)) {
@@ -12236,7 +12227,6 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
 
  cleanup:
 qemuMigrationParamsFree(migParams);
-VIR_FREE(compression);
 VIR_FREE(origname);
 virDomainDefFree(def);
 return ret;
@@ -12257,7 +12247,6 @@ qemuDomainMigratePerform(virDomainPtr dom,
 virDomainObjPtr vm;
 int ret = -1;
 const char *dconnuri = NULL;
-qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@@ -12269,11 +12258,8 @@ qemuDomainMigratePerform(virDomainPtr dom,
 goto cleanup;
 }
 
-if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
-goto cleanup;
-
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
-   QEMU_MIGRATION_SOURCE, 
compression)))
+   QEMU_MIGRATION_SOURCE)))
 goto cleanup;
 
 if (!(vm = qemuDomObjFromDomain(dom)))
@@ -12303,7 +12289,6 @@ qemuDomainMigratePerform(virDomainPtr dom,
 
  cleanup:
 qemuMigrationParamsFree(migParams);
-VIR_FREE(compression);
 return ret;
 }
 
@@ -12447,7 +12432,6 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 virQEMUDriverPtr driver = dconn->privateData;
 virDomainDefPtr def = NULL;
 char *origname = NULL;
-qemuMigrationCompressionPtr compression = NULL;
 qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
@@ -12463,11 +12447,8 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 goto cleanup;
 }
 
-if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
-goto cleanup;
-
 if (!(migParams = qemuMigrationParamsFromFlags(NULL, 0, flags,
-   QEMU_MIGRATION_DESTINATION, 
compression)))
+   
QEMU_MIGRATION_DESTINATION)))
 goto cleanup;
 
 if (!(def = qemuMigrationAnyPrepareDef(driver, dom_xml, dname, )))
@@ -12485,7 +12466,6 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
 
  cleanup:
 qemuMigrationParamsFree(migParams);
-VIR_FREE(compression);
 VIR_FREE(origname);
 virDomainDefFree(def);
 return ret;
@@ -12513,7 +12493,6 @@ 

[libvirt] [PATCH v2 54/73] qemu: Export qemuMigrationParams{To, From}JSON for tests

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/Makefile.inc.am |  1 +
 src/qemu/qemu_migration_params.c |  5 +++--
 src/qemu/qemu_migration_paramspriv.h | 31 
 3 files changed, 35 insertions(+), 2 deletions(-)
 create mode 100644 src/qemu/qemu_migration_paramspriv.h

diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am
index 25706ba4bc..63e7c878d1 100644
--- a/src/qemu/Makefile.inc.am
+++ b/src/qemu/Makefile.inc.am
@@ -35,6 +35,7 @@ QEMU_DRIVER_SOURCES = \
qemu/qemu_migration_cookie.h \
 qemu/qemu_migration_params.c \
 qemu/qemu_migration_params.h \
+qemu/qemu_migration_paramspriv.h \
qemu/qemu_monitor.c \
qemu/qemu_monitor.h \
qemu/qemu_monitor_text.c \
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 560c2d3ea5..e9908cf8d4 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -30,6 +30,7 @@
 #include "qemu_hotplug.h"
 #include "qemu_migration.h"
 #include "qemu_migration_params.h"
+#include "qemu_migration_paramspriv.h"
 #include "qemu_monitor.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
@@ -314,7 +315,7 @@ qemuMigrationParamsDump(qemuMigrationParamsPtr migParams,
 }
 
 
-static qemuMigrationParamsPtr
+qemuMigrationParamsPtr
 qemuMigrationParamsFromJSON(virJSONValuePtr params)
 {
 qemuMigrationParamsPtr migParams = NULL;
@@ -375,7 +376,7 @@ qemuMigrationParamsFromJSON(virJSONValuePtr params)
 }
 
 
-static virJSONValuePtr
+virJSONValuePtr
 qemuMigrationParamsToJSON(qemuMigrationParamsPtr migParams)
 {
 virJSONValuePtr params = NULL;
diff --git a/src/qemu/qemu_migration_paramspriv.h 
b/src/qemu/qemu_migration_paramspriv.h
new file mode 100644
index 00..350973b6f9
--- /dev/null
+++ b/src/qemu/qemu_migration_paramspriv.h
@@ -0,0 +1,31 @@
+/*
+ * qemu_migration_paramspriv.h: private declarations for migration parameters
+ *
+ * Copyright (C) 2006-2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * .
+ *
+ */
+
+#ifndef __QEMU_MIGRATION_PARAMSPRIV_H__
+# define __QEMU_MIGRATION_PARAMSPRIV_H__
+
+virJSONValuePtr
+qemuMigrationParamsToJSON(qemuMigrationParamsPtr migParams);
+
+qemuMigrationParamsPtr
+qemuMigrationParamsFromJSON(virJSONValuePtr params);
+
+#endif /* __QEMU_MIGRATION_PARAMSPRIV_H__ */
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 50/73] qemumonitorjsontest: Drop migration params test

2018-04-11 Thread Jiri Denemark
The test is mostly useless and we want to refactor migration parameters
even further. The refactoring will allow us to introduce enhanced tests
for migration parameters.

Signed-off-by: Jiri Denemark 
---
 tests/qemumonitorjsontest.c | 99 -
 1 file changed, 99 deletions(-)

diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 8a5b0be64b..dafcccebad 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1787,104 +1787,6 @@ 
testQemuMonitorJSONqemuMonitorJSONGetBlockStatsInfo(const void *data)
 return ret;
 }
 
-static int
-testQemuMonitorJSONqemuMonitorJSONGetMigrationParams(const void *data)
-{
-virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
-qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, xmlopt);
-qemuMonitorMigrationParams params;
-int ret = -1;
-
-if (!test)
-return -1;
-
-if (qemuMonitorTestAddItem(test, "query-migrate-parameters",
-   "{"
-   "\"return\": {"
-   "\"decompress-threads\": 2,"
-   "\"cpu-throttle-increment\": 10,"
-   "\"compress-threads\": 8,"
-   "\"compress-level\": 1,"
-   "\"cpu-throttle-initial\": 20,"
-   "\"tls-creds\": \"tls0\","
-   "\"tls-hostname\": \"\","
-   "\"max-bandwidth\": 1234567890,"
-   "\"downtime-limit\": 500,"
-   "\"block-incremental\": true,"
-   "\"xbzrle-cache-size\": 67108864"
-   "}"
-   "}") < 0) {
-goto cleanup;
-}
-
-if (qemuMonitorJSONGetMigrationParams(qemuMonitorTestGetMonitor(test),
-  ) < 0)
-goto cleanup;
-
-#define CHECK_NUM(VAR, FIELD, VALUE, FMT) \
-do { \
-if (!params.VAR ## _set) { \
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s is not set", FIELD); \
-goto cleanup; \
-} \
-if (params.VAR != VALUE) { \
-virReportError(VIR_ERR_INTERNAL_ERROR, \
-   "Invalid %s: " FMT ", expected " FMT, \
-   FIELD, params.VAR, VALUE); \
-goto cleanup; \
-} \
-} while (0)
-
-#define CHECK_INT(VAR, FIELD, VALUE) \
-CHECK_NUM(VAR, FIELD, VALUE, "%d")
-
-#define CHECK_ULONG(VAR, FIELD, VALUE) \
-CHECK_NUM(VAR, FIELD, VALUE, "%llu")
-
-#define CHECK_BOOL(VAR, FIELD, VALUE) \
-CHECK_NUM(VAR, FIELD, VALUE, "%d")
-
-#define CHECK_STR(VAR, FIELD, VALUE) \
-do { \
-if (!params.VAR) { \
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s is not set", FIELD); \
-goto cleanup; \
-} \
-if (STRNEQ(params.VAR, VALUE)) { \
-virReportError(VIR_ERR_INTERNAL_ERROR, \
-   "Invalid %s:'%s', expected '%s'", \
-   FIELD, params.VAR, VALUE); \
-goto cleanup; \
-} \
-} while (0)
-
-CHECK_INT(compressLevel, "compress-level", 1);
-CHECK_INT(compressThreads, "compress-threads", 8);
-CHECK_INT(decompressThreads, "decompress-threads", 2);
-CHECK_INT(cpuThrottleInitial, "cpu-throttle-initial", 20);
-CHECK_INT(cpuThrottleIncrement, "cpu-throttle-increment", 10);
-CHECK_STR(tlsCreds, "tls-creds", "tls0");
-CHECK_STR(tlsHostname, "tls-hostname", "");
-CHECK_ULONG(maxBandwidth, "max-bandwidth", 1234567890ULL);
-CHECK_ULONG(downtimeLimit, "downtime-limit", 500ULL);
-CHECK_BOOL(blockIncremental, "block-incremental", true);
-CHECK_ULONG(xbzrleCacheSize, "xbzrle-cache-size", 67108864ULL);
-
-#undef CHECK_NUM
-#undef CHECK_INT
-#undef CHECK_ULONG
-#undef CHECK_BOOL
-#undef CHECK_STR
-
-ret = 0;
-
- cleanup:
-VIR_FREE(params.tlsCreds);
-VIR_FREE(params.tlsHostname);
-qemuMonitorTestFree(test);
-return ret;
-}
-
 
 static int
 testQemuMonitorJSONqemuMonitorJSONGetMigrationCacheSize(const void *data)
@@ -3002,7 +2904,6 @@ mymain(void)
 DO_TEST(qemuMonitorJSONGetBlockInfo);
 DO_TEST(qemuMonitorJSONGetBlockStatsInfo);
 DO_TEST(qemuMonitorJSONGetMigrationCacheSize);
-DO_TEST(qemuMonitorJSONGetMigrationParams);
 DO_TEST(qemuMonitorJSONGetMigrationStats);
 DO_TEST(qemuMonitorJSONGetChardevInfo);
 DO_TEST(qemuMonitorJSONSetBlockIoThrottle);
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 39/73] qemu: Set migration capabilities automatically

2018-04-11 Thread Jiri Denemark
Most migration capabilities are directly connected with
virDomainMigrateFlags so qemuMigrationParamsFromFlags can automatically
enable them.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 30 -
 src/qemu/qemu_migration_params.c | 45 +++-
 src/qemu/qemu_migration_params.h |  6 -
 3 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 0446003f47..e1a29d9569 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2385,18 +2385,6 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 goto stopjob;
 }
 
-if (qemuMigrationParamsSetCapability(vm,
- 
QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- migParams) < 0)
-goto stopjob;
-
-if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
- flags & VIR_MIGRATE_POSTCOPY,
- migParams) < 0)
-goto stopjob;
-
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
  migParams) < 0)
 goto stopjob;
@@ -3341,24 +3329,6 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 if (qemuMigrationParamsSetCompression(vm, compression, migParams) < 0)
 goto error;
 
-if (qemuMigrationParamsSetCapability(vm,
- 
QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
- flags & VIR_MIGRATE_AUTO_CONVERGE,
- migParams) < 0)
-goto error;
-
-if (qemuMigrationParamsSetCapability(vm,
- 
QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- migParams) < 0)
-goto error;
-
-if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
- flags & VIR_MIGRATE_POSTCOPY,
- migParams) < 0)
-goto error;
-
 if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
  migParams) < 0)
 goto error;
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 03056eed09..369e560990 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -49,6 +49,13 @@ struct _qemuMigrationParamsAlwaysOnItem {
 int party; /* bit-wise OR of qemuMigrationParty */
 };
 
+typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem;
+struct _qemuMigrationParamsFlagMapItem {
+virDomainMigrateFlags flag;
+qemuMonitorMigrationCaps cap;
+int party; /* bit-wise OR of qemuMigrationParty */
+};
+
 /* Migration capabilities which should always be enabled as long as they
  * are supported by QEMU. */
 static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = {
@@ -56,6 +63,21 @@ static const qemuMigrationParamsAlwaysOnItem 
qemuMigrationParamsAlwaysOn[] = {
  QEMU_MIGRATION_SOURCE},
 };
 
+/* Translation from virDomainMigrateFlags to qemuMonitorMigrationCaps. */
+static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
+{VIR_MIGRATE_RDMA_PIN_ALL,
+ QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
+ QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
+
+{VIR_MIGRATE_AUTO_CONVERGE,
+ QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
+ QEMU_MIGRATION_SOURCE},
+
+{VIR_MIGRATE_POSTCOPY,
+ QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
+ QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
+};
+
 
 static qemuMigrationParamsPtr
 qemuMigrationParamsNew(void)
@@ -97,12 +119,21 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
  qemuMigrationParty party)
 {
 qemuMigrationParamsPtr migParams;
+size_t i;
 
 if (!(migParams = qemuMigrationParamsNew()))
 return NULL;
 
-if (!params)
-return migParams;
+for (i = 0; i < ARRAY_CARDINALITY(qemuMigrationParamsFlagMap); i++) {
+qemuMonitorMigrationCaps cap = qemuMigrationParamsFlagMap[i].cap;
+
+if (qemuMigrationParamsFlagMap[i].party & party &&
+flags & qemuMigrationParamsFlagMap[i].flag) {
+VIR_DEBUG("Enabling migration capability '%s'",
+  qemuMonitorMigrationCapsTypeToString(cap));
+ignore_value(virBitmapSetBit(migParams->caps, cap));
+}
+}
 
 #define GET(PARAM, VAR) \
 do { \
@@ -116,9 +147,11 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr 

[libvirt] [PATCH v2 55/73] qemu: Move qemuMonitorMigrationParams structure

2018-04-11 Thread Jiri Denemark
It's no longer used by the monitor code so we can hide it inside
qemu_migration_params.c.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 36 
 src/qemu/qemu_monitor.h  | 36 
 2 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index e9908cf8d4..8027896c12 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -39,6 +39,42 @@ VIR_LOG_INIT("qemu.qemu_migration_params");
 
 #define QEMU_MIGRATION_TLS_ALIAS_BASE "libvirt_migrate"
 
+typedef struct _qemuMonitorMigrationParams qemuMonitorMigrationParams;
+typedef qemuMonitorMigrationParams *qemuMonitorMigrationParamsPtr;
+struct _qemuMonitorMigrationParams {
+bool compressLevel_set;
+int compressLevel;
+
+bool compressThreads_set;
+int compressThreads;
+
+bool decompressThreads_set;
+int decompressThreads;
+
+bool cpuThrottleInitial_set;
+int cpuThrottleInitial;
+
+bool cpuThrottleIncrement_set;
+int cpuThrottleIncrement;
+
+/* Value is either NULL, "", or some string. NULL indicates no support;
+ * whereas, some string value indicates we can support setting/clearing */
+char *tlsCreds;
+char *tlsHostname;
+
+bool maxBandwidth_set;
+unsigned long long maxBandwidth;
+
+bool downtimeLimit_set;
+unsigned long long downtimeLimit;
+
+bool blockIncremental_set;
+bool blockIncremental;
+
+bool xbzrleCacheSize_set;
+unsigned long long xbzrleCacheSize;
+};
+
 struct _qemuMigrationParams {
 unsigned long long compMethods; /* bit-wise OR of 
qemuMigrationCompressMethod */
 virBitmapPtr caps;
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index fd3c767dcf..1c49cc2370 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -642,42 +642,6 @@ int qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon,
 int qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
  unsigned long long cacheSize);
 
-typedef struct _qemuMonitorMigrationParams qemuMonitorMigrationParams;
-typedef qemuMonitorMigrationParams *qemuMonitorMigrationParamsPtr;
-struct _qemuMonitorMigrationParams {
-bool compressLevel_set;
-int compressLevel;
-
-bool compressThreads_set;
-int compressThreads;
-
-bool decompressThreads_set;
-int decompressThreads;
-
-bool cpuThrottleInitial_set;
-int cpuThrottleInitial;
-
-bool cpuThrottleIncrement_set;
-int cpuThrottleIncrement;
-
-/* Value is either NULL, "", or some string. NULL indicates no support;
- * whereas, some string value indicates we can support setting/clearing */
-char *tlsCreds;
-char *tlsHostname;
-
-bool maxBandwidth_set;
-unsigned long long maxBandwidth;
-
-bool downtimeLimit_set;
-unsigned long long downtimeLimit;
-
-bool blockIncremental_set;
-bool blockIncremental;
-
-bool xbzrleCacheSize_set;
-unsigned long long xbzrleCacheSize;
-};
-
 int qemuMonitorGetMigrationParams(qemuMonitorPtr mon,
   virJSONValuePtr *params);
 int qemuMonitorSetMigrationParams(qemuMonitorPtr mon,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 34/73] qemu: Introduce qemuMigrationParty enum

2018-04-11 Thread Jiri Denemark
Some migration parameters and capabilities are supposed to be set on
both sides of migration while others should only be set on one side. For
example, CPU throttling parameters make no sense on the destination and
they can be used even if the destination is too old to support them.

To make qemuMigrationParamsFromFlags more general and usable on both
sides of migration, we need to tell it what side it's been called on.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   | 3 ++-
 src/qemu/qemu_migration_params.c | 9 ++---
 src/qemu/qemu_migration_params.h | 8 +++-
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6e6fc130c5..d8a641f77d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12765,7 +12765,8 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
 if (nmigrate_disks < 0)
 goto cleanup;
 
-if (!(migParams = qemuMigrationParamsFromFlags(params, nparams, flags)))
+if (!(migParams = qemuMigrationParamsFromFlags(params, nparams, flags,
+   QEMU_MIGRATION_SOURCE)))
 goto cleanup;
 
 if (!(compression = qemuMigrationAnyCompressionParse(params, nparams, 
flags)))
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index a7b5ce385e..b55abc2e36 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -80,7 +80,8 @@ qemuMigrationParamsFree(qemuMigrationParamsPtr migParams)
 qemuMigrationParamsPtr
 qemuMigrationParamsFromFlags(virTypedParameterPtr params,
  int nparams,
- unsigned long flags)
+ unsigned long flags,
+ qemuMigrationParty party)
 {
 qemuMigrationParamsPtr migParams;
 
@@ -102,8 +103,10 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
 migParams->params.VAR ## _set = true; \
 } while (0)
 
-GET(AUTO_CONVERGE_INITIAL, cpuThrottleInitial);
-GET(AUTO_CONVERGE_INCREMENT, cpuThrottleIncrement);
+if (party == QEMU_MIGRATION_SOURCE) {
+GET(AUTO_CONVERGE_INITIAL, cpuThrottleInitial);
+GET(AUTO_CONVERGE_INCREMENT, cpuThrottleIncrement);
+}
 
 #undef GET
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 7ca667a507..d66fdb7cde 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -50,6 +50,11 @@ struct _qemuMigrationCompression {
 typedef struct _qemuMigrationParams qemuMigrationParams;
 typedef qemuMigrationParams *qemuMigrationParamsPtr;
 
+typedef enum {
+QEMU_MIGRATION_SOURCE = (1 << 0),
+QEMU_MIGRATION_DESTINATION = (1 << 1),
+} qemuMigrationParty;
+
 
 qemuMigrationParamsPtr
 qemuMigrationParamsNew(void);
@@ -57,7 +62,8 @@ qemuMigrationParamsNew(void);
 qemuMigrationParamsPtr
 qemuMigrationParamsFromFlags(virTypedParameterPtr params,
  int nparams,
- unsigned long flags);
+ unsigned long flags,
+ qemuMigrationParty party);
 
 void
 qemuMigrationParamsFree(qemuMigrationParamsPtr migParams);
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 52/73] qemu: Move migration parameters JSON parsing

2018-04-11 Thread Jiri Denemark
We want to have all migration parameters parsing and formatting at once
place, i.e., in qemu_migration_params.c.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 74 +---
 src/qemu/qemu_monitor.c  | 13 +-
 src/qemu/qemu_monitor.h  |  2 +-
 src/qemu/qemu_monitor_json.c | 51 ++
 src/qemu/qemu_monitor_json.h |  2 +-
 5 files changed, 85 insertions(+), 57 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index cadb402b0f..845234c34b 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -314,6 +314,67 @@ qemuMigrationParamsDump(qemuMigrationParamsPtr migParams,
 }
 
 
+static qemuMigrationParamsPtr
+qemuMigrationParamsFromJSON(virJSONValuePtr params)
+{
+qemuMigrationParamsPtr migParams = NULL;
+
+if (!(migParams = qemuMigrationParamsNew()))
+return NULL;
+
+if (!params)
+return migParams;
+
+#define PARSE_SET(API, VAR, FIELD) \
+do { \
+if (API(params, FIELD, >params.VAR) == 0) \
+migParams->params.VAR ## _set = true; \
+} while (0)
+
+#define PARSE_INT(VAR, FIELD) \
+PARSE_SET(virJSONValueObjectGetNumberInt, VAR, FIELD)
+
+#define PARSE_ULONG(VAR, FIELD) \
+PARSE_SET(virJSONValueObjectGetNumberUlong, VAR, FIELD)
+
+#define PARSE_BOOL(VAR, FIELD) \
+PARSE_SET(virJSONValueObjectGetBoolean, VAR, FIELD)
+
+#define PARSE_STR(VAR, FIELD) \
+do { \
+const char *str; \
+if ((str = virJSONValueObjectGetString(params, FIELD))) { \
+if (VIR_STRDUP(migParams->params.VAR, str) < 0) \
+goto error; \
+} \
+} while (0)
+
+PARSE_INT(compressLevel, "compress-level");
+PARSE_INT(compressThreads, "compress-threads");
+PARSE_INT(decompressThreads, "decompress-threads");
+PARSE_INT(cpuThrottleInitial, "cpu-throttle-initial");
+PARSE_INT(cpuThrottleIncrement, "cpu-throttle-increment");
+PARSE_STR(tlsCreds, "tls-creds");
+PARSE_STR(tlsHostname, "tls-hostname");
+PARSE_ULONG(maxBandwidth, "max-bandwidth");
+PARSE_ULONG(downtimeLimit, "downtime-limit");
+PARSE_BOOL(blockIncremental, "block-incremental");
+PARSE_ULONG(xbzrleCacheSize, "xbzrle-cache-size");
+
+#undef PARSE_SET
+#undef PARSE_INT
+#undef PARSE_ULONG
+#undef PARSE_BOOL
+#undef PARSE_STR
+
+return migParams;
+
+ error:
+qemuMigrationParamsFree(migParams);
+return NULL;
+}
+
+
 /**
  * qemuMigrationParamsApply
  * @driver: qemu driver
@@ -527,28 +588,27 @@ qemuMigrationParamsFetch(virQEMUDriverPtr driver,
  qemuMigrationParamsPtr *migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
-qemuMigrationParamsPtr params = NULL;
+virJSONValuePtr jsonParams = NULL;
 int ret = -1;
 int rc;
 
 *migParams = NULL;
 
-if (!(params = qemuMigrationParamsNew()))
-return -1;
-
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
 goto cleanup;
 
-rc = qemuMonitorGetMigrationParams(priv->mon, >params);
+rc = qemuMonitorGetMigrationParams(priv->mon, );
 
 if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
 goto cleanup;
 
-VIR_STEAL_PTR(*migParams, params);
+if (!(*migParams = qemuMigrationParamsFromJSON(jsonParams)))
+goto cleanup;
+
 ret = 0;
 
  cleanup:
-qemuMigrationParamsFree(params);
+virJSONValueFree(jsonParams);
 return ret;
 }
 
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 18b54e2da8..411ce28787 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2622,9 +2622,20 @@ qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
 }
 
 
+/**
+ * qemuMonitorGetMigrationParams:
+ * @mon: Pointer to the monitor object.
+ * @params: Where to store migration parameters.
+ *
+ * If QEMU does not support querying migration parameters, the function will
+ * set @params to NULL and return 0 (success). The caller is responsible for
+ * freeing @params.
+ *
+ * Returns 0 on success, -1 on error.
+ */
 int
 qemuMonitorGetMigrationParams(qemuMonitorPtr mon,
-  qemuMonitorMigrationParamsPtr params)
+  virJSONValuePtr *params)
 {
 QEMU_CHECK_MONITOR_JSON(mon);
 
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 2bb4dbc667..261f3192f5 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -679,7 +679,7 @@ struct _qemuMonitorMigrationParams {
 };
 
 int qemuMonitorGetMigrationParams(qemuMonitorPtr mon,
-  qemuMonitorMigrationParamsPtr params);
+  virJSONValuePtr *params);
 int qemuMonitorSetMigrationParams(qemuMonitorPtr mon,
   qemuMonitorMigrationParamsPtr params);
 
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 

[libvirt] [PATCH v2 46/73] qemu: Replace qemuMigrationAnyCompressionDump

2018-04-11 Thread Jiri Denemark
Since every parameter or capability set in qemuMigrationCompression
structure is now reflected in qemuMigrationParams structure, we can
replace qemuMigrationAnyCompressionDump with a new API which will work
on qemuMigrationParams.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   |  6 ++--
 src/qemu/qemu_migration.c| 16 --
 src/qemu/qemu_migration.h|  1 -
 src/qemu/qemu_migration_params.c | 52 ++--
 src/qemu/qemu_migration_params.h | 10 +++---
 5 files changed, 37 insertions(+), 48 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3b0c3a3ffb..5e79e90609 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12297,7 +12297,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
  */
 ret = qemuMigrationSrcPerform(driver, dom->conn, vm, NULL,
   NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0,
-  compression, migParams, cookie, cookielen,
+  migParams, cookie, cookielen,
   NULL, NULL, /* No output cookies in v2 */
   flags, dname, resource, false);
 
@@ -12743,7 +12743,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
 
 ret = qemuMigrationSrcPerform(driver, dom->conn, vm, xmlin, NULL,
   dconnuri, uri, NULL, NULL, 0, NULL, 0,
-  compression, migParams,
+  migParams,
   cookiein, cookieinlen,
   cookieout, cookieoutlen,
   flags, dname, resource, true);
@@ -12836,7 +12836,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
 ret = qemuMigrationSrcPerform(driver, dom->conn, vm, dom_xml, persist_xml,
   dconnuri, uri, graphicsuri, listenAddress,
   nmigrate_disks, migrate_disks, nbdPort,
-  compression, migParams,
+  migParams,
   cookiein, cookieinlen, cookieout, 
cookieoutlen,
   flags, dname, bandwidth, true);
  cleanup:
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 1c5ee67929..319b4d000a 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3891,7 +3891,6 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriverPtr driver,
   size_t nmigrate_disks,
   const char **migrate_disks,
   int nbdPort,
-  qemuMigrationCompressionPtr compression,
   qemuMigrationParamsPtr migParams,
   unsigned long long bandwidth,
   bool useParams,
@@ -3976,8 +3975,8 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriverPtr driver,
  nbdPort) < 0)
 goto cleanup;
 
-if (qemuMigrationAnyCompressionDump(compression, , ,
-, ) < 0)
+if (qemuMigrationParamsDump(migParams, , ,
+, ) < 0)
 goto cleanup;
 }
 
@@ -4250,7 +4249,6 @@ qemuMigrationSrcPerformPeer2Peer(virQEMUDriverPtr driver,
  size_t nmigrate_disks,
  const char **migrate_disks,
  int nbdPort,
- qemuMigrationCompressionPtr compression,
  qemuMigrationParamsPtr migParams,
  unsigned long flags,
  const char *dname,
@@ -4375,7 +4373,7 @@ qemuMigrationSrcPerformPeer2Peer(virQEMUDriverPtr driver,
 ret = qemuMigrationSrcPerformPeer2Peer3(driver, sconn, dconn, 
dconnuri, vm, xmlin,
 persist_xml, dname, uri, 
graphicsuri,
 listenAddress, nmigrate_disks, 
migrate_disks,
-nbdPort, compression, 
migParams, resource,
+nbdPort, migParams, resource,
 useParams, flags);
 } else {
 ret = qemuMigrationSrcPerformPeer2Peer2(driver, sconn, dconn, vm,
@@ -4416,7 +4414,6 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
size_t nmigrate_disks,
const char **migrate_disks,
int nbdPort,
-   qemuMigrationCompressionPtr compression,
qemuMigrationParamsPtr migParams,
const char 

[libvirt] [PATCH v2 44/73] qemu: Move qemuMigrationAnyCompression*

2018-04-11 Thread Jiri Denemark
The code really belongs to qemu_migration_params.c.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 140 -
 src/qemu/qemu_migration.h|  19 
 src/qemu/qemu_migration_params.c | 147 +++
 src/qemu/qemu_migration_params.h |  11 +++
 4 files changed, 158 insertions(+), 159 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d4c5994f25..d0d0d97be4 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -77,11 +77,6 @@ VIR_ENUM_IMPL(qemuMigrationJobPhase, 
QEMU_MIGRATION_PHASE_LAST,
   "finish3",
 );
 
-VIR_ENUM_IMPL(qemuMigrationCompressMethod, QEMU_MIGRATION_COMPRESS_LAST,
-  "xbzrle",
-  "mt",
-);
-
 static int
 qemuMigrationJobStart(virQEMUDriverPtr driver,
   virDomainObjPtr vm,
@@ -5439,141 +5434,6 @@ qemuMigrationDstErrorReport(virQEMUDriverPtr driver,
 }
 
 
-/* don't ever pass NULL params with non zero nparams */
-qemuMigrationCompressionPtr
-qemuMigrationAnyCompressionParse(virTypedParameterPtr params,
- int nparams,
- unsigned long flags)
-{
-size_t i;
-qemuMigrationCompressionPtr compression = NULL;
-
-if (VIR_ALLOC(compression) < 0)
-return NULL;
-
-for (i = 0; i < nparams; i++) {
-int method;
-
-if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
-continue;
-
-method = qemuMigrationCompressMethodTypeFromString(params[i].value.s);
-if (method < 0) {
-virReportError(VIR_ERR_INVALID_ARG,
-   _("Unsupported compression method '%s'"),
-   params[i].value.s);
-goto error;
-}
-
-if (compression->methods & (1ULL << method)) {
-virReportError(VIR_ERR_INVALID_ARG,
-   _("Compression method '%s' is specified twice"),
-   params[i].value.s);
-goto error;
-}
-
-compression->methods |= 1ULL << method;
-}
-
-#define GET_PARAM(PARAM, TYPE, VALUE) \
-do { \
-int rc; \
-const char *par = VIR_MIGRATE_PARAM_COMPRESSION_ ## PARAM; \
- \
-if ((rc = virTypedParamsGet ## TYPE(params, nparams, \
-par, >VALUE)) < 0) \
-goto error; \
- \
-if (rc == 1) \
-compression->VALUE ## _set = true; \
-} while (0)
-
-if (params) {
-GET_PARAM(MT_LEVEL, Int, level);
-GET_PARAM(MT_THREADS, Int, threads);
-GET_PARAM(MT_DTHREADS, Int, dthreads);
-GET_PARAM(XBZRLE_CACHE, ULLong, xbzrle_cache);
-}
-
-#undef GET_PARAM
-
-if ((compression->level_set ||
- compression->threads_set ||
- compression->dthreads_set) &&
-!(compression->methods & (1ULL << QEMU_MIGRATION_COMPRESS_MT))) {
-virReportError(VIR_ERR_INVALID_ARG, "%s",
-   _("Turn multithread compression on to tune it"));
-goto error;
-}
-
-if (compression->xbzrle_cache_set &&
-!(compression->methods & (1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE))) {
-virReportError(VIR_ERR_INVALID_ARG, "%s",
-   _("Turn xbzrle compression on to tune it"));
-goto error;
-}
-
-if (!compression->methods && (flags & VIR_MIGRATE_COMPRESSED))
-compression->methods = 1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE;
-
-return compression;
-
- error:
-VIR_FREE(compression);
-return NULL;
-}
-
-int
-qemuMigrationAnyCompressionDump(qemuMigrationCompressionPtr compression,
-virTypedParameterPtr *params,
-int *nparams,
-int *maxparams,
-unsigned long *flags)
-{
-size_t i;
-
-if (compression->methods == 1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE &&
-!compression->xbzrle_cache_set) {
-*flags |= VIR_MIGRATE_COMPRESSED;
-return 0;
-}
-
-for (i = 0; i < QEMU_MIGRATION_COMPRESS_LAST; ++i) {
-if ((compression->methods & (1ULL << i)) &&
-virTypedParamsAddString(params, nparams, maxparams,
-VIR_MIGRATE_PARAM_COMPRESSION,
-
qemuMigrationCompressMethodTypeToString(i)) < 0)
-return -1;
-}
-
-if (compression->level_set &&
-virTypedParamsAddInt(params, nparams, maxparams,
- VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,
- compression->level) < 0)
-return -1;
-
-if (compression->threads_set &&
-virTypedParamsAddInt(params, nparams, maxparams,
- VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,
- compression->threads) < 0)
-return 

[libvirt] [PATCH v2 25/73] qemu: Introduce qemuMonitorSetMigrationCapabilities

2018-04-11 Thread Jiri Denemark
Our current monitor API forces the caller to call
migrate-set-capabilities QMP command for each capability separately,
which is quite suboptimal. Let's add a new API for setting all
capabilities at once.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_monitor.c  | 19 +++
 src/qemu/qemu_monitor.h  |  3 ++
 src/qemu/qemu_monitor_json.c | 63 
 src/qemu/qemu_monitor_json.h |  3 ++
 4 files changed, 88 insertions(+)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 7b647525b3..7ea72af788 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3991,6 +3991,25 @@ qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
 }
 
 
+int
+qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon,
+virBitmapPtr caps,
+virBitmapPtr states)
+{
+char *capsStr = virBitmapFormat(caps);
+char *statesStr = virBitmapFormat(states);
+
+VIR_DEBUG("caps=%s, states=%s", NULLSTR(capsStr), NULLSTR(statesStr));
+
+VIR_FREE(capsStr);
+VIR_FREE(statesStr);
+
+QEMU_CHECK_MONITOR_JSON(mon);
+
+return qemuMonitorJSONSetMigrationCapabilities(mon, caps, states);
+}
+
+
 /**
  * qemuMonitorGetGICCapabilities:
  * @mon: QEMU monitor
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index d04148e568..870aae5cbd 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -763,6 +763,9 @@ int qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon,
 int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
   qemuMonitorMigrationCaps capability,
   bool state);
+int qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon,
+virBitmapPtr caps,
+virBitmapPtr states);
 
 int qemuMonitorGetGICCapabilities(qemuMonitorPtr mon,
   virGICCapability **capabilities);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 57c2c4de0f..7ab73657a0 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -6251,6 +6251,69 @@ qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon,
 }
 
 
+int
+qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon,
+virBitmapPtr caps,
+virBitmapPtr states)
+{
+int ret = -1;
+qemuMonitorMigrationCaps bit;
+virJSONValuePtr cmd = NULL;
+virJSONValuePtr reply = NULL;
+virJSONValuePtr cap = NULL;
+virJSONValuePtr array;
+
+if (!(array = virJSONValueNewArray()))
+goto cleanup;
+
+for (bit = 0; bit < QEMU_MONITOR_MIGRATION_CAPS_LAST; bit++) {
+bool supported = false;
+bool state = false;
+
+ignore_value(virBitmapGetBit(caps, bit, ));
+if (!supported)
+continue;
+
+ignore_value(virBitmapGetBit(states, bit, ));
+
+if (!(cap = virJSONValueNewObject()))
+goto cleanup;
+
+if (virJSONValueObjectAppendString(cap, "capability",
+   
qemuMonitorMigrationCapsTypeToString(bit)) < 0)
+goto cleanup;
+
+if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0)
+goto cleanup;
+
+if (virJSONValueArrayAppend(array, cap) < 0)
+goto cleanup;
+
+cap = NULL;
+}
+
+cmd = qemuMonitorJSONMakeCommand("migrate-set-capabilities",
+ "a:capabilities", ,
+ NULL);
+if (!cmd)
+goto cleanup;
+
+if (qemuMonitorJSONCommand(mon, cmd, ) < 0)
+goto cleanup;
+
+if (qemuMonitorJSONCheckError(cmd, reply) < 0)
+goto cleanup;
+
+ret = 0;
+ cleanup:
+virJSONValueFree(array);
+virJSONValueFree(cap);
+virJSONValueFree(cmd);
+virJSONValueFree(reply);
+return ret;
+}
+
+
 /**
  * qemuMonitorJSONGetGICCapabilities:
  * @mon: QEMU JSON monitor
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 045df4919f..76e6738f44 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -148,6 +148,9 @@ int qemuMonitorJSONGetMigrationCapabilities(qemuMonitorPtr 
mon,
 int qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon,
   qemuMonitorMigrationCaps capability,
   bool state);
+int qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon,
+virBitmapPtr caps,
+virBitmapPtr states);
 
 int qemuMonitorJSONGetGICCapabilities(qemuMonitorPtr mon,
   virGICCapability **capabilities);
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com

[libvirt] [PATCH v2 49/73] qemu: Limit usage of qemuMonitorMigrationParams

2018-04-11 Thread Jiri Denemark
Use this internal structure only in qemu_migration_params.c and change
other non-test users to use the high level qemuMigrationParams struct.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   | 26 +++---
 src/qemu/qemu_migration_params.c | 16 
 src/qemu/qemu_migration_params.h |  4 
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 8e880280ec..761f84ee7f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13555,8 +13555,7 @@ qemuDomainMigrateGetMaxDowntime(virDomainPtr dom,
 {
 virQEMUDriverPtr driver = dom->conn->privateData;
 virDomainObjPtr vm;
-qemuDomainObjPrivatePtr priv;
-qemuMonitorMigrationParams migparams = { 0 };
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(0, -1);
@@ -13576,27 +13575,24 @@ qemuDomainMigrateGetMaxDowntime(virDomainPtr dom,
 goto endjob;
 }
 
-priv = vm->privateData;
-qemuDomainObjEnterMonitor(driver, vm);
+if (qemuMigrationParamsFetch(driver, vm, QEMU_ASYNC_JOB_NONE,
+ ) < 0)
+goto endjob;
 
-if (qemuMonitorGetMigrationParams(priv->mon, ) == 0) {
-if (migparams.downtimeLimit_set) {
-*downtime = migparams.downtimeLimit;
-ret = 0;
-} else {
-virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-   _("Querying migration downtime is not supported by "
- "QEMU binary"));
-}
+if (qemuMigrationParamsGetDowntimeLimit(migParams, downtime) == 1) {
+virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+   _("Querying migration downtime is not supported by "
+ "QEMU binary"));
+goto endjob;
 }
 
-if (qemuDomainObjExitMonitor(driver, vm) < 0)
-ret = -1;
+ret = 0;
 
  endjob:
 qemuDomainObjEndJob(driver, vm);
 
  cleanup:
+qemuMigrationParamsFree(migParams);
 virDomainObjEndAPI();
 return ret;
 }
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 94de0458f5..cadb402b0f 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -553,6 +553,22 @@ qemuMigrationParamsFetch(virQEMUDriverPtr driver,
 }
 
 
+/**
+ * Returns  0 on success,
+ *  1 if the parameter is not supported by QEMU.
+ */
+int
+qemuMigrationParamsGetDowntimeLimit(qemuMigrationParamsPtr migParams,
+unsigned long long *value)
+{
+if (!migParams->params.downtimeLimit_set)
+return 1;
+
+*value = migParams->params.downtimeLimit;
+return 0;
+}
+
+
 /**
  * qemuMigrationParamsCheck:
  *
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 0a30dcd623..cc9a14601b 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -79,6 +79,10 @@ qemuMigrationParamsFetch(virQEMUDriverPtr driver,
  int asyncJob,
  qemuMigrationParamsPtr *migParams);
 
+int
+qemuMigrationParamsGetDowntimeLimit(qemuMigrationParamsPtr migParams,
+unsigned long long *value);
+
 int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 26/73] qemu: Set migration caps via migration params APIs

2018-04-11 Thread Jiri Denemark
Migration capabilities are closely related to migration parameters and
it makes sense to keep them in a single data structure. Similarly to
migration parameters the capabilities are all send to QEMU at once in
qemuMigrationParamsApply, all other APIs operate on the
qemuMigrationParams structure.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 100 ++-
 src/qemu/qemu_migration.h|   7 ---
 src/qemu/qemu_migration_params.c |  99 +++---
 src/qemu/qemu_migration_params.h |  11 
 4 files changed, 107 insertions(+), 110 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 602ccdfdd5..e01c2a209d 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1174,66 +1174,6 @@ qemuMigrationAnyPostcopyFailed(virQEMUDriverPtr driver,
 }
 
 
-int
-qemuMigrationOptionSet(virQEMUDriverPtr driver,
-   virDomainObjPtr vm,
-   qemuMonitorMigrationCaps capability,
-   bool state,
-   qemuDomainAsyncJob job)
-{
-qemuDomainObjPrivatePtr priv = vm->privateData;
-int ret;
-
-if (!qemuMigrationCapsGet(vm, capability)) {
-if (!state) {
-/* Unsupported but we want it off anyway */
-return 0;
-}
-
-if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
-virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
-   _("Migration option '%s' is not supported by "
- "target QEMU binary"),
-   qemuMonitorMigrationCapsTypeToString(capability));
-} else {
-virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
-   _("Migration option '%s' is not supported by "
- "source QEMU binary"),
-   qemuMonitorMigrationCapsTypeToString(capability));
-}
-return -1;
-}
-
-if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
-return -1;
-
-ret = qemuMonitorSetMigrationCapability(priv->mon, capability, state);
-
-if (qemuDomainObjExitMonitor(driver, vm) < 0)
-ret = -1;
-
-return ret;
-}
-
-
-static int
-qemuMigrationOptionSetPostCopy(virQEMUDriverPtr driver,
-   virDomainObjPtr vm,
-   bool state,
-   qemuDomainAsyncJob job)
-{
-qemuDomainObjPrivatePtr priv = vm->privateData;
-
-if (qemuMigrationOptionSet(driver, vm,
-   QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
-   state, job) < 0)
-return -1;
-
-priv->job.postcopyEnabled = state;
-return 0;
-}
-
-
 static int
 qemuMigrationSrcWaitForSpice(virDomainObjPtr vm)
 {
@@ -2465,15 +2405,14 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 goto stopjob;
 }
 
-if (qemuMigrationOptionSet(driver, vm,
-   QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
-   flags & VIR_MIGRATE_RDMA_PIN_ALL,
-   QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+if (qemuMigrationParamsSetCapability(vm,
+ 
QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
+ flags & VIR_MIGRATE_RDMA_PIN_ALL,
+ migParams) < 0)
 goto stopjob;
 
-if (qemuMigrationOptionSetPostCopy(driver, vm,
-   flags & VIR_MIGRATE_POSTCOPY,
-   QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+if (qemuMigrationParamsSetPostCopy(vm, flags & VIR_MIGRATE_POSTCOPY,
+   migParams) < 0)
 goto stopjob;
 
 if (qemuMigrationParamsApply(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
@@ -3448,27 +3387,26 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
   compression, migParams) < 0)
 goto error;
 
-if (qemuMigrationOptionSet(driver, vm,
-   QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
-   flags & VIR_MIGRATE_AUTO_CONVERGE,
-   QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+if (qemuMigrationParamsSetCapability(vm,
+ 
QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
+ flags & VIR_MIGRATE_AUTO_CONVERGE,
+ migParams) < 0)
 goto error;
 
-if (qemuMigrationOptionSet(driver, vm,
-   QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
-   flags & VIR_MIGRATE_RDMA_PIN_ALL,
-   QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+if (qemuMigrationParamsSetCapability(vm,
+ 

[libvirt] [PATCH v2 42/73] qemu: Drop qemuMigrationParamsSetCapability

2018-04-11 Thread Jiri Denemark
It's become only a tiny wrapper around virBitmapSetBit, which can easily
be called directly. We don't need to call virBitmapClearBit since
migParams->caps bitmap is initialized with zeros.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 35 +++-
 1 file changed, 7 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index e0cbdb1a38..262825972c 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -229,21 +229,6 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 }
 
 
-static int
-qemuMigrationParamsSetCapability(virDomainObjPtr vm ATTRIBUTE_UNUSED,
- qemuMonitorMigrationCaps capability,
- bool state,
- qemuMigrationParamsPtr migParams)
-{
-if (state)
-ignore_value(virBitmapSetBit(migParams->caps, capability));
-else
-ignore_value(virBitmapClearBit(migParams->caps, capability));
-
-return 0;
-}
-
-
 /* qemuMigrationParamsEnableTLS
  * @driver: pointer to qemu driver
  * @vm: domain object
@@ -358,23 +343,17 @@ qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
 
 
 int
-qemuMigrationParamsSetCompression(virDomainObjPtr vm,
+qemuMigrationParamsSetCompression(virDomainObjPtr vm ATTRIBUTE_UNUSED,
   qemuMigrationCompressionPtr compression,
   qemuMigrationParamsPtr migParams)
 {
-if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_XBZRLE,
- compression->methods &
- (1ULL << 
QEMU_MIGRATION_COMPRESS_XBZRLE),
- migParams) < 0)
-return -1;
+if (compression->methods & (1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE))
+ignore_value(virBitmapSetBit(migParams->caps,
+ QEMU_MONITOR_MIGRATION_CAPS_XBZRLE));
 
-if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
- compression->methods &
- (1ULL << QEMU_MIGRATION_COMPRESS_MT),
- migParams) < 0)
-return -1;
+if (compression->methods & (1ULL << QEMU_MIGRATION_COMPRESS_MT))
+ignore_value(virBitmapSetBit(migParams->caps,
+ QEMU_MONITOR_MIGRATION_CAPS_COMPRESS));
 
 migParams->params.compressLevel_set = compression->level_set;
 migParams->params.compressLevel = compression->level;
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 13/73] qemu: Store original migration params in job

2018-04-11 Thread Jiri Denemark
Any job which touches migration parameters will first store their
original values (i.e., QEMU defaults) to qemuDomainJobObj to make it
easier to reset them back once the job finishes.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c   |  3 +++
 src/qemu/qemu_domain.h   |  3 +++
 src/qemu/qemu_migration.c|  9 
 src/qemu/qemu_migration_params.c | 38 
 src/qemu/qemu_migration_params.h |  5 +
 5 files changed, 58 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 84476de11b..78f5dc360c 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -336,6 +336,8 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
 job->dumpCompleted = false;
 VIR_FREE(job->error);
 VIR_FREE(job->current);
+qemuMigrationParamsFree(job->migParams);
+job->migParams = NULL;
 }
 
 void
@@ -350,6 +352,7 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj,
 job->asyncJob = priv->job.asyncJob;
 job->asyncOwner = priv->job.asyncOwner;
 job->phase = priv->job.phase;
+VIR_STEAL_PTR(job->migParams, priv->job.migParams);
 
 qemuDomainObjResetJob(priv);
 qemuDomainObjResetAsyncJob(priv);
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 415b2ca093..1828b64284 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -34,6 +34,7 @@
 # include "qemu_agent.h"
 # include "qemu_conf.h"
 # include "qemu_capabilities.h"
+# include "qemu_migration_params.h"
 # include "virmdev.h"
 # include "virchrdev.h"
 # include "virobject.h"
@@ -177,6 +178,8 @@ struct qemuDomainJobObj {
 bool postcopyEnabled;   /* post-copy migration was enabled */
 char *error;/* job event completion error */
 bool dumpCompleted; /* dump completed */
+
+qemuMigrationParamsPtr migParams;
 };
 
 typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index b7ef535b5d..96ca5593cf 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2448,6 +2448,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 dataFD[1] = -1; /* 'st' owns the FD now & will close it */
 }
 
+if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+goto stopjob;
+
 if (qemuMigrationParamsSetCompression(driver, vm, 
QEMU_ASYNC_JOB_MIGRATION_IN,
   compression, migParams) < 0)
 goto stopjob;
@@ -4597,6 +4600,9 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
 
 qemuMigrationSrcStoreDomainState(vm);
 
+if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+goto endjob;
+
 if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
 ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, 
persist_xml,
dconnuri, uri, graphicsuri, 
listenAddress,
@@ -4700,6 +4706,9 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
 virCloseCallbacksUnset(driver->closeCallbacks, vm,
qemuMigrationSrcCleanup);
 
+if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+goto endjob;
+
 ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, 
cookiein, cookieinlen,
 cookieout, cookieoutlen,
 flags, resource, NULL, graphicsuri,
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 3a1816c2b9..465132fd9c 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -428,6 +428,44 @@ qemuMigrationParamsResetTLS(virQEMUDriverPtr driver,
 }
 
 
+/**
+ * qemuMigrationParamsCheck:
+ *
+ * Check supported migration parameters and keep their original values in
+ * qemuDomainJobObj so that we can properly reset them at the end of migration.
+ */
+int
+qemuMigrationParamsCheck(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob)
+{
+qemuDomainObjPrivatePtr priv = vm->privateData;
+qemuMigrationParamsPtr origParams = NULL;
+int ret = -1;
+
+if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+return -1;
+
+if (!(origParams = qemuMigrationParamsNew()))
+goto cleanup;
+
+if (qemuMonitorGetMigrationParams(priv->mon, >params) < 0)
+goto cleanup;
+
+ret = 0;
+
+ cleanup:
+if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ret = -1;
+
+if (ret == 0)
+VIR_STEAL_PTR(priv->job.migParams, origParams);
+qemuMigrationParamsFree(origParams);
+
+return ret;
+}
+
+
 /*
  * qemuMigrationParamsReset:
  *
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 57b7dd..c283a81b51 100644

[libvirt] [PATCH v2 01/73] qemu: Rename qemuMigrationAnyCapsGet as qemuMigrationCapsGet

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
Reviewed-by: Ján Tomko 
---
 src/qemu/qemu_driver.c|  4 ++--
 src/qemu/qemu_migration.c | 10 +-
 src/qemu/qemu_migration.h |  4 ++--
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5c31dfdd58..cc431ae045 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13615,7 +13615,7 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
 
 priv = vm->privateData;
 
-if (!qemuMigrationAnyCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
+if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
 virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("Compressed migration is not supported by "
  "QEMU binary"));
@@ -13666,7 +13666,7 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
 
 priv = vm->privateData;
 
-if (!qemuMigrationAnyCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
+if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
 virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("Compressed migration is not supported by "
  "QEMU binary"));
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 256b994bd9..3890a29d7e 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1335,7 +1335,7 @@ qemuMigrationOptionSet(virQEMUDriverPtr driver,
 qemuDomainObjPrivatePtr priv = vm->privateData;
 int ret;
 
-if (!qemuMigrationAnyCapsGet(vm, capability)) {
+if (!qemuMigrationCapsGet(vm, capability)) {
 if (!state) {
 /* Unsupported but we want it off anyway */
 return 0;
@@ -3869,7 +3869,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
 goto error;
 
-if (qemuMigrationAnyCapsGet(vm, 
QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER) &&
+if (qemuMigrationCapsGet(vm, 
QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER) &&
 qemuMigrationOptionSet(driver, vm,

QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
true, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
@@ -6095,7 +6095,7 @@ qemuMigrationParamsReset(virQEMUDriverPtr driver,
 goto cleanup;
 
 for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
-if (qemuMigrationAnyCapsGet(vm, cap) &&
+if (qemuMigrationCapsGet(vm, cap) &&
 qemuMigrationOptionSet(driver, vm, cap, false, job) < 0)
 goto cleanup;
 }
@@ -6160,8 +6160,8 @@ qemuMigrationSrcFetchMirrorStats(virQEMUDriverPtr driver,
 
 
 bool
-qemuMigrationAnyCapsGet(virDomainObjPtr vm,
-qemuMonitorMigrationCaps cap)
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 bool enabled = false;
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index a075aec124..af96854a73 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -309,7 +309,7 @@ qemuMigrationSrcFetchMirrorStats(virQEMUDriverPtr driver,
  qemuDomainJobInfoPtr jobInfo);
 
 bool
-qemuMigrationAnyCapsGet(virDomainObjPtr vm,
-qemuMonitorMigrationCaps cap);
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap);
 
 #endif /* __QEMU_MIGRATION_H__ */
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v2 16/73] qemu: Reset all migration parameters

2018-04-11 Thread Jiri Denemark
Restore the original values of all migration parameters we store in
qemuDomainJobObj instead of explicitly resting only a limited set of
them.

The result is not strictly equivalent to the previous code wrt reseting
TLS state because the previous code would only reset it if we changed it
before while the new code will reset it always if QEMU supports TLS
migration. This is not a problem for the parameters themselves, but it
can cause spurious errors about missing TLS objects being logged at the
end of non-TLS migration. This issue will be fixed ~50 patches later.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 20 +
 src/qemu/qemu_migration_params.c | 48 +++-
 src/qemu/qemu_migration_params.h |  3 +-
 src/qemu/qemu_process.c  |  4 +--
 4 files changed, 34 insertions(+), 41 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 96ca5593cf..72fcae77f4 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1834,7 +1834,8 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm,
 VIR_WARN("Migration of domain %s finished but we don't know if the"
  " domain was successfully started on destination or not",
  vm->def->name);
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ priv->job.migParams);
 /* clear the job and let higher levels decide what to do */
 qemuDomainObjDiscardAsyncJob(driver, vm);
 break;
@@ -2593,7 +2594,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 return ret;
 
  stopjob:
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
+ priv->job.migParams);
 
 if (stopProcess) {
 unsigned int stopFlags = VIR_QEMU_PROCESS_STOP_MIGRATED;
@@ -2969,7 +2971,8 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver,
 qemuDomainEventQueue(driver, event);
 }
 
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ priv->job.migParams);
 
 if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, 
driver->caps) < 0)
 VIR_WARN("Failed to save status on vm %s", vm->def->name);
@@ -4581,6 +4584,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
 int ret = -1;
 virErrorPtr orig_err = NULL;
 virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+qemuDomainObjPrivatePtr priv = vm->privateData;
 
 if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
 goto cleanup;
@@ -4641,7 +4645,8 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
  * here
  */
 if (!v3proto && ret < 0)
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ priv->job.migParams);
 
 if (qemuMigrationSrcRestoreDomainState(driver, vm)) {
 event = virDomainEventLifecycleNewFromObj(vm,
@@ -4691,6 +4696,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
  unsigned long flags,
  unsigned long resource)
 {
+qemuDomainObjPrivatePtr priv = vm->privateData;
 virObjectEventPtr event = NULL;
 int ret = -1;
 
@@ -4731,7 +4737,8 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
 
  endjob:
 if (ret < 0) {
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ priv->job.migParams);
 qemuMigrationJobFinish(driver, vm);
 } else {
 qemuMigrationJobContinue(vm);
@@ -5187,7 +5194,8 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
 VIR_FREE(priv->job.completed);
 }
 
-qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN);
+qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
+ priv->job.migParams);
 
 qemuMigrationJobFinish(driver, vm);
 if (!virDomainObjIsActive(vm))
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 465132fd9c..72836ba9fa 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -378,30 +378,19 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
  *
  * Deconstruct all the setup possibly done for TLS - delete the TLS and
  * security objects, free the secinfo, and reset the migration params to "".
- *
- * Returns 0 on success, -1 on failure
  */
-static int
+static void
 

[libvirt] [PATCH v2 21/73] qemu: Set tlsHostname inside qemuMigrationParamsEnableTLS

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 31 ---
 src/qemu/qemu_migration_params.c |  9 +++--
 src/qemu/qemu_migration_params.h |  1 +
 3 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 9a9a881f9b..c2cd937743 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2454,13 +2454,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 cfg = virQEMUDriverGetConfig(driver);
 if (qemuMigrationParamsEnableTLS(driver, vm, cfg, true,
  QEMU_ASYNC_JOB_MIGRATION_IN,
- , , migParams) < 0)
+ , , NULL,
+ migParams) < 0)
 goto stopjob;
-
-/* Force reset of 'tls-hostname', it's a source only parameter */
-if (VIR_STRDUP(migParams->params.tlsHostname, "") < 0)
-goto stopjob;
-
 } else {
 if (qemuMigrationParamsDisableTLS(vm, migParams) < 0)
 goto stopjob;
@@ -3406,23 +3402,20 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 VIR_WARN("unable to provide data for graphics client relocation");
 
 if (flags & VIR_MIGRATE_TLS) {
-cfg = virQEMUDriverGetConfig(driver);
-if (qemuMigrationParamsEnableTLS(driver, vm, cfg, false,
- QEMU_ASYNC_JOB_MIGRATION_OUT,
- , , migParams) < 0)
-goto error;
+const char *hostname = NULL;
 
 /* We need to add tls-hostname whenever QEMU itself does not
  * connect directly to the destination. */
 if (spec->destType == MIGRATION_DEST_CONNECT_HOST ||
-spec->destType == MIGRATION_DEST_FD) {
-if (VIR_STRDUP(migParams->params.tlsHostname, 
spec->dest.host.name) < 0)
-goto error;
-} else {
-/* Be sure there's nothing from a previous migration */
-if (VIR_STRDUP(migParams->params.tlsHostname, "") < 0)
-goto error;
-}
+spec->destType == MIGRATION_DEST_FD)
+hostname = spec->dest.host.name;
+
+cfg = virQEMUDriverGetConfig(driver);
+if (qemuMigrationParamsEnableTLS(driver, vm, cfg, false,
+ QEMU_ASYNC_JOB_MIGRATION_OUT,
+ , , hostname,
+ migParams) < 0)
+goto error;
 } else {
 if (qemuMigrationParamsDisableTLS(vm, migParams) < 0)
 goto error;
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index bb3bbc30f3..476687aae2 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -141,9 +141,12 @@ qemuMigrationParamsSet(virQEMUDriverPtr driver,
  * @asyncJob: Migration job to join
  * @tlsAlias: alias to be generated for TLS object
  * @secAlias: alias to be generated for a secinfo object
+ * @hostname: hostname of the migration destination
  * @migParams: migration parameters to set
  *
- * Create the TLS objects for the migration and set the migParams value
+ * Create the TLS objects for the migration and set the migParams value.
+ * If QEMU itself does not connect to the destination @hostname must be
+ * provided for certificate verification.
  *
  * Returns 0 on success, -1 on failure
  */
@@ -155,6 +158,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
  int asyncJob,
  char **tlsAlias,
  char **secAlias,
+ const char *hostname,
  qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -198,7 +202,8 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
 *tlsAlias, ) < 0)
 goto error;
 
-if (VIR_STRDUP(migParams->params.tlsCreds, *tlsAlias) < 0)
+if (VIR_STRDUP(migParams->params.tlsCreds, *tlsAlias) < 0 ||
+VIR_STRDUP(migParams->params.tlsHostname, hostname ? hostname : "") < 
0)
 goto error;
 
 return 0;
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 6f3fb67949..6535c3af47 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -79,6 +79,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
  int asyncJob,
  char **tlsAlias,
  char **secAlias,
+ const char *hostname,
  qemuMigrationParamsPtr migParams);
 
 int
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 03/73] qemu: New file for all APIs related to migration parameters

2018-04-11 Thread Jiri Denemark
In the end, this will allow us to have most of the logic around
migration parameters and capabilities done in one place.

Signed-off-by: Jiri Denemark 
---
 po/POTFILES.in   |   1 +
 src/qemu/Makefile.inc.am |   2 +
 src/qemu/qemu_driver.c   |   1 +
 src/qemu/qemu_migration.c| 421 +---
 src/qemu/qemu_migration.h|  24 +-
 src/qemu/qemu_migration_params.c | 454 +++
 src/qemu/qemu_migration_params.h |  82 ++
 src/qemu/qemu_process.c  |   1 +
 8 files changed, 550 insertions(+), 436 deletions(-)
 create mode 100644 src/qemu/qemu_migration_params.c
 create mode 100644 src/qemu/qemu_migration_params.h

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 0dcd1cab28..be2874487c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -136,6 +136,7 @@ src/qemu/qemu_hotplug.c
 src/qemu/qemu_interface.c
 src/qemu/qemu_migration.c
 src/qemu/qemu_migration_cookie.c
+src/qemu/qemu_migration_params.c
 src/qemu/qemu_monitor.c
 src/qemu/qemu_monitor_json.c
 src/qemu/qemu_monitor_text.c
diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am
index 8ef290a6c1..25706ba4bc 100644
--- a/src/qemu/Makefile.inc.am
+++ b/src/qemu/Makefile.inc.am
@@ -33,6 +33,8 @@ QEMU_DRIVER_SOURCES = \
qemu/qemu_migration.h \
qemu/qemu_migration_cookie.c \
qemu/qemu_migration_cookie.h \
+qemu/qemu_migration_params.c \
+qemu/qemu_migration_params.h \
qemu/qemu_monitor.c \
qemu/qemu_monitor.h \
qemu/qemu_monitor_text.c \
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f7ad211077..519bd767c1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -57,6 +57,7 @@
 #include "qemu_monitor.h"
 #include "qemu_process.h"
 #include "qemu_migration.h"
+#include "qemu_migration_params.h"
 #include "qemu_blockjob.h"
 #include "qemu_security.h"
 
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index a0071cc089..34eb3eb9e5 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -29,6 +29,7 @@
 
 #include "qemu_migration.h"
 #include "qemu_migration_cookie.h"
+#include "qemu_migration_params.h"
 #include "qemu_monitor.h"
 #include "qemu_domain.h"
 #include "qemu_process.h"
@@ -81,8 +82,6 @@ VIR_ENUM_IMPL(qemuMigrationCompressMethod, 
QEMU_MIGRATION_COMPRESS_LAST,
   "mt",
 );
 
-#define QEMU_MIGRATION_TLS_ALIAS_BASE "libvirt_migrate"
-
 static int
 qemuMigrationJobStart(virQEMUDriverPtr driver,
   virDomainObjPtr vm,
@@ -115,156 +114,6 @@ qemuMigrationJobFinish(virQEMUDriverPtr driver,
virDomainObjPtr obj)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
-/* qemuMigrationParamsCheckTLSCreds
- * @driver: pointer to qemu driver
- * @vm: domain object
- * @asyncJob: migration job to join
- *
- * Query the migration parameters looking for the 'tls-creds' parameter.
- * If found, then we can support setting or clearing the parameters and thus
- * can support TLS for migration.
- *
- * Returns 0 if we were able to successfully fetch the params and
- * additionally if the tls-creds parameter exists, saves it in the
- * private domain structure. Returns -1 on failure.
- */
-static int
-qemuMigrationParamsCheckTLSCreds(virQEMUDriverPtr driver,
- virDomainObjPtr vm,
- qemuDomainAsyncJob asyncJob)
-{
-int ret = -1;
-qemuDomainObjPrivatePtr priv = vm->privateData;
-qemuMonitorMigrationParams migParams = { 0 };
-
-if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
-return -1;
-
-if (qemuMonitorGetMigrationParams(priv->mon, ) < 0)
-goto cleanup;
-
-/* NB: Could steal NULL pointer too! Let caller decide what to do. */
-VIR_STEAL_PTR(priv->migTLSAlias, migParams.tlsCreds);
-
-ret = 0;
-
- cleanup:
-if (qemuDomainObjExitMonitor(driver, vm) < 0)
-ret = -1;
-
-qemuMigrationParamsClear();
-
-return ret;
-}
-
-
-/* qemuMigrationParamsCheckSetupTLS
- * @driver: pointer to qemu driver
- * @vm: domain object
- * @cfg: configuration pointer
- * @asyncJob: migration job to join
- *
- * Check if TLS is possible and set up the environment. Assumes the caller
- * desires to use TLS (e.g. caller found VIR_MIGRATE_TLS flag).
- *
- * Ensure the qemu.conf has been properly configured to add an entry for
- * "migrate_tls_x509_cert_dir". Also check if the "tls-creds" parameter
- * was present from a query of migration parameters
- *
- * Returns 0 on success, -1 on error/failure
- */
-static int
-qemuMigrationParamsCheckSetupTLS(virQEMUDriverPtr driver,
- virQEMUDriverConfigPtr cfg,
- virDomainObjPtr vm,
- qemuDomainAsyncJob asyncJob)
-{
-qemuDomainObjPrivatePtr priv = vm->privateData;
-
-if (!cfg->migrateTLSx509certdir) {
-

[libvirt] [PATCH v2 14/73] qemu: Typedef struct qemuDomainJobObj

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c  | 6 +++---
 src/qemu/qemu_domain.h  | 8 +---
 src/qemu/qemu_process.c | 4 ++--
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 78f5dc360c..e997c14aad 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -309,7 +309,7 @@ qemuDomainObjInitJob(qemuDomainObjPrivatePtr priv)
 static void
 qemuDomainObjResetJob(qemuDomainObjPrivatePtr priv)
 {
-struct qemuDomainJobObj *job = >job;
+qemuDomainJobObjPtr job = >job;
 
 job->active = QEMU_JOB_NONE;
 job->owner = 0;
@@ -320,7 +320,7 @@ qemuDomainObjResetJob(qemuDomainObjPrivatePtr priv)
 static void
 qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
 {
-struct qemuDomainJobObj *job = >job;
+qemuDomainJobObjPtr job = >job;
 
 job->asyncJob = QEMU_ASYNC_JOB_NONE;
 job->asyncOwner = 0;
@@ -342,7 +342,7 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
 
 void
 qemuDomainObjRestoreJob(virDomainObjPtr obj,
-struct qemuDomainJobObj *job)
+qemuDomainJobObjPtr job)
 {
 qemuDomainObjPrivatePtr priv = obj->privateData;
 
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 1828b64284..2c474ae4a4 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -154,7 +154,9 @@ struct _qemuDomainJobInfo {
 qemuDomainMirrorStats mirrorStats;
 };
 
-struct qemuDomainJobObj {
+typedef struct _qemuDomainJobObj qemuDomainJobObj;
+typedef qemuDomainJobObj *qemuDomainJobObjPtr;
+struct _qemuDomainJobObj {
 virCond cond;   /* Use to coordinate jobs */
 qemuDomainJob active;   /* Currently running job */
 unsigned long long owner;   /* Thread id which set current job */
@@ -254,7 +256,7 @@ typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
 struct _qemuDomainObjPrivate {
 virQEMUDriverPtr driver;
 
-struct qemuDomainJobObj job;
+qemuDomainJobObj job;
 
 virBitmapPtr namespaces;
 
@@ -513,7 +515,7 @@ void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
 void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
   unsigned long long allowedJobs);
 void qemuDomainObjRestoreJob(virDomainObjPtr obj,
- struct qemuDomainJobObj *job);
+ qemuDomainJobObjPtr job);
 void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
   virDomainObjPtr obj);
 void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 11276dace9..dd97cd7e7d 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3186,7 +3186,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
 static int
 qemuProcessRecoverJob(virQEMUDriverPtr driver,
   virDomainObjPtr vm,
-  const struct qemuDomainJobObj *job,
+  const qemuDomainJobObj *job,
   unsigned int *stopFlags)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -7262,7 +7262,7 @@ qemuProcessReconnect(void *opaque)
 virQEMUDriverPtr driver = data->driver;
 virDomainObjPtr obj = data->obj;
 qemuDomainObjPrivatePtr priv;
-struct qemuDomainJobObj oldjob;
+qemuDomainJobObj oldjob;
 int state;
 int reason;
 virQEMUDriverConfigPtr cfg;
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 15/73] qemu: Pass job object to qemuProcessRecoverMigration{In, Out}

2018-04-11 Thread Jiri Denemark
Currently, only job->phase is passed and both APIs will need to look at
more details about the job.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_process.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index dd97cd7e7d..fd81933f2e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3034,7 +3034,7 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, 
virDomainObjPtr vm)
 static int
 qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
   virDomainObjPtr vm,
-  qemuMigrationJobPhase phase,
+  const qemuDomainJobObj *job,
   virDomainState state,
   int reason)
 {
@@ -3043,7 +3043,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
 (state == VIR_DOMAIN_RUNNING &&
  reason == VIR_DOMAIN_RUNNING_POSTCOPY);
 
-switch (phase) {
+switch ((qemuMigrationJobPhase) job->phase) {
 case QEMU_MIGRATION_PHASE_NONE:
 case QEMU_MIGRATION_PHASE_PERFORM2:
 case QEMU_MIGRATION_PHASE_BEGIN3:
@@ -3092,7 +3092,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
 static int
 qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
virDomainObjPtr vm,
-   qemuMigrationJobPhase phase,
+   const qemuDomainJobObj *job,
virDomainState state,
int reason,
unsigned int *stopFlags)
@@ -3102,7 +3102,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
  reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED);
 bool resume = false;
 
-switch (phase) {
+switch ((qemuMigrationJobPhase) job->phase) {
 case QEMU_MIGRATION_PHASE_NONE:
 case QEMU_MIGRATION_PHASE_PREPARE:
 case QEMU_MIGRATION_PHASE_FINISH2:
@@ -3197,13 +3197,13 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver,
 
 switch (job->asyncJob) {
 case QEMU_ASYNC_JOB_MIGRATION_OUT:
-if (qemuProcessRecoverMigrationOut(driver, vm, job->phase,
+if (qemuProcessRecoverMigrationOut(driver, vm, job,
state, reason, stopFlags) < 0)
 return -1;
 break;
 
 case QEMU_ASYNC_JOB_MIGRATION_IN:
-if (qemuProcessRecoverMigrationIn(driver, vm, job->phase,
+if (qemuProcessRecoverMigrationIn(driver, vm, job,
   state, reason) < 0)
 return -1;
 break;
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 33/73] qemu: Check supported caps in qemuMigrationParamsCheck

2018-04-11 Thread Jiri Denemark
Instead of checking each capability at the time we want to set it in
qemuMigrationParamsSetCapability we can check all of them at once in
qemuMigrationParamsCheck.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c|  6 --
 src/qemu/qemu_migration_params.c | 33 ++--
 src/qemu/qemu_migration_params.h |  3 ++-
 3 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 3f443a756b..eb544bbb77 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2398,7 +2398,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
migParams) < 0)
 goto stopjob;
 
-if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
+ migParams) < 0)
 goto stopjob;
 
 /* Migrations using TLS need to add the "tls-creds-x509" object and
@@ -3360,7 +3361,8 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
  true, migParams) < 0)
 goto error;
 
-if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ migParams) < 0)
 goto error;
 
 if (flags & VIR_MIGRATE_TLS) {
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index f29cc9..a7b5ce385e 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -182,23 +182,11 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
 
 
 int
-qemuMigrationParamsSetCapability(virDomainObjPtr vm,
+qemuMigrationParamsSetCapability(virDomainObjPtr vm ATTRIBUTE_UNUSED,
  qemuMonitorMigrationCaps capability,
  bool state,
  qemuMigrationParamsPtr migParams)
 {
-if (!qemuMigrationCapsGet(vm, capability)) {
-if (!state) {
-/* Unsupported but we want it off anyway */
-return 0;
-}
-
-virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
-   _("Migration option '%s' is not supported by QEMU 
binary"),
-   qemuMonitorMigrationCapsTypeToString(capability));
-return -1;
-}
-
 if (state)
 ignore_value(virBitmapSetBit(migParams->caps, capability));
 else
@@ -413,16 +401,33 @@ qemuMigrationParamsResetTLS(virQEMUDriverPtr driver,
  *
  * Check supported migration parameters and keep their original values in
  * qemuDomainJobObj so that we can properly reset them at the end of migration.
+ * Reports an error if any of the currently used capabilities in @migParams
+ * are unsupported by QEMU.
  */
 int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
- int asyncJob)
+ int asyncJob,
+ qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuMigrationParamsPtr origParams = NULL;
+qemuMonitorMigrationCaps cap;
 int ret = -1;
 
+for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
+bool state = false;
+
+ignore_value(virBitmapGetBit(migParams->caps, cap, ));
+
+if (state && !qemuMigrationCapsGet(vm, cap)) {
+virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
+   _("Migration option '%s' is not supported by QEMU 
binary"),
+   qemuMonitorMigrationCapsTypeToString(cap));
+return -1;
+}
+}
+
 if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
 return -1;
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 4cb70f62a4..7ca667a507 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -101,7 +101,8 @@ qemuMigrationParamsSetCompression(virDomainObjPtr vm,
 int
 qemuMigrationParamsCheck(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
- int asyncJob);
+ int asyncJob,
+ qemuMigrationParamsPtr migParams);
 
 void
 qemuMigrationParamsReset(virQEMUDriverPtr driver,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 22/73] qemu: Hide cfg inside qemuMigrationParamsEnableTLS

2018-04-11 Thread Jiri Denemark
There's no real reason for qemuMigrationParamsEnableTLS to require the
callers to pass a valid virQEMUDriverConfigPtr, it can just call
virQEMUDriverGetConfig.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 10 ++
 src/qemu/qemu_migration_params.c | 12 
 src/qemu/qemu_migration_params.h |  1 -
 3 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index c2cd937743..54d9dfa025 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2228,7 +2228,6 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 {
 virDomainObjPtr vm = NULL;
 virObjectEventPtr event = NULL;
-virQEMUDriverConfigPtr cfg = NULL;
 int ret = -1;
 int dataFD[2] = { -1, -1 };
 qemuDomainObjPrivatePtr priv = NULL;
@@ -2451,8 +2450,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 /* Migrations using TLS need to add the "tls-creds-x509" object and
  * set the migration TLS parameters */
 if (flags & VIR_MIGRATE_TLS) {
-cfg = virQEMUDriverGetConfig(driver);
-if (qemuMigrationParamsEnableTLS(driver, vm, cfg, true,
+if (qemuMigrationParamsEnableTLS(driver, vm, true,
  QEMU_ASYNC_JOB_MIGRATION_IN,
  , , NULL,
  migParams) < 0)
@@ -2549,7 +2547,6 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
  cleanup:
 VIR_FREE(tlsAlias);
 VIR_FREE(secAlias);
-virObjectUnref(cfg);
 qemuProcessIncomingDefFree(incoming);
 VIR_FREE(xmlout);
 VIR_FORCE_CLOSE(dataFD[0]);
@@ -3330,7 +3327,6 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 {
 int ret = -1;
 unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
-virQEMUDriverConfigPtr cfg = NULL;
 qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuMigrationCookiePtr mig = NULL;
 char *tlsAlias = NULL;
@@ -3410,8 +3406,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 spec->destType == MIGRATION_DEST_FD)
 hostname = spec->dest.host.name;
 
-cfg = virQEMUDriverGetConfig(driver);
-if (qemuMigrationParamsEnableTLS(driver, vm, cfg, false,
+if (qemuMigrationParamsEnableTLS(driver, vm, false,
  QEMU_ASYNC_JOB_MIGRATION_OUT,
  , , hostname,
  migParams) < 0)
@@ -3649,7 +3644,6 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
  cleanup:
 VIR_FREE(tlsAlias);
 VIR_FREE(secAlias);
-virObjectUnref(cfg);
 VIR_FORCE_CLOSE(fd);
 virDomainDefFree(persistDef);
 qemuMigrationCookieFree(mig);
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 476687aae2..dd8cf68842 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -136,7 +136,6 @@ qemuMigrationParamsSet(virQEMUDriverPtr driver,
 /* qemuMigrationParamsEnableTLS
  * @driver: pointer to qemu driver
  * @vm: domain object
- * @cfg: configuration pointer
  * @tlsListen: server or client
  * @asyncJob: Migration job to join
  * @tlsAlias: alias to be generated for TLS object
@@ -153,7 +152,6 @@ qemuMigrationParamsSet(virQEMUDriverPtr driver,
 int
 qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
- virQEMUDriverConfigPtr cfg,
  bool tlsListen,
  int asyncJob,
  char **tlsAlias,
@@ -164,6 +162,8 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
 qemuDomainObjPrivatePtr priv = vm->privateData;
 virJSONValuePtr tlsProps = NULL;
 virJSONValuePtr secProps = NULL;
+virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+int ret = -1;
 
 if (!cfg->migrateTLSx509certdir) {
 virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -206,12 +206,16 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
 VIR_STRDUP(migParams->params.tlsHostname, hostname ? hostname : "") < 
0)
 goto error;
 
-return 0;
+ret = 0;
+
+ cleanup:
+virObjectUnref(cfg);
+return ret;
 
  error:
 virJSONValueFree(tlsProps);
 virJSONValueFree(secProps);
-return -1;
+goto cleanup;
 }
 
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 6535c3af47..e8323dc9bb 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -74,7 +74,6 @@ qemuMigrationParamsSet(virQEMUDriverPtr driver,
 int
 qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
  virDomainObjPtr vm,
- virQEMUDriverConfigPtr cfg,
  bool tlsListen,
  int asyncJob,
  

[libvirt] [PATCH v2 11/73] qemu: Introduce qemuMigrationParams struct

2018-04-11 Thread Jiri Denemark
Currently migration parameters are stored in a structure which mimics
the QEMU migration parameters handled by query-migrate-parameters and
migrate-set-parameters. The new structure will become a libvirt's
abstraction on top of QEMU migration parameters, capabilities, and
related stuff.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   |  6 ++--
 src/qemu/qemu_migration.c| 26 +++---
 src/qemu/qemu_migration.h|  2 +-
 src/qemu/qemu_migration_params.c | 62 
 src/qemu/qemu_migration_params.h | 21 +++
 5 files changed, 62 insertions(+), 55 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c157ff9bb0..6e6fc130c5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12241,7 +12241,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
 int ret = -1;
 const char *dconnuri = NULL;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParamsPtr migParams = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
 
@@ -12669,7 +12669,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
 virQEMUDriverPtr driver = dom->conn->privateData;
 virDomainObjPtr vm;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParamsPtr migParams = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@@ -12725,7 +12725,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
 unsigned long long bandwidth = 0;
 int nbdPort = 0;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParamsPtr migParams = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index a0061c8c83..055d8a674a 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2251,7 +2251,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 int rv;
 char *tlsAlias = NULL;
 char *secAlias = NULL;
-qemuMonitorMigrationParamsPtr migParams = NULL;
+qemuMigrationParamsPtr migParams = NULL;
 
 virNWFilterReadLockFilterUpdates();
 
@@ -2465,7 +2465,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 goto stopjob;
 
 /* Force reset of 'tls-hostname', it's a source only parameter */
-if (VIR_STRDUP(migParams->tlsHostname, "") < 0)
+if (VIR_STRDUP(migParams->params.tlsHostname, "") < 0)
 goto stopjob;
 
 } else {
@@ -3337,7 +3337,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
 size_t nmigrate_disks,
 const char **migrate_disks,
 qemuMigrationCompressionPtr compression,
-qemuMonitorMigrationParamsPtr migParams)
+qemuMigrationParamsPtr migParams)
 {
 int ret = -1;
 unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
@@ -3426,11 +3426,11 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
  * connect directly to the destination. */
 if (spec->destType == MIGRATION_DEST_CONNECT_HOST ||
 spec->destType == MIGRATION_DEST_FD) {
-if (VIR_STRDUP(migParams->tlsHostname, spec->dest.host.name) < 0)
+if (VIR_STRDUP(migParams->params.tlsHostname, 
spec->dest.host.name) < 0)
 goto error;
 } else {
 /* Be sure there's nothing from a previous migration */
-if (VIR_STRDUP(migParams->tlsHostname, "") < 0)
+if (VIR_STRDUP(migParams->params.tlsHostname, "") < 0)
 goto error;
 }
 } else {
@@ -3733,7 +3733,7 @@ qemuMigrationSrcPerformNative(virQEMUDriverPtr driver,
   size_t nmigrate_disks,
   const char **migrate_disks,
   qemuMigrationCompressionPtr compression,
-  qemuMonitorMigrationParamsPtr migParams)
+  qemuMigrationParamsPtr migParams)
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 virURIPtr uribits = NULL;
@@ -3812,7 +3812,7 @@ qemuMigrationSrcPerformTunnel(virQEMUDriverPtr driver,
   size_t nmigrate_disks,
   const char **migrate_disks,
   qemuMigrationCompressionPtr compression,
-  qemuMonitorMigrationParamsPtr migParams)
+  qemuMigrationParamsPtr migParams)
 {
 int ret = -1;
 qemuMigrationSpec spec;
@@ -3884,7 +3884,7 @@ qemuMigrationSrcPerformPeer2Peer2(virQEMUDriverPtr driver,
 virStreamPtr st = NULL;
 unsigned long destflags;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParamsPtr migParams = NULL;
+qemuMigrationParamsPtr 

[libvirt] [PATCH v2 10/73] qemu: Move qemuMigrationCompression struct

2018-04-11 Thread Jiri Denemark
It provides just another view on some migration parameters so let's move
it close to them. The end goal is to merge compression parameters with
the rest of migration parameters since it doesn't make any sense to
handle them differently.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.h| 20 +---
 src/qemu/qemu_migration_params.h | 19 +++
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 3f33d3013d..4e7b33445b 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -24,6 +24,7 @@
 
 # include "qemu_conf.h"
 # include "qemu_domain.h"
+# include "qemu_migration_params.h"
 
 /*
  * General function naming conventions:
@@ -38,9 +39,6 @@
  *  - qemuMigrationJobXXX - runs on source or dest host
  */
 
-typedef struct _qemuMigrationCompression qemuMigrationCompression;
-typedef qemuMigrationCompression *qemuMigrationCompressionPtr;
-
 /* All supported qemu migration flags.  */
 # define QEMU_MIGRATION_FLAGS \
 (VIR_MIGRATE_LIVE | \
@@ -108,22 +106,6 @@ typedef enum {
 } qemuMigrationCompressMethod;
 VIR_ENUM_DECL(qemuMigrationCompressMethod)
 
-struct _qemuMigrationCompression {
-unsigned long long methods;
-
-bool level_set;
-int level;
-
-bool threads_set;
-int threads;
-
-bool dthreads_set;
-int dthreads;
-
-bool xbzrle_cache_set;
-unsigned long long xbzrle_cache;
-};
-
 qemuMigrationCompressionPtr
 qemuMigrationAnyCompressionParse(virTypedParameterPtr params,
  int nparams,
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index f11315cb9d..bb38d34cd6 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -28,6 +28,25 @@
 # include "qemu_conf.h"
 
 
+typedef struct _qemuMigrationCompression qemuMigrationCompression;
+typedef qemuMigrationCompression *qemuMigrationCompressionPtr;
+struct _qemuMigrationCompression {
+unsigned long long methods;
+
+bool level_set;
+int level;
+
+bool threads_set;
+int threads;
+
+bool dthreads_set;
+int dthreads;
+
+bool xbzrle_cache_set;
+unsigned long long xbzrle_cache;
+};
+
+
 qemuMonitorMigrationParamsPtr
 qemuMigrationParamsNew(void);
 
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 09/73] qemu: Drop qemuMigrationParamsClear

2018-04-11 Thread Jiri Denemark
It's no longer used since we do not store the struct on a stack anymore.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 12 +---
 src/qemu/qemu_migration_params.h |  3 ---
 2 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 95ceed4e14..c315810728 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -51,23 +51,13 @@ qemuMigrationParamsNew(void)
 
 
 void
-qemuMigrationParamsClear(qemuMonitorMigrationParamsPtr migParams)
+qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr migParams)
 {
 if (!migParams)
 return;
 
 VIR_FREE(migParams->tlsCreds);
 VIR_FREE(migParams->tlsHostname);
-}
-
-
-void
-qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr migParams)
-{
-if (!migParams)
-return;
-
-qemuMigrationParamsClear(migParams);
 VIR_FREE(migParams);
 }
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index cbc63b9cbf..f11315cb9d 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -36,9 +36,6 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
  int nparams,
  unsigned long flags);
 
-void
-qemuMigrationParamsClear(qemuMonitorMigrationParamsPtr migParams);
-
 void
 qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr migParams);
 
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 08/73] qemu: Allocate struct for migration parameters

2018-04-11 Thread Jiri Denemark
It will get a bit more complicated soon and storing it on a stack with
{0} initializer will no longer work. We need a proper constructor.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_driver.c   | 20 +++--
 src/qemu/qemu_migration.c| 28 ++-
 src/qemu/qemu_migration_params.c | 38 +++-
 src/qemu/qemu_migration_params.h |  3 +++
 4 files changed, 61 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index bf6c0d0826..c157ff9bb0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12241,7 +12241,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
 int ret = -1;
 const char *dconnuri = NULL;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParams migParams = { 0 };
+qemuMonitorMigrationParamsPtr migParams = NULL;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
 
@@ -12252,6 +12252,9 @@ qemuDomainMigratePerform(virDomainPtr dom,
 goto cleanup;
 }
 
+if (!(migParams = qemuMigrationParamsNew()))
+goto cleanup;
+
 if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
 goto cleanup;
 
@@ -12276,12 +12279,12 @@ qemuDomainMigratePerform(virDomainPtr dom,
  */
 ret = qemuMigrationSrcPerform(driver, dom->conn, vm, NULL,
   NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0,
-  compression, , cookie, cookielen,
+  compression, migParams, cookie, cookielen,
   NULL, NULL, /* No output cookies in v2 */
   flags, dname, resource, false);
 
  cleanup:
-qemuMigrationParamsClear();
+qemuMigrationParamsFree(migParams);
 VIR_FREE(compression);
 return ret;
 }
@@ -12666,13 +12669,16 @@ qemuDomainMigratePerform3(virDomainPtr dom,
 virQEMUDriverPtr driver = dom->conn->privateData;
 virDomainObjPtr vm;
 qemuMigrationCompressionPtr compression = NULL;
-qemuMonitorMigrationParams migParams = { 0 };
+qemuMonitorMigrationParamsPtr migParams = NULL;
 int ret = -1;
 
 virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
 
+if (!(migParams = qemuMigrationParamsNew()))
+goto cleanup;
+
 if (!(compression = qemuMigrationAnyCompressionParse(NULL, 0, flags)))
-return -1;
+goto cleanup;
 
 if (!(vm = qemuDomObjFromDomain(dom)))
 goto cleanup;
@@ -12684,13 +12690,13 @@ qemuDomainMigratePerform3(virDomainPtr dom,
 
 ret = qemuMigrationSrcPerform(driver, dom->conn, vm, xmlin, NULL,
   dconnuri, uri, NULL, NULL, 0, NULL, 0,
-  compression, ,
+  compression, migParams,
   cookiein, cookieinlen,
   cookieout, cookieoutlen,
   flags, dname, resource, true);
 
  cleanup:
-qemuMigrationParamsClear();
+qemuMigrationParamsFree(migParams);
 VIR_FREE(compression);
 return ret;
 }
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 57903c7b17..a0061c8c83 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2251,7 +2251,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 int rv;
 char *tlsAlias = NULL;
 char *secAlias = NULL;
-qemuMonitorMigrationParams migParams = { 0 };
+qemuMonitorMigrationParamsPtr migParams = NULL;
 
 virNWFilterReadLockFilterUpdates();
 
@@ -2301,6 +2301,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 if (!qemuMigrationSrcIsAllowedHostdev(*def))
 goto cleanup;
 
+if (!(migParams = qemuMigrationParamsNew()))
+goto cleanup;
+
 /* Let migration hook filter domain XML */
 if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
 char *xml;
@@ -2445,7 +2448,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 }
 
 if (qemuMigrationParamsSetCompression(driver, vm, 
QEMU_ASYNC_JOB_MIGRATION_IN,
-  compression, ) < 0)
+  compression, migParams) < 0)
 goto stopjob;
 
 /* Migrations using TLS need to add the "tls-creds-x509" object and
@@ -2458,17 +2461,17 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
 
 if (qemuMigrationParamsAddTLSObjects(driver, vm, cfg, true,
  QEMU_ASYNC_JOB_MIGRATION_IN,
- , , ) 
< 0)
+ , , migParams) 
< 0)
 goto stopjob;
 
 /* Force reset of 'tls-hostname', it's a source only parameter */
-if (VIR_STRDUP(migParams.tlsHostname, "") < 0)
+if (VIR_STRDUP(migParams->tlsHostname, "") < 0)
 goto stopjob;
 
 } else {
 if 

[libvirt] [PATCH v2 06/73] qemu: Reindent qemuMigrationParamsSetEmptyTLS

2018-04-11 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration_params.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index f78e9ad875..36a9fd3509 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -299,17 +299,17 @@ qemuMigrationParamsSetEmptyTLS(virQEMUDriverPtr driver,
int asyncJob,
qemuMonitorMigrationParamsPtr migParams)
 {
-   qemuDomainObjPrivatePtr priv = vm->privateData;
+qemuDomainObjPrivatePtr priv = vm->privateData;
 
-   if (qemuMigrationParamsCheckTLSCreds(driver, vm, asyncJob) < 0)
-   return -1;
+if (qemuMigrationParamsCheckTLSCreds(driver, vm, asyncJob) < 0)
+return -1;
 
-   if (!priv->migTLSAlias)
-   return 0;
+if (!priv->migTLSAlias)
+return 0;
 
-   if (VIR_STRDUP(migParams->tlsCreds, "") < 0 ||
-   VIR_STRDUP(migParams->tlsHostname, "") < 0)
-   return -1;
+if (VIR_STRDUP(migParams->tlsCreds, "") < 0 ||
+VIR_STRDUP(migParams->tlsHostname, "") < 0)
+return -1;
 
 return 0;
 }
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 02/73] qemu: Rename qemuMigrationParams

2018-04-11 Thread Jiri Denemark
The function is now called qemuMigrationParamsFromFlags to better
reflect what it is doing: taking migration flags and params and
producing a struct with QEMU migration parameters.

Signed-off-by: Jiri Denemark 
Reviewed-by: Ján Tomko 
---
 src/qemu/qemu_driver.c| 2 +-
 src/qemu/qemu_migration.c | 6 +++---
 src/qemu/qemu_migration.h | 6 +++---
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cc431ae045..f7ad211077 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12758,7 +12758,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
 if (nmigrate_disks < 0)
 goto cleanup;
 
-if (!(migParams = qemuMigrationParams(params, nparams, flags)))
+if (!(migParams = qemuMigrationParamsFromFlags(params, nparams, flags)))
 goto cleanup;
 
 if (!(compression = qemuMigrationAnyCompressionParse(params, nparams, 
flags)))
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 3890a29d7e..a0071cc089 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2471,9 +2471,9 @@ qemuMigrationParamsSetEmptyTLS(virQEMUDriverPtr driver,
 
 
 qemuMonitorMigrationParamsPtr
-qemuMigrationParams(virTypedParameterPtr params,
-int nparams,
-unsigned long flags)
+qemuMigrationParamsFromFlags(virTypedParameterPtr params,
+ int nparams,
+ unsigned long flags)
 {
 qemuMonitorMigrationParamsPtr migParams;
 
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index af96854a73..3424404dc4 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -143,9 +143,9 @@ void
 qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr *migParams);
 
 qemuMonitorMigrationParamsPtr
-qemuMigrationParams(virTypedParameterPtr params,
-int nparams,
-unsigned long flags);
+qemuMigrationParamsFromFlags(virTypedParameterPtr params,
+ int nparams,
+ unsigned long flags);
 
 int
 qemuMigrationSrcSetOffline(virQEMUDriverPtr driver,
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v2 05/73] qemu: Move qemuMigrationCapsGet

2018-04-11 Thread Jiri Denemark
The function is connected with the code which handles migration
parameters and capabilities, let's move it to qemu_migration_params.c.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c| 14 --
 src/qemu/qemu_migration.h|  4 
 src/qemu/qemu_migration_params.c | 14 ++
 src/qemu/qemu_migration_params.h |  4 
 4 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 34eb3eb9e5..57903c7b17 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -5740,17 +5740,3 @@ qemuMigrationSrcFetchMirrorStats(virQEMUDriverPtr driver,
 virHashFree(blockinfo);
 return 0;
 }
-
-
-bool
-qemuMigrationCapsGet(virDomainObjPtr vm,
- qemuMonitorMigrationCaps cap)
-{
-qemuDomainObjPrivatePtr priv = vm->privateData;
-bool enabled = false;
-
-if (priv->migrationCaps)
-ignore_value(virBitmapGetBit(priv->migrationCaps, cap, ));
-
-return enabled;
-}
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index adf788c909..3f33d3013d 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -291,10 +291,6 @@ qemuMigrationSrcFetchMirrorStats(virQEMUDriverPtr driver,
  qemuDomainAsyncJob asyncJob,
  qemuDomainJobInfoPtr jobInfo);
 
-bool
-qemuMigrationCapsGet(virDomainObjPtr vm,
- qemuMonitorMigrationCaps cap);
-
 int
 qemuMigrationOptionSet(virQEMUDriverPtr driver,
virDomainObjPtr vm,
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 461df876db..f78e9ad875 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -524,3 +524,17 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver,
 virStringListFree(caps);
 return ret;
 }
+
+
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap)
+{
+qemuDomainObjPrivatePtr priv = vm->privateData;
+bool enabled = false;
+
+if (priv->migrationCaps)
+ignore_value(virBitmapGetBit(priv->migrationCaps, cap, ));
+
+return enabled;
+}
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index a006357825..0a68bc0e39 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -84,4 +84,8 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int asyncJob);
 
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap);
+
 #endif /* __QEMU_MIGRATION_PARAMS_H__ */
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 00/73] qemu: Refactor migration parameters

2018-04-11 Thread Jiri Denemark
This series changes the way we handle migration parameters and
capabilities with several goals:

- make it all consistent and avoid storing the same parameters in
  several structs
- reduce the number of QMP commands we use for setting migration
  capabilities
- concentrate the logic in a separate file and make the code for
  migration parameters and capabilities in qemu_migration.c less
  complicated
- reset all parameters and capabilities at the end of migration
- make adding new parameters and capabilities easier

Version 2:
- qemuDomainCheckMigrationCapabilities is moved to
  qemu_migration_params.c (rather than to qemu_migration.c)
- supported migration capabilities are sent via migration cookie so that
  some caps may be automatically enabled only when both sides support
  them

Jiri Denemark (73):
  qemu: Rename qemuMigrationAnyCapsGet as qemuMigrationCapsGet
  qemu: Rename qemuMigrationParams
  qemu: New file for all APIs related to migration parameters
  qemu: Move qemuDomainCheckMigrationCapabilities
  qemu: Move qemuMigrationCapsGet
  qemu: Reindent qemuMigrationParamsSetEmptyTLS
  qemu: Make qemuMigrationParamsFree follow common pattern
  qemu: Allocate struct for migration parameters
  qemu: Drop qemuMigrationParamsClear
  qemu: Move qemuMigrationCompression struct
  qemu: Introduce qemuMigrationParams struct
  qemu: Reset migration parameters in qemuMigrationSrcCleanup
  qemu: Store original migration params in job
  qemu: Typedef struct qemuDomainJobObj
  qemu: Pass job object to qemuProcessRecoverMigration{In,Out}
  qemu: Reset all migration parameters
  qemu: Drop qemuMigrationParamsCheckSetupTLS
  qemu: Drop qemuMigrationParamsCheckTLSCreds
  qemu: Rename qemuMigrationParamsSetEmptyTLS
  qemu: Rename qemuMigrationParamsAddTLSObjects
  qemu: Set tlsHostname inside qemuMigrationParamsEnableTLS
  qemu: Hide cfg inside qemuMigrationParamsEnableTLS
  qemu: Rename qemuMigrationParamsSet
  qemu: Hide internals of qemuMigrationParams struct
  qemu: Introduce qemuMonitorSetMigrationCapabilities
  qemu: Set migration caps via migration params APIs
  qemu: Do not use qemuMonitorSetMigrationCapability
  qemu: Drop unused qemuMonitorSetMigrationCapability
  qemu: Add support for xbzrle-cache-size migration parameter
  qemu: Set XBZRLE cache size via migration parameters
  qemu: Move ParamsCheck closer to ParamsApply on Dst side
  qemu: Move ParamsCheck closer to ParamsApply on Src side
  qemu: Check supported caps in qemuMigrationParamsCheck
  qemu: Introduce qemuMigrationParty enum
  qemu: Use qemuMigrationParamsFromFlags everywhere
  qemu: Hide qemuMigrationParamsNew
  qemu: Drop qemuMigrationParamsSetPostCopy
  qemu: Set always-on migration caps in ParamsCheck
  qemu: Set migration capabilities automatically
  qemu: Call qemuMigrationAnyCompressionParse only from driver
  qemu: Generalize macro for getting VIR_MIGRATE_* typed params
  qemu: Drop qemuMigrationParamsSetCapability
  qemu: Move qemuMigrationParamsSetCompression
  qemu: Move qemuMigrationAnyCompression*
  qemu: Hide qemuMigrationParamsSetCompression
  qemu: Replace qemuMigrationAnyCompressionDump
  qemu: Drop qemuMigrationCompression structure
  qemu: Introduce qemuMigrationParamsFetch
  qemu: Limit usage of qemuMonitorMigrationParams
  qemumonitorjsontest: Drop migration params test
  util: Introduce virJSONValueObjectStealObject
  qemu: Move migration parameters JSON parsing
  qemu: Move migration parameters JSON formatting
  qemu: Export qemuMigrationParams{To,From}JSON for tests
  qemu: Move qemuMonitorMigrationParams structure
  qemu: Refactor qemuMigrationParams
  qemu: Move migration capabilities JSON formatting
  qemu: Move qemuMonitorMigrationCaps enum
  qemu: Add support for sending capabilities in migration cookie
  qemu: Check remote caps when enabling always-on capabilities
  qemu: Generalize qemuMigrationParamsGetDowntimeLimit
  qemu: Set migration parameters automatically
  qemu: Properly reset migration params when libvirtd restarts
  tests: Add tests for QEMU migration parameters
  qemumigparamstest: Add basic test data
  qemumigparamstest: Add test data for TLS parameters
  qemu: Store API flags for async jobs in qemuDomainJobObj
  qemu: Properly avoid cancelling memory-only dump
  qemu: Drop priv->job.dump_memory_only bool
  qemu: Drop priv->job.postcopyEnabled bool
  qemu: Store API flags for async jobs in status XML
  qemu: Don't delete TLS objects unless TLS migration was requested
  qemuxml2xmltest: Add status XML tests for migration params

 po/POTFILES.in|1 +
 src/libvirt_private.syms  |1 +
 src/qemu/Makefile.inc.am  |3 +
 src/qemu/qemu_domain.c|  110 +-
 src/qemu/qemu_domain.h|   25 +-
 src/qemu/qemu_driver.c|  175 ++-
 src/qemu/qemu_migration.c |  926 ++-
 src/qemu/qemu_migration.h |   66 +-
 

Re: [libvirt] [RFC v2] external (pull) backup API

2018-04-11 Thread Eric Blake
On 04/03/2018 07:01 AM, Nikolay Shirokovskiy wrote:
> Hi, all.  
>
>   
>
> This is another RFC on pull backup API. This API provides means to read 
> domain   
> disks in a snapshotted state so that client can back them up as well as means 
>
> to write domain disks to revert them to backed up state. The previous version 
>
> of RFC is [1]. I'll also describe the API implementation details to shed 
> light   
> on misc qemu dirty bitmap commands usage. 
>

Thanks for such a detailed message!  It's got enough that I want to
spend some time thinking about the implications, but this is an early
reply to let you know I'm at least working on it now.

The first thing that caught my eye:

> Here is a list of bitmap commands used in implementation but not yet in 
> upstream (AFAIK).
> 
> x-vz-block-dirty-bitmap-remove
> x-vz-block-dirty-bitmap-merge
> x-vz-block-dirty-bitmap-disable
> x-vz-block-dirty-bitmap-enable (not in the examples; used when removing most 
> recent checkpoint)
> x-vz-nbd-server-add-bitmap

How close are we to having upstream implementations of any of those
commands?  If not, what are their specifications?  Libvirt is very
hesitant to add code that depends on a qemu x-* command, but if we can
get the actual command into qemu.git without the x-* prefix, it is
easier to justify libvirt adding the API even if qemu 2.13 is not yet
released.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [RFC PATCH 0/4] LXC - Implement save/restore domain state

2018-04-11 Thread Cedric Bosdonnat
On Wed, 2018-04-11 at 12:34 +0100, Daniel P. Berrangé wrote:
> On Wed, Apr 11, 2018 at 12:29:11PM +0100, Radostin Stoyanov wrote:
> > This patch set contains rebased version of Katerina's work from GSoC 2016 
> > [1].
> > It allows integrates CRIU [2] with the libvirt-lxc to enable save/resore of 
> > containers.
> 
> I vaguely recall that when Katerina first did that work, we hit some
> limitations of CRIU at the time, that blocked us merging. Does anyone
> recall what that was, and if & when it was addressed in CRIU ?

What was missing in CRIU was the possibility to write the data into a stream
rather than in files. From what I recall this work has been merged upstream
in the mean time.

--
Cedric

> > 
> > [1] https://wiki.libvirt.org/page/Google_Summer_of_Code_2016/lxc_migration
> > [2] https://criu.org
> > 
> > Radostin Stoyanov (4):
> >   configure: Include support for CRIU
> >   lxc: Add save/restore helper functions
> >   lxc: Add restore mode for libvirt-lxc
> >   lxc: Add save/restore support
> > 
> >  configure.ac |   1 +
> >  m4/virt-criu.m4  |  27 +
> >  po/POTFILES.in   |   1 +
> >  src/lxc/Makefile.inc.am  |   4 +
> >  src/lxc/lxc_container.c  | 162 --
> >  src/lxc/lxc_container.h  |   3 +-
> >  src/lxc/lxc_controller.c | 104 ++-
> >  src/lxc/lxc_criu.c   | 253 
> > +++
> >  src/lxc/lxc_criu.h   |  36 +++
> >  src/lxc/lxc_driver.c | 238 +++-
> >  src/lxc/lxc_process.c|  23 -
> >  src/lxc/lxc_process.h|   1 +
> >  12 files changed, 836 insertions(+), 17 deletions(-)
> >  create mode 100644 m4/virt-criu.m4
> >  create mode 100644 src/lxc/lxc_criu.c
> >  create mode 100644 src/lxc/lxc_criu.h
> > 
> > -- 
> > 2.14.3
> > 
> > --
> > libvir-list mailing list
> > libvir-list@redhat.com
> > https://www.redhat.com/mailman/listinfo/libvir-list
> 
> Regards,
> Daniel

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [jenkins-ci PATCH] guests: Fix intltool-update on FreeBSD

2018-04-11 Thread Andrea Bolognani
The tool became completely unusable after the switch to Perl
5.26; workaround the issue while we wait for a proper solution.

Signed-off-by: Andrea Bolognani 
---
Using regexes to match regexes: it's regexception.

 guests/tasks/kludges.yml | 13 +
 1 file changed, 13 insertions(+)

diff --git a/guests/tasks/kludges.yml b/guests/tasks/kludges.yml
index d0ff6cb..4dd06a4 100644
--- a/guests/tasks/kludges.yml
+++ b/guests/tasks/kludges.yml
@@ -46,3 +46,16 @@
   command: cap_mkdb /etc/login.conf
   when:
 - loginconf.changed
+
+# FreeBSD switched to Perl 5.26, which makes a long existing warning in
+# intltool-update turn into an error and causes jobs to fail. While we
+# wait for the port to be fixed, we can patch things up ourselves.
+#
+# See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227444
+- name: Fix intltool-update
+  replace:
+path: /usr/local/bin/intltool-update
+regexp: '^(.*) !~ /\\\$\{\?\$2\}\?/;$'
+replace: '\1 !~ /\\$\\{?$2}?/;'
+  when:
+- os_name == 'FreeBSD'
-- 
2.14.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 0/2] Fix lxc callers using virDomainObjListRemove

2018-04-11 Thread Michal Privoznik
On 04/02/2018 04:15 PM, John Ferlan wrote:
> Details in each patch - being consistent for future adjustment.
> 
> John Ferlan (2):
>   lxc: Fix possible leaked @vm in lxcDomainCreateXMLWithFiles
>   lxc: Fix object locking after virDomainObjListRemove
> 
>  src/lxc/lxc_driver.c | 10 +++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 

ACK to both.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] bhyve: Use virDomainObjListFindBy{UUID|ID}Ref

2018-04-11 Thread Michal Privoznik
On 04/02/2018 03:11 PM, John Ferlan wrote:
> For bhyveDomObjFromDomain, bhyveDomainLookupByUUID, and
> bhyveDomainLookupByID let's return a locked and referenced
> @vm object so that callers can then use the common and more
> consistent virDomainObjEndAPI in order to handle cleanup rather
> than needing to know that the returned object is locked and
> calling virObjectUnlock.
> 
> The LookupByName already returns the ref counted and locked object,
> so this will make things more consistent.
> 
> For bhyveDomainUndefine and bhyveDomainDestroy since the
> virDomainObjListRemove will return an unlocked object, we need to
> relock before making the EndAPI call.
> 
> Signed-off-by: John Ferlan 
> ---
> 
>  Patch 1:
> https://www.redhat.com/archives/libvir-list/2018-March/msg00490.html
> 
>  of the larger series:
> https://www.redhat.com/archives/libvir-list/2018-March/msg00489.html
> 
> Changes since v1:
> 
>  * From review, use virObjectLock after virDomainObjListRemove when
>calling in a path that would have returned a reffed and locked
>object since virDomainObjListRemove will return an unlocked, but
>reffed object.
> 
>  src/bhyve/bhyve_driver.c | 62 
> ++--
>  1 file changed, 23 insertions(+), 39 deletions(-)

ACK

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 0/2] Fix lxc callers using virDomainObjListRemove

2018-04-11 Thread John Ferlan
ping?

Tks,

John


On 04/02/2018 10:15 AM, John Ferlan wrote:
> Details in each patch - being consistent for future adjustment.
> 
> John Ferlan (2):
>   lxc: Fix possible leaked @vm in lxcDomainCreateXMLWithFiles
>   lxc: Fix object locking after virDomainObjListRemove
> 
>  src/lxc/lxc_driver.c | 10 +++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] qemu: Format gic-version=2 on the command line

2018-04-11 Thread John Ferlan


On 04/03/2018 08:57 AM, Andrea Bolognani wrote:
> Up until now we have only formatted non-default GIC versions on
> the command line, in order to maintain compatibility with older
> QEMU versions that didn't implement the gic-version option to
> begin with; however, doing so is entirely unnecessary for newer
> QEMU versions, where the option is available. Moreover, having
> the GIC version formatted on the command line at all times
> ensures that QEMU changing its own defaults doesn't affect the
> ABI of libvirt guests.
> 
> A few test cases are removed to avoid extra churn. It doesn't
> matter for coverage, as those scenarios are already covered by
> other parts of the test suite.
> 
> This patch is better viewed with 'git show -w'.
> 
> Signed-off-by: Andrea Bolognani 
> ---
>  src/qemu/qemu_command.c  | 44 
> +---
>  tests/qemuxml2argvdata/aarch64-gic-none-tcg.args |  2 +-
>  tests/qemuxml2argvdata/aarch64-gic-v2.args   |  2 +-
>  tests/qemuxml2argvtest.c |  6 
>  4 files changed, 33 insertions(+), 21 deletions(-)
> 

And because of code in qemuDomainDefEnableDefaultFeatures related to TCG
and GIC and (it seems) bz1414081, the default for TCG would then be v2,
hence the reason for the none-tcg change, if I'm reading correctly at
least...  Although perhaps not obvious just reading this patch ;-)

Reviewed-by: John Ferlan 

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] bhyve: Use virDomainObjListFindBy{UUID|ID}Ref

2018-04-11 Thread John Ferlan
ping?

Tks, -

John

On 04/02/2018 09:11 AM, John Ferlan wrote:
> For bhyveDomObjFromDomain, bhyveDomainLookupByUUID, and
> bhyveDomainLookupByID let's return a locked and referenced
> @vm object so that callers can then use the common and more
> consistent virDomainObjEndAPI in order to handle cleanup rather
> than needing to know that the returned object is locked and
> calling virObjectUnlock.
> 
> The LookupByName already returns the ref counted and locked object,
> so this will make things more consistent.
> 
> For bhyveDomainUndefine and bhyveDomainDestroy since the
> virDomainObjListRemove will return an unlocked object, we need to
> relock before making the EndAPI call.
> 
> Signed-off-by: John Ferlan 
> ---
> 
>  Patch 1:
> https://www.redhat.com/archives/libvir-list/2018-March/msg00490.html
> 
>  of the larger series:
> https://www.redhat.com/archives/libvir-list/2018-March/msg00489.html
> 
> Changes since v1:
> 
>  * From review, use virObjectLock after virDomainObjListRemove when
>calling in a path that would have returned a reffed and locked
>object since virDomainObjListRemove will return an unlocked, but
>reffed object.
> 
>  src/bhyve/bhyve_driver.c | 62 
> ++--
>  1 file changed, 23 insertions(+), 39 deletions(-)
> 
> diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> index 849d3abcd3..38e6442db7 100644
> --- a/src/bhyve/bhyve_driver.c
> +++ b/src/bhyve/bhyve_driver.c
> @@ -168,7 +168,7 @@ bhyveDomObjFromDomain(virDomainPtr domain)
>  bhyveConnPtr privconn = domain->conn->privateData;
>  char uuidstr[VIR_UUID_STRING_BUFLEN];
>  
> -vm = virDomainObjListFindByUUID(privconn->domains, domain->uuid);
> +vm = virDomainObjListFindByUUIDRef(privconn->domains, domain->uuid);
>  if (!vm) {
>  virUUIDFormat(domain->uuid, uuidstr);
>  virReportError(VIR_ERR_NO_DOMAIN,
> @@ -312,8 +312,7 @@ bhyveDomainGetInfo(virDomainPtr domain, virDomainInfoPtr 
> info)
>  ret = 0;
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -338,8 +337,7 @@ bhyveDomainGetState(virDomainPtr domain,
>  ret = 0;
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -359,8 +357,7 @@ bhyveDomainGetAutostart(virDomainPtr domain, int 
> *autostart)
>  ret = 0;
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -423,8 +420,7 @@ bhyveDomainSetAutostart(virDomainPtr domain, int 
> autostart)
>   cleanup:
>  VIR_FREE(configFile);
>  VIR_FREE(autostartLink);
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -443,8 +439,7 @@ bhyveDomainIsActive(virDomainPtr domain)
>  ret = virDomainObjIsActive(obj);
>  
>   cleanup:
> -if (obj)
> -virObjectUnlock(obj);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -463,8 +458,7 @@ bhyveDomainIsPersistent(virDomainPtr domain)
>  ret = obj->persistent;
>  
>   cleanup:
> -if (obj)
> -virObjectUnlock(obj);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -484,8 +478,7 @@ bhyveDomainGetOSType(virDomainPtr dom)
>  goto cleanup;
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -512,8 +505,7 @@ bhyveDomainGetXMLDesc(virDomainPtr domain, unsigned int 
> flags)
>  
>  virObjectUnref(caps);
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return ret;
>  }
>  
> @@ -624,14 +616,13 @@ bhyveDomainUndefine(virDomainPtr domain)
>  vm->persistent = 0;
>  } else {
>  virDomainObjListRemove(privconn->domains, vm);
> -vm = NULL;
> +virObjectLock(vm);
>  }
>  
>  ret = 0;
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  if (event)
>  virObjectEventStateQueue(privconn->domainEventState, event);
>  return ret;
> @@ -803,7 +794,7 @@ bhyveDomainLookupByUUID(virConnectPtr conn,
>  virDomainObjPtr vm;
>  virDomainPtr dom = NULL;
>  
> -vm = virDomainObjListFindByUUID(privconn->domains, uuid);
> +vm = virDomainObjListFindByUUIDRef(privconn->domains, uuid);
>  
>  if (!vm) {
>  char uuidstr[VIR_UUID_STRING_BUFLEN];
> @@ -819,8 +810,7 @@ bhyveDomainLookupByUUID(virConnectPtr conn,
>  dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
>  
>   cleanup:
> -if (vm)
> -virObjectUnlock(vm);
> +virDomainObjEndAPI();
>  return dom;
>  }
>  
> @@ -857,7 +847,7 @@ bhyveDomainLookupByID(virConnectPtr conn,
>  virDomainObjPtr vm;
>  virDomainPtr dom = NULL;
>  
> -vm = virDomainObjListFindByID(privconn->domains, id);
> +vm = 

Re: [libvirt] [PATCH 5/8] driver: declare supported URI schemes in virConnectDriver struct

2018-04-11 Thread Michal Privoznik
On 04/09/2018 05:45 PM, Daniel P. Berrangé wrote:
> Declare what URI schemes a driver supports in its virConnectDriver
> struct. This allows us to skip trying to open the driver entirely
> if the URI scheme doesn't match.
> 
> Signed-off-by: Daniel P. Berrangé 
> ---
>  src/bhyve/bhyve_driver.c|  4 +---
>  src/driver.h|  6 ++
>  src/esx/esx_driver.c| 27 ++-
>  src/hyperv/hyperv_driver.c  | 22 ++
>  src/interface/interface_backend_netcf.c |  4 +---
>  src/interface/interface_backend_udev.c  |  4 +---
>  src/libvirt.c   | 24 
>  src/libxl/libxl_driver.c|  5 +
>  src/lxc/lxc_driver.c|  5 +
>  src/network/bridge_driver.c |  4 +---
>  src/node_device/node_device_driver.c|  3 ---
>  src/node_device/node_device_hal.c   |  1 +
>  src/node_device/node_device_udev.c  |  1 +
>  src/nwfilter/nwfilter_driver.c  |  4 +---
>  src/openvz/openvz_driver.c  |  6 +-
>  src/phyp/phyp_driver.c  |  4 +---
>  src/qemu/qemu_driver.c  |  8 +---
>  src/secret/secret_driver.c  |  4 +---
>  src/storage/storage_driver.c|  4 +---
>  src/test/test_driver.c  |  4 +---
>  src/uml/uml_driver.c|  5 +
>  src/vbox/vbox_common.c  |  4 
>  src/vbox/vbox_driver.c  |  5 ++---
>  src/vmware/vmware_driver.c  |  7 +--
>  src/vz/vz_driver.c  | 15 ++-
>  src/xenapi/xenapi_driver.c  |  5 ++---
>  26 files changed, 57 insertions(+), 128 deletions(-)
> 
> diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> index cc1d4ba6fb..21754dfc10 100644
> --- a/src/bhyve/bhyve_driver.c
> +++ b/src/bhyve/bhyve_driver.c
> @@ -202,9 +202,6 @@ bhyveConnectOpen(virConnectPtr conn,
>   if (conn->uri == NULL) {
>   return VIR_DRV_OPEN_DECLINED;
>   } else {
> - if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "bhyve"))
> - return VIR_DRV_OPEN_DECLINED;
> -
>   if (STRNEQ_NULLABLE(conn->uri->path, "/system")) {
>  virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Unexpected bhyve URI path '%s', try 
> bhyve:///system"),
> @@ -1752,6 +1749,7 @@ static virHypervisorDriver bhyveHypervisorDriver = {
>  
>  static virConnectDriver bhyveConnectDriver = {
>  .localOnly = true,
> +.uriSchemes = (const char *[]){ "bhyve", NULL },

Frankly, I don't like this typecast. But at the same time, I'm unable to
come up with something better. Apart from some VIR_URI_SCHEMES() macro
that would hide typecast in its internals.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 3/8] driver: introduce a driver method for probing default URIs

2018-04-11 Thread Michal Privoznik
On 04/09/2018 05:45 PM, Daniel P. Berrangé wrote:
> Currently the virDrvConnectOpen method is supposed to handle both
> opening an explicit URI and auto-probing a driver if no URI is
> given. Introduce a dedicated virDrvConnectURIProbe method to enable the
> probing functionality to be split from the driver opening functionality.
> 
> It is still possible for NULL to be passed to the virDrvConnectOpen
> method after this change, because the remote driver needs special
> handling to enable probing of the URI against a remote libvirtd daemon.
> 
> Signed-off-by: Daniel P. Berrangé 
> ---
>  docs/hvsupport.pl  |  6 +++---
>  src/bhyve/bhyve_driver.c   | 18 +-
>  src/driver-hypervisor.h|  4 
>  src/libvirt.c  | 13 +
>  src/libxl/libxl_driver.c   | 17 -
>  src/lxc/lxc_driver.c   | 17 -
>  src/openvz/openvz_driver.c | 24 
>  src/qemu/qemu_driver.c | 30 +-
>  src/uml/uml_driver.c   | 20 +---
>  src/vbox/vbox_common.c | 13 ++---
>  10 files changed, 117 insertions(+), 45 deletions(-)
> 
> diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
> index fc6eb1f152..a2b980c502 100755
> --- a/docs/hvsupport.pl
> +++ b/docs/hvsupport.pl
> @@ -184,7 +184,7 @@ foreach my $drivertable (@drivertable) {
>  my $api;
>  if (exists $apis{"vir$name"}) {
>  $api = "vir$name";
> -} elsif ($name =~ /\w+(Open|Close)/) {
> +} elsif ($name =~ /\w+(Open|Close|URIProbe)/) {
>  next;
>  } else {
>  die "driver $name does not have a public API";
> @@ -241,12 +241,12 @@ foreach my $src (@srcs) {
>  
>  next if $api eq "no" || $api eq "name";
>  
> -die "Method $meth in $src is missing version" unless defined 
> $vers;
> +die "Method $meth in $src is missing version" unless defined 
> $vers || $api eq "connectURIProbe";
>  
>  die "Driver method for $api is NULL in $src" if $meth eq 
> "NULL";
>  
>  if (!exists($groups{$ingrp}->{apis}->{$api})) {
> -next if $api =~ /\w(Open|Close)/;
> +next if $api =~ /\w(Open|Close|URIProbe)/;
>  
>  die "Found unexpected method $api in $ingrp\n";
>  }
> diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> index 849d3abcd3..a0bc400480 100644
> --- a/src/bhyve/bhyve_driver.c
> +++ b/src/bhyve/bhyve_driver.c
> @@ -180,6 +180,17 @@ bhyveDomObjFromDomain(virDomainPtr domain)
>  return vm;
>  }
>  
> +
> +static int
> +bhyveConnectURIProbe(char **uri)
> +{
> +if (bhyve_driver == NULL)
> +return 0;
> +
> +return VIR_STRDUP(*uri, "bhyve:///system");
> +}

make check fails because it thinks this function (and others) is missing
ACL check.

> +
> +
>  static virDrvOpenStatus
>  bhyveConnectOpen(virConnectPtr conn,
>   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
> @@ -189,11 +200,7 @@ bhyveConnectOpen(virConnectPtr conn,
>   virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
>  
>   if (conn->uri == NULL) {
> - if (bhyve_driver == NULL)
> - return VIR_DRV_OPEN_DECLINED;
> -
> - if (!(conn->uri = virURIParse("bhyve:///system")))
> - return VIR_DRV_OPEN_ERROR;
> + return VIR_DRV_OPEN_DECLINED;
>   } else {
>   if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "bhyve"))
>   return VIR_DRV_OPEN_DECLINED;
> @@ -1689,6 +1696,7 @@ bhyveConnectGetDomainCapabilities(virConnectPtr conn,
>  
>  static virHypervisorDriver bhyveHypervisorDriver = {
>  .name = "bhyve",
> +.connectURIProbe = bhyveConnectURIProbe,

s,$, /* 4.3.0 */

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

  1   2   >