From patchwork Thu Nov 26 17:35:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 1406778 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=fhN3iuo/; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4ChlLG07Yhz9s0b for ; Fri, 27 Nov 2020 04:36:36 +1100 (AEDT) Received: from localhost ([::1]:56510 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kiLC5-0002Jv-Ku for incoming@patchwork.ozlabs.org; Thu, 26 Nov 2020 12:36:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:38002) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kiLBA-0002Hf-CG for qemu-devel@nongnu.org; Thu, 26 Nov 2020 12:35:36 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:42297) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kiLB7-0006K4-Ck for qemu-devel@nongnu.org; Thu, 26 Nov 2020 12:35:36 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606412131; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=JnmrYEOj67EZWDomGBByyZvDmPDGTLmkKS8pAcqC+7k=; b=fhN3iuo/sIuoYvG8pl1K1zVTIJyQ9fCcJrnobIX8X5FN7EZ1q+PduMz/YBitvZtXMdoRdZ Dr9gERes719LleNA0L5FuRNHB9IJUbE+qYBoqUCiUYJsJBVI1o2NccQramPdxGI8A3j1+j 9Oy5DZt4/qMehdZlOhhtRAQjxU8V5TM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-160-z15nCgp8MjCZsWdv0KJ6Nw-1; Thu, 26 Nov 2020 12:35:28 -0500 X-MC-Unique: z15nCgp8MjCZsWdv0KJ6Nw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 352291009B60; Thu, 26 Nov 2020 17:35:27 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.2]) by smtp.corp.redhat.com (Postfix) with ESMTP id F22911A4D0; Thu, 26 Nov 2020 17:35:22 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v8 00/11] migration: bring improved savevm/loadvm/delvm to QMP Date: Thu, 26 Nov 2020 17:35:10 +0000 Message-Id: <20201126173521.137580-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , "Dr. David Alan Gilbert" , Max Reitz , Pavel Dovgalyuk , Paolo Bonzini , John Snow , Markus Armbruster Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" v1: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg00866.html v2: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg07523.html v3: https://lists.gnu.org/archive/html/qemu-devel/2020-08/msg07076.html v4: https://lists.gnu.org/archive/html/qemu-devel/2020-09/msg05221.html v5: https://lists.gnu.org/archive/html/qemu-devel/2020-10/msg00587.html v6: https://lists.gnu.org/archive/html/qemu-devel/2020-10/msg02158.html v7: https://lists.gnu.org/archive/html/qemu-devel/2020-10/msg06205.html This series aims to provide a better designed replacement for the savevm/loadvm/delvm HMP commands, which despite their flaws continue to be actively used in the QMP world via the HMP command passthrough facility. The main problems addressed are: - The logic to pick which disk to store the vmstate in is not satsifactory. The first block driver state cannot be assumed to be the root disk image, it might be OVMF varstore and we don't want to store vmstate in there. - The logic to decide which disks must be snapshotted is hardwired to all disks which are writable Again with OVMF there might be a writable varstore, but this can be raw rather than qcow2 format, and thus unable to be snapshotted. While users might wish to snapshot their varstore, in some/many/most cases it is entirely uneccessary. Users are blocked from snapshotting their VM though due to this varstore. - The commands are synchronous blocking execution and returning errors immediately. This is partially addressed by integrating with the job framework. This forces the client to use the async commands to determine the completion status or error message from the operations. In the block code I've only dealt with node names for block devices, as IIUC, this is all that libvirt should need in the -blockdev world it now lives in. IOW, I've made not attempt to cope with people wanting to use these QMP commands in combination with -drive args, as libvirt will never use -drive with a QEMU new enough to have these new commands. The main limitations of this current impl - The snapshot process runs serialized in the main thread. ie QEMU guest execution is blocked for the duration. The job framework lets us fix this in future without changing the QMP semantics exposed to the apps. - Most vmstate loading errors just go to stderr, as they are not using Error **errp reporting. Thus the job framework just reports a fairly generic message "Error -22 while loading VM state" Again this can be fixed later without changing the QMP semantics exposed to apps. I've done some minimal work in libvirt to start to make use of the new commands to validate their functionality, but this isn't finished yet. My ultimate goal is to make the GNOME Boxes maintainer happy again by having internal snapshots work with OVMF: https://gitlab.gnome.org/GNOME/gnome-boxes/-/commit/c486da262f6566326fbcb5e= f45c5f64048f16a6e Changed in v8: - Rebase to git master to resolve conflicts - Updated QAPI since versions to 6.0 Changed in v7: - Incorporate changes from: https://lists.gnu.org/archive/html/qemu-devel/2020-10/msg03165.html - Tweaked error message Changed in v6: - Resolve many conflicts with recent replay changes - Misc typos in QAPI Changed in v5: - Fix prevention of tag overwriting - Refactor and expand test suite coverage to validate more negative scenarios Changed in v4: - Make the device lists mandatory, dropping all support for QEMU's built-in heuristics to select devices. - Improve some error reporting and I/O test coverage Changed in v3: - Schedule a bottom half to escape from coroutine context in the jobs. This is needed because the locking in the snapshot code goes horribly wrong when run from a background coroutine instead of the main event thread. - Re-factor way we iterate over devices, so that we correctly report non-existant devices passed by the user over QMP. - Add QAPI docs notes about limitations wrt vmstate error reporting (it all goes to stderr not an Error **errp) so QMP only gets a fairly generic error message currently. - Add I/O test to validate many usage scenarios / errors - Add I/O test helpers to handle QMP events with a deterministic ordering - Ensure 'delete-snapshot' reports an error if requesting delete from devices that don't support snapshot, instead of silently succeeding with no erro. Changed in v2: - Use new command names "snapshot-{load,save,delete}" to make it clear that these are different from the "savevm|loadvm|delvm" as they use the Job framework - Use an include list for block devs, not an exclude list Daniel P. Berrang=C3=A9 (10): block: push error reporting into bdrv_all_*_snapshot functions migration: stop returning errno from load_snapshot() block: add ability to specify list of blockdevs during snapshot block: allow specifying name of block device for vmstate storage block: rename and alter bdrv_all_find_snapshot semantics migration: control whether snapshots are ovewritten migration: wire up support for snapshot device selection migration: introduce a delete_snapshot wrapper iotests: add support for capturing and matching QMP events migration: introduce snapshot-{save,load,delete} QMP commands Philippe Mathieu-Daud=C3=A9 (1): migration: Make save_snapshot() return bool, not 0/-1 block/monitor/block-hmp-cmds.c | 7 +- block/snapshot.c | 256 +++++++++++++++------ include/block/snapshot.h | 23 +- include/migration/snapshot.h | 47 +++- migration/savevm.c | 294 ++++++++++++++++++++---- monitor/hmp-cmds.c | 12 +- qapi/job.json | 9 +- qapi/migration.json | 121 ++++++++++ replay/replay-debugging.c | 12 +- replay/replay-snapshot.c | 5 +- softmmu/vl.c | 2 +- tests/qemu-iotests/267.out | 12 +- tests/qemu-iotests/310 | 385 +++++++++++++++++++++++++++++++ tests/qemu-iotests/310.out | 407 +++++++++++++++++++++++++++++++++ tests/qemu-iotests/common.qemu | 107 ++++++++- tests/qemu-iotests/group | 1 + 16 files changed, 1548 insertions(+), 152 deletions(-) create mode 100755 tests/qemu-iotests/310 create mode 100644 tests/qemu-iotests/310.out --=20 2.28.0