From nobody Fri Nov 14 19:46:53 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760939135; cv=none; d=zohomail.com; s=zohoarc; b=J1J3mQrtHljqipJK0xxuUV6OWSImgWPUNWc0O3qC4Z3NEGkJRHLoG3RGdU5SMEjB0RskyBG7o8Go5FF8zk6Q9JAW/evGj0vkbobM2LU8H1pW3CvsLO0XLCd/NMqsBSjIJ5kuD0Wl5jldINsUsiMWCAJjo1Bvymu/NH/ve4STsSc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760939135; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=EOtLxjwgk1w0JEzaRIvF5AGcRQ+yAHOjpo8WXDwVCMg=; b=W6beSxQS0I1FI5DkcmUna8SXbk9Lp8OKHCjIfGjivZk+T4BoTApQ/lM5J/iMqf5mTULwO2GxgG+h7xH4qN9izJGu6N97mxm4PQco5Aenx2VYRSs4yBDPFHsuQZJyC1Me1WugePnIfTnI0NqR6Ocwr+zvppjzXz+5HTxDGIBGGdI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760939135018773.8322815206465; Sun, 19 Oct 2025 22:45:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAihX-0003JI-4m; Mon, 20 Oct 2025 01:44:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAihV-0003IX-JF for qemu-devel@nongnu.org; Mon, 20 Oct 2025 01:44:57 -0400 Received: from forwardcorp1d.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAihT-0007uF-NE for qemu-devel@nongnu.org; Mon, 20 Oct 2025 01:44:57 -0400 Received: from mail-nwsmtp-smtp-corp-main-68.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-68.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:94a9:0:640:a3fa:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 51E09807C6; Mon, 20 Oct 2025 08:44:53 +0300 (MSK) Received: from dtalexundeer-nx.yandex-team.ru (unknown [2a02:6bf:803e:400:cd4:cafc:37a3:de4]) by mail-nwsmtp-smtp-corp-main-68.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id TiN4Nb4FbmI0-na5GOKoo; Mon, 20 Oct 2025 08:44:52 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760939092; bh=EOtLxjwgk1w0JEzaRIvF5AGcRQ+yAHOjpo8WXDwVCMg=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=qJ5JmOHEIYVdOgt/6kAAT8DVRhQOT6aKQb/a3u0srwS102Uzvc55b2Uo9BZ/mKNOQ YNs2OuiAkpBuh/QAiJc5qWu++PauzQCfQNBymFcU8EAhJSyYW+F8WlErlV3kcMzV4W O3fJBM+3u5mUsKSlORvMR7SL7lBQFZwHXXwP9wL8= Authentication-Results: mail-nwsmtp-smtp-corp-main-68.klg.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Alexandr Moshkov To: qemu-devel@nongnu.org Cc: Raphael Norwitz , "Michael S. Tsirkin" , Stefano Garzarella , Kevin Wolf , Hanna Reitz , Peter Xu , Fabiano Rosas , Eric Blake , Markus Armbruster , Alexandr Moshkov Subject: [PATCH 2/2] vhost-user-blk: support inflight migration Date: Mon, 20 Oct 2025 10:44:16 +0500 Message-Id: <20251020054413.2614932-3-dtalexundeer@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251020054413.2614932-1-dtalexundeer@yandex-team.ru> References: <20251020054413.2614932-1-dtalexundeer@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.200; envelope-from=dtalexundeer@yandex-team.ru; helo=forwardcorp1d.mail.yandex.net 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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760939139584154100 Content-Type: text/plain; charset="utf-8" In vhost_user_blk_stop() on incoming migration make force_stop =3D true, so GET_VRING_BASE will not be executed. Signed-off-by: Alexandr Moshkov --- hw/block/vhost-user-blk.c | 52 +++++++++++++++++++++++++++++++++++++++ migration/options.c | 7 ++++++ migration/options.h | 1 + qapi/migration.json | 9 +++++-- 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index c0cc5f6942..49f67d0451 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -31,6 +31,7 @@ #include "hw/virtio/virtio-access.h" #include "system/system.h" #include "system/runstate.h" +#include "migration/options.h" =20 static const int user_feature_bits[] =3D { VIRTIO_BLK_F_SIZE_MAX, @@ -224,6 +225,11 @@ static int vhost_user_blk_stop(VirtIODevice *vdev) force_stop =3D s->skip_get_vring_base_on_force_shutdown && qemu_force_shutdown_requested(); =20 + if (migrate_inflight_vhost_user_blk() && + runstate_check(RUN_STATE_FINISH_MIGRATE)) { + force_stop =3D true; + } + ret =3D force_stop ? vhost_dev_force_stop(&s->dev, vdev, true) : vhost_dev_stop(&s->dev, vdev, true); =20 @@ -568,12 +574,58 @@ static struct vhost_dev *vhost_user_blk_get_vhost(Vir= tIODevice *vdev) return &s->dev; } =20 +static int vhost_user_blk_save(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, JSONWriter *vmde= sc) +{ + VirtIODevice *vdev =3D pv; + VHostUserBlk *s =3D VHOST_USER_BLK(vdev); + + if (!migrate_inflight_vhost_user_blk()) { + return 0; + } + + vhost_dev_save_inflight(s->inflight, f); + + return 0; +} + +static int vhost_user_blk_load(QEMUFile *f, void *pv, size_t size, + const VMStateField *field) +{ + VirtIODevice *vdev =3D pv; + VHostUserBlk *s =3D VHOST_USER_BLK(vdev); + int ret; + + if (!migrate_inflight_vhost_user_blk()) { + return 0; + } + + ret =3D vhost_dev_load_inflight(s->inflight, f); + if (ret < 0) { + g_autofree char *path =3D object_get_canonical_path(OBJECT(vdev)); + error_report("%s [%s]: can't load in-flight requests", + path, TYPE_VHOST_USER_BLK); + return ret; + } + + return 0; +} + static const VMStateDescription vmstate_vhost_user_blk =3D { .name =3D "vhost-user-blk", .minimum_version_id =3D 1, .version_id =3D 1, .fields =3D (const VMStateField[]) { VMSTATE_VIRTIO_DEVICE, + { + .name =3D "backend state", + .info =3D &(const VMStateInfo) { + .name =3D "vhost-user-blk backend state", + .get =3D vhost_user_blk_load, + .put =3D vhost_user_blk_save, + }, + .flags =3D VMS_SINGLE, + }, VMSTATE_END_OF_LIST() }, }; diff --git a/migration/options.c b/migration/options.c index 5183112775..fcae2b4559 100644 --- a/migration/options.c +++ b/migration/options.c @@ -262,6 +262,13 @@ bool migrate_mapped_ram(void) return s->capabilities[MIGRATION_CAPABILITY_MAPPED_RAM]; } =20 +bool migrate_inflight_vhost_user_blk(void) +{ + MigrationState *s =3D migrate_get_current(); + + return s->capabilities[MIGRATION_CAPABILITY_INFLIGHT_VHOST_USER_BLK]; +} + bool migrate_ignore_shared(void) { MigrationState *s =3D migrate_get_current(); diff --git a/migration/options.h b/migration/options.h index 82d839709e..eab1485d1a 100644 --- a/migration/options.h +++ b/migration/options.h @@ -30,6 +30,7 @@ bool migrate_colo(void); bool migrate_dirty_bitmaps(void); bool migrate_events(void); bool migrate_mapped_ram(void); +bool migrate_inflight_vhost_user_blk(void); bool migrate_ignore_shared(void); bool migrate_late_block_activate(void); bool migrate_multifd(void); diff --git a/qapi/migration.json b/qapi/migration.json index be0f3fcc12..c9fea59515 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -517,9 +517,13 @@ # each RAM page. Requires a migration URI that supports seeking, # such as a file. (since 9.0) # +# @inflight-vhost-user-blk: If enabled, QEMU will migrate inflight +# region for vhost-user-blk. (since 10.2) +# # Features: # -# @unstable: Members @x-colo and @x-ignore-shared are experimental. +# @unstable: Members @x-colo and @x-ignore-shared, +# @inflight-vhost-user-blk are experimental. # @deprecated: Member @zero-blocks is deprecated as being part of # block migration which was already removed. # @@ -536,7 +540,8 @@ { 'name': 'x-ignore-shared', 'features': [ 'unstable' ] }, 'validate-uuid', 'background-snapshot', 'zero-copy-send', 'postcopy-preempt', 'switchover-ack', - 'dirty-limit', 'mapped-ram'] } + 'dirty-limit', 'mapped-ram', + { 'name': 'inflight-vhost-user-blk', 'features': [ 'unstable' ]= } ] } =20 ## # @MigrationCapabilityStatus: --=20 2.34.1