From nobody Sat Sep 26 20:52:34 2026 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=1789655456; cv=none; d=zohomail.com; s=zohoarc; b=ClcOI1ZviYLmO0eldDKZ6qz+/jIwzj/UJeTVhjQu++OL9h2cIuH0W2aohVP1zYlByHbc8PFrbytWCWjkVgJku2MavVRWXeCHo9FF5SqjlW+hb+0iGZA+tUzmrq/0Fh6djMKg9Qj1LcVffayw4vLRLLurIPH1Mg9oS+CJop7zImU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655456; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Xfkbyi87fRz5rDPa/M8HDUjZXHhRzlGN+HcbM3e2b4E=; b=ZQh5Dyz09NQJsp5TXJLb9/e3VErURDmLJWPuARXTiWCWscO65As0xs7db31dxQRKF3f7raI0OOeTO4Jhpzo4UImsoSDCPU2dW9XegT2C7Z7n5nq8JE+JcW5NB9wvMhU8EiSaC/NBrgFSU1+Hvr7/1pd0wrPKDmbjI8M2g29DmLk= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655455768624.9630339830169; Thu, 17 Sep 2026 07:30:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D85-0001oO-D4; Thu, 17 Sep 2026 10:30:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D81-0001nC-Km for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:21 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7y-0007es-T0 for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:21 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id F2524C0933; Thu, 17 Sep 2026 17:30:14 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-qGjcvWIO; Thu, 17 Sep 2026 17:30:14 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655414; bh=Xfkbyi87fRz5rDPa/M8HDUjZXHhRzlGN+HcbM3e2b4E=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=dcRzPTnduTKIhRd9RlAXjw1O28PPhxFijTCn1Pf6i2HE512RyHvMmd694ySclC/mT i1VJfxmYRWaL5y6AkV4gCmwHCOnzwEHfGBq72NRa0n4pZAEB/VsC/1uzLWK2RYnPOM QyvkC03J4ynwjZ4glO4/uOVXgrWXrZWvfUXnM2Ow= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 1/8] vhost-user: inline scrub_shadow_regions() into the only caller Date: Thu, 17 Sep 2026 17:30:04 +0300 Message-ID: <20260917143011.881361-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655460817158500 Content-Type: text/plain; charset="utf-8" To simplify further refactoring. Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 124 +++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 67 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index addbc59e704..a10352016a5 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -677,71 +677,6 @@ static inline bool reg_equal(struct vhost_memory_regio= n *shadow_reg, shadow_reg->memory_size =3D=3D vdev_reg->memory_size; } =20 -static void scrub_shadow_regions(struct vhost_dev *dev, - struct scrub_regions *add_reg, - int *nr_add_reg, - struct scrub_regions *rem_reg, - int *nr_rem_reg) -{ - struct vhost_user *u =3D dev->opaque; - bool found[VHOST_USER_MAX_RAM_SLOTS] =3D {}; - struct vhost_memory_region *reg, *shadow_reg; - int i, j, add_idx =3D 0, rm_idx =3D 0; - bool matching; - - /* - * Find memory regions present in our shadow state which are not in - * the device's current memory state. - * - * Mark regions in both the shadow and device state as "found". - */ - for (i =3D 0; i < u->num_shadow_regions; i++) { - shadow_reg =3D &u->shadow_regions[i]; - matching =3D false; - - for (j =3D 0; j < dev->mem->nregions; j++) { - reg =3D &dev->mem->regions[j]; - - if (reg_equal(shadow_reg, reg)) { - matching =3D true; - found[j] =3D true; - break; - } - } - - /* - * If the region was not found in the current device memory state - * create an entry for it in the removed list. - */ - if (!matching) { - rem_reg[rm_idx].region =3D shadow_reg; - rem_reg[rm_idx++].reg_idx =3D i; - } - } - - /* - * For regions not marked "found", create entries in the added list. - * - * Note their indexes in the device memory state and the indexes of th= eir - * file descriptors. - */ - for (i =3D 0; i < dev->mem->nregions; i++) { - reg =3D &dev->mem->regions[i]; - /* - * If the region was in both the shadow and device state we don't - * need to send a VHOST_USER_ADD_MEM_REG message for it. - */ - if (found[i]) { - continue; - } - - add_reg[add_idx].region =3D reg; - add_reg[add_idx].reg_idx =3D i; - add_idx++; - } - *nr_rem_reg =3D rm_idx; - *nr_add_reg =3D add_idx; -} =20 static int send_remove_regions(struct vhost_dev *dev, struct scrub_regions *remove_reg, @@ -853,18 +788,73 @@ static int vhost_user_add_remove_regions(struct vhost= _dev *dev, VhostUserMsg *msg, bool reply_supported) { + struct vhost_user *u =3D dev->opaque; struct scrub_regions add_reg[VHOST_USER_MAX_RAM_SLOTS]; struct scrub_regions rem_reg[VHOST_USER_MAX_RAM_SLOTS]; int nr_add_reg, nr_rem_reg; int ret; + bool found[VHOST_USER_MAX_RAM_SLOTS] =3D {}; + struct vhost_memory_region *reg, *shadow_reg; + int i, j, add_idx =3D 0, rm_idx =3D 0; + bool matching; =20 msg->hdr.size =3D sizeof(msg->payload.mem_reg); =20 /* Ensure nregions fits the fixed-size arrays used below. */ assert(dev->mem->nregions <=3D VHOST_USER_MAX_RAM_SLOTS); =20 - /* Find the regions which need to be removed or added. */ - scrub_shadow_regions(dev, add_reg, &nr_add_reg, rem_reg, &nr_rem_reg); + /* + * Find memory regions present in our shadow state which are not in + * the device's current memory state. + * + * Mark regions in both the shadow and device state as "found". + */ + for (i =3D 0; i < u->num_shadow_regions; i++) { + shadow_reg =3D &u->shadow_regions[i]; + matching =3D false; + + for (j =3D 0; j < dev->mem->nregions; j++) { + reg =3D &dev->mem->regions[j]; + + if (reg_equal(shadow_reg, reg)) { + matching =3D true; + found[j] =3D true; + break; + } + } + + /* + * If the region was not found in the current device memory state + * create an entry for it in the removed list. + */ + if (!matching) { + rem_reg[rm_idx].region =3D shadow_reg; + rem_reg[rm_idx++].reg_idx =3D i; + } + } + + /* + * For regions not marked "found", create entries in the added list. + * + * Note their indexes in the device memory state and the indexes of th= eir + * file descriptors. + */ + for (i =3D 0; i < dev->mem->nregions; i++) { + reg =3D &dev->mem->regions[i]; + /* + * If the region was in both the shadow and device state we don't + * need to send a VHOST_USER_ADD_MEM_REG message for it. + */ + if (found[i]) { + continue; + } + + add_reg[add_idx].region =3D reg; + add_reg[add_idx].reg_idx =3D i; + add_idx++; + } + nr_rem_reg =3D rm_idx; + nr_add_reg =3D add_idx; =20 if (nr_rem_reg) { ret =3D send_remove_regions(dev, rem_reg, nr_rem_reg, msg, --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655493; cv=none; d=zohomail.com; s=zohoarc; b=fkhLPIrz93HAZJqeeyV1Ecu4qh2Xnu8JHKApzMnJG3QYwTRkCbRl+85uiut4cqIxCdG73ztL/xlt7AWiT9M/ZzdAxQHoJyEALmR3Bi2RGLcyyGElEg9+LFsJ7erIhQiOWTgyxbowbiS7oYd6FLvvlvBKkuQzxwwct6DRVhIHe84= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655493; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=CtLpWH07Y8BwA6LCVWVsdqFQc/21RgOgfTEdimvuzC4=; b=KzGyWE2/SJNdrvtir2PKHprV95DLz6H9c8+MRArrxBX/Qsfn+FYsT49pTphzfteDUecUnBx6/ZXvnkO+zSzn/kyT7rZQTzTUEI4kvq3rKqPF91hyUasFA80wkGN4Vzs54AmwC2BqsoVJ7CsQJCKRiB1NO9cr/hj336AFTugztUI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655493988438.41871567433714; Thu, 17 Sep 2026 07:31:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8B-0001ql-SG; Thu, 17 Sep 2026 10:30:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D82-0001nE-0R for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7y-0007ex-Tq for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:21 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id 935ACC097B; Thu, 17 Sep 2026 17:30:15 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-X5EaQAze; Thu, 17 Sep 2026 17:30:15 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655415; bh=CtLpWH07Y8BwA6LCVWVsdqFQc/21RgOgfTEdimvuzC4=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=WDwchhRF+fG9qd8TTrHG8UNWvdlfPV2wYLCXffRkQrnsYi2J5jq64M5g4Sb+XjDqe sI9QAY9DwAOAuF/Ju/7/SWwxFeBVDlhfNZII0EzFrqgNh+Y8C+Ddu4r+Ab+/S9ey2t 32wuyEpS7gSklJRra4fbZzZwp3ZcCOqWzxn3Qkcc= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 2/8] vhost-user: introduce send_add_rem_mem_reg() Date: Thu, 17 Sep 2026 17:30:05 +0300 Message-ID: <20260917143011.881361-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655497819158500 Content-Type: text/plain; charset="utf-8" Add a classic wrapper to send a protocol message. This simplifies the logic a lot around vhost_user_add_remove_regions(). Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 111 +++++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index a10352016a5..8eaa65392a7 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -677,17 +677,61 @@ static inline bool reg_equal(struct vhost_memory_regi= on *shadow_reg, shadow_reg->memory_size =3D=3D vdev_reg->memory_size; } =20 +static int send_add_rem_mem_reg(struct vhost_dev *dev, + struct vhost_memory_region *reg, + bool add, uint64_t mmap_offset, int fd) +{ + int ret; + VhostUserMemoryRegion region_buffer; + bool reply_supported =3D + vhost_user_has_protocol_feature(dev, VHOST_USER_PROTOCOL_F_REPLY_A= CK); + VhostUserMsg msg =3D { + .hdr.flags =3D VHOST_USER_VERSION, + }; + int *fds, fd_num; + + msg.hdr.size =3D sizeof(msg.payload.mem_reg); + + if (add) { + msg.hdr.request =3D VHOST_USER_ADD_MEM_REG; + fds =3D &fd; + fd_num =3D 1; + } else { + msg.hdr.request =3D VHOST_USER_REM_MEM_REG; + fds =3D NULL; + fd_num =3D 0; + } + + if (reply_supported) { + msg.hdr.flags |=3D VHOST_USER_NEED_REPLY_MASK; + } + + vhost_user_fill_msg_region(dev, ®ion_buffer, reg, mmap_offset); + msg.payload.mem_reg.region =3D region_buffer; + + ret =3D vhost_user_write(dev, &msg, fds, fd_num); + if (ret < 0) { + return ret; + } + + if (reply_supported) { + ret =3D process_message_reply(dev, &msg); + if (ret < 0) { + return ret; + } + } + + return 0; +} =20 static int send_remove_regions(struct vhost_dev *dev, struct scrub_regions *remove_reg, - int nr_rem_reg, VhostUserMsg *msg, - bool reply_supported) + int nr_rem_reg) { struct vhost_user *u =3D dev->opaque; struct vhost_memory_region *shadow_reg; int i, fd, shadow_reg_idx, ret; ram_addr_t offset; - VhostUserMemoryRegion region_buffer; =20 /* * The regions in remove_reg appear in the same order they do in the @@ -701,21 +745,10 @@ static int send_remove_regions(struct vhost_dev *dev, vhost_user_get_mr_data(shadow_reg->userspace_addr, &offset, &fd); =20 if (fd > 0) { - msg->hdr.request =3D VHOST_USER_REM_MEM_REG; - vhost_user_fill_msg_region(dev, ®ion_buffer, shadow_reg, 0); - msg->payload.mem_reg.region =3D region_buffer; - - ret =3D vhost_user_write(dev, msg, NULL, 0); + ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); if (ret < 0) { return ret; } - - if (reply_supported) { - ret =3D process_message_reply(dev, msg); - if (ret) { - return ret; - } - } } =20 /* @@ -733,15 +766,12 @@ static int send_remove_regions(struct vhost_dev *dev, } =20 static int send_add_regions(struct vhost_dev *dev, - struct scrub_regions *add_reg, int nr_add_reg, - VhostUserMsg *msg, - bool reply_supported) + struct scrub_regions *add_reg, int nr_add_reg) { struct vhost_user *u =3D dev->opaque; int i, fd, ret; struct vhost_memory_region *reg; ram_addr_t offset; - VhostUserMemoryRegion region_buffer; =20 for (i =3D 0; i < nr_add_reg; i++) { reg =3D add_reg[i].region; @@ -749,21 +779,10 @@ static int send_add_regions(struct vhost_dev *dev, vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd); =20 if (fd > 0) { - msg->hdr.request =3D VHOST_USER_ADD_MEM_REG; - vhost_user_fill_msg_region(dev, ®ion_buffer, reg, offset); - msg->payload.mem_reg.region =3D region_buffer; - - ret =3D vhost_user_write(dev, msg, &fd, 1); + ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); if (ret < 0) { return ret; } - - if (reply_supported) { - ret =3D process_message_reply(dev, msg); - if (ret) { - return ret; - } - } } =20 /* @@ -784,9 +803,7 @@ static int send_add_regions(struct vhost_dev *dev, return 0; } =20 -static int vhost_user_add_remove_regions(struct vhost_dev *dev, - VhostUserMsg *msg, - bool reply_supported) +static int vhost_user_add_remove_regions(struct vhost_dev *dev) { struct vhost_user *u =3D dev->opaque; struct scrub_regions add_reg[VHOST_USER_MAX_RAM_SLOTS]; @@ -798,8 +815,6 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev, int i, j, add_idx =3D 0, rm_idx =3D 0; bool matching; =20 - msg->hdr.size =3D sizeof(msg->payload.mem_reg); - /* Ensure nregions fits the fixed-size arrays used below. */ assert(dev->mem->nregions <=3D VHOST_USER_MAX_RAM_SLOTS); =20 @@ -857,16 +872,14 @@ static int vhost_user_add_remove_regions(struct vhost= _dev *dev, nr_add_reg =3D add_idx; =20 if (nr_rem_reg) { - ret =3D send_remove_regions(dev, rem_reg, nr_rem_reg, msg, - reply_supported); + ret =3D send_remove_regions(dev, rem_reg, nr_rem_reg); if (ret < 0) { return ret; } } =20 if (nr_add_reg) { - ret =3D send_add_regions(dev, add_reg, nr_add_reg, msg, - reply_supported); + ret =3D send_add_regions(dev, add_reg, nr_add_reg); if (ret < 0) { return ret; } @@ -1006,20 +1019,20 @@ static int vhost_user_set_mem_table(struct vhost_de= v *dev, return vhost_user_set_mem_table_postcopy(dev, mem, config_mem_slot= s); } =20 - VhostUserMsg msg =3D { - .hdr.flags =3D VHOST_USER_VERSION, - }; - - if (reply_supported) { - msg.hdr.flags |=3D VHOST_USER_NEED_REPLY_MASK; - } - if (config_mem_slots) { - ret =3D vhost_user_add_remove_regions(dev, &msg, reply_supported); + ret =3D vhost_user_add_remove_regions(dev); if (ret < 0) { return ret; } } else { + VhostUserMsg msg =3D { + .hdr.flags =3D VHOST_USER_VERSION, + }; + + if (reply_supported) { + msg.hdr.flags |=3D VHOST_USER_NEED_REPLY_MASK; + } + ret =3D vhost_user_fill_set_mem_table_msg(u, dev, &msg, fds, &fd_n= um, false); if (ret < 0) { --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655499; cv=none; d=zohomail.com; s=zohoarc; b=j5gIguK2gR4JlQHP8LbmqPOrQ7fYvHVCTauIj6nKB++aAVVB+pfzeH3zvB8fWfiY4DHEGvXGpj7pHMT6FXHBRavSwFVETzFv1+zy5w3ayCY4BglAFkkRCcufTlFeR+QKhziO30KjX9Vo0Lktlfl52FldMl1GLxqWrv4Z/Px3Bxg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655499; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=30gY0D+cOmoXAiLOdYt0Hf63YU23qkYi5n8B76CUyJo=; b=IHe+Q5xDAIuIxuDQx+z0XU0Q/+V1L1fKbp56va6mFnVJfC6ax3Gp7hKbG97vg3k85oz/YgVNDn5377pIWUBdLJqpGFnijECN+1yC/gtXYm040AFzn22+wxIgMiF7VvM9dUoYg+gV5IAwkkuV1QoE9UmgUVKfNrfVtdmmFtiE7z8= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178965549892373.04074937390885; Thu, 17 Sep 2026 07:31:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8B-0001qZ-LJ; Thu, 17 Sep 2026 10:30:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D82-0001nn-P1 for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7y-0007f1-Td for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id 156FBC09A2; Thu, 17 Sep 2026 17:30:16 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-zbIGvtFc; Thu, 17 Sep 2026 17:30:15 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655415; bh=30gY0D+cOmoXAiLOdYt0Hf63YU23qkYi5n8B76CUyJo=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=LR99UGOv30j+mC/EgzbQSfXdQSUIvohaphl+I27ZSC1/doz4X7RDpr+wNljSVBDsQ MF5hHR5eGPsh3hLMtRtVdao/8pCMN6aKRRbgOQZIcS3tWmqyJMISiGa2fj3ydznwM0 4lIQgOxAZHfWbto7WAsgOz9HpvOYKinopM1KaMXE= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 3/8] vhost-user: store into shadow_regions only regions we sent to backend Date: Thu, 17 Sep 2026 17:30:06 +0300 Message-ID: <20260917143011.881361-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655500053158500 Content-Type: text/plain; charset="utf-8" No reason to store regions, which we actually don't send. We do nothing with them. Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 8eaa65392a7..61208597c25 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -730,8 +730,7 @@ static int send_remove_regions(struct vhost_dev *dev, { struct vhost_user *u =3D dev->opaque; struct vhost_memory_region *shadow_reg; - int i, fd, shadow_reg_idx, ret; - ram_addr_t offset; + int i, shadow_reg_idx, ret; =20 /* * The regions in remove_reg appear in the same order they do in the @@ -742,13 +741,9 @@ static int send_remove_regions(struct vhost_dev *dev, shadow_reg =3D remove_reg[i].region; shadow_reg_idx =3D remove_reg[i].reg_idx; =20 - vhost_user_get_mr_data(shadow_reg->userspace_addr, &offset, &fd); - - if (fd > 0) { - ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); - if (ret < 0) { - return ret; - } + ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); + if (ret < 0) { + return ret; } =20 /* @@ -777,12 +772,13 @@ static int send_add_regions(struct vhost_dev *dev, reg =3D add_reg[i].region; =20 vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd); + if (fd <=3D 0) { + continue; + } =20 - if (fd > 0) { - ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); - if (ret < 0) { - return ret; - } + ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); + if (ret < 0) { + return ret; } =20 /* --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655503; cv=none; d=zohomail.com; s=zohoarc; b=iUH1Vkk9YeUa5hF6DDQh2Fjcz4Jq7eBANYtAp9vuW5VnujarNsH9NHTvtGieOCXXtl78wyqLWTOAmVrLHhI1Gjfk8eWwN0J36Gjsh2a6DevHlpTlEvlAZlCtVdBg2ChN+LlEYITV5IriZ75E47GDNAPdENNDjMWOuV9TI5+QY+s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655503; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=9QE9D3lTMKOnPjqRZYXLeS4RarnaWTjZlO8DhtdJJP0=; b=CPlipOU/+nfGGNiv1K7aGIwxgJ26PSWbH4Nq2RDBpkkOElgxxG4NuTz23vxy8/A5WHbG6xgE/Mz3Z7Sn+zl2eT1MXUIP1+AeJFPc/kus5nlwnB8Soi+JHu9a8aiHafAHZbnu+yYuychpzar/rf7PpJ8U9Oh9gXKJ4duJXvRUXAQ= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655503165641.0737557670759; Thu, 17 Sep 2026 07:31:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8A-0001qG-TS; Thu, 17 Sep 2026 10:30:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D81-0001nB-JM for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:21 -0400 Received: from forwardcorp1a.mail.yandex.net ([178.154.239.72]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7y-0007fD-Sg for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:21 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id 9C650C0A03; Thu, 17 Sep 2026 17:30:16 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-0pBXwqeX; Thu, 17 Sep 2026 17:30:16 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655416; bh=9QE9D3lTMKOnPjqRZYXLeS4RarnaWTjZlO8DhtdJJP0=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=lSoe7exIeAa0V+t/SI3mazwXLEOjBF5PeP3VPsVI8lBlMGMlqCqTAorGvGiQc4uyR t4xjyKknoMEMaNAOm41fRqMzjc49eskqi5z8qyU3orcYQPuav2wVyMYPPM4AWYm6cI 4cGVprN7U8+Q7XKy3s8PZF7n+KnRe/Xr5dQgLGiE= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 4/8] vhost-user: add send_add_region() and send_remove_region() helpers Date: Thu, 17 Sep 2026 17:30:07 +0300 Message-ID: <20260917143011.881361-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=178.154.239.72; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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, 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: qemu development 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: 1789655505921158500 Content-Type: text/plain; charset="utf-8" Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 102 ++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 43 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 61208597c25..4492374eab0 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -724,13 +724,66 @@ static int send_add_rem_mem_reg(struct vhost_dev *dev, return 0; } =20 +static int send_remove_region(struct vhost_dev *dev, + int shadow_reg_idx) +{ + struct vhost_user *u =3D dev->opaque; + struct vhost_memory_region *shadow_reg =3D &u->shadow_regions[shadow_r= eg_idx]; + int ret; + + ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); + if (ret < 0) { + return ret; + } + + memmove(&u->shadow_regions[shadow_reg_idx], + &u->shadow_regions[shadow_reg_idx + 1], + sizeof(struct vhost_memory_region) * + (u->num_shadow_regions - shadow_reg_idx - 1)); + u->num_shadow_regions--; + + return 0; +} + +static int send_add_region(struct vhost_dev *dev, + struct vhost_memory_region *reg) +{ + struct vhost_user *u =3D dev->opaque; + int fd, ret; + ram_addr_t offset; + + vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd); + if (fd <=3D 0) { + return 0; + } + + ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); + if (ret < 0) { + return ret; + } + + /* + * At this point, we know the backend has mapped in the new + * region, if the region has a valid file descriptor. + * + * The region should now be added to the shadow table. + */ + u->shadow_regions[u->num_shadow_regions].guest_phys_addr =3D + reg->guest_phys_addr; + u->shadow_regions[u->num_shadow_regions].userspace_addr =3D + reg->userspace_addr; + u->shadow_regions[u->num_shadow_regions].memory_size =3D + reg->memory_size; + u->num_shadow_regions++; + + return 0; +} + static int send_remove_regions(struct vhost_dev *dev, struct scrub_regions *remove_reg, int nr_rem_reg) { - struct vhost_user *u =3D dev->opaque; - struct vhost_memory_region *shadow_reg; - int i, shadow_reg_idx, ret; + int i, ret; =20 /* * The regions in remove_reg appear in the same order they do in the @@ -738,23 +791,10 @@ static int send_remove_regions(struct vhost_dev *dev, * through remove_reg backwards. */ for (i =3D nr_rem_reg - 1; i >=3D 0; i--) { - shadow_reg =3D remove_reg[i].region; - shadow_reg_idx =3D remove_reg[i].reg_idx; - - ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); + ret =3D send_remove_region(dev, remove_reg[i].reg_idx); if (ret < 0) { return ret; } - - /* - * At this point we know the backend has unmapped the region. It i= s now - * safe to remove it from the shadow table. - */ - memmove(&u->shadow_regions[shadow_reg_idx], - &u->shadow_regions[shadow_reg_idx + 1], - sizeof(struct vhost_memory_region) * - (u->num_shadow_regions - shadow_reg_idx - 1)); - u->num_shadow_regions--; } =20 return 0; @@ -763,37 +803,13 @@ static int send_remove_regions(struct vhost_dev *dev, static int send_add_regions(struct vhost_dev *dev, struct scrub_regions *add_reg, int nr_add_reg) { - struct vhost_user *u =3D dev->opaque; - int i, fd, ret; - struct vhost_memory_region *reg; - ram_addr_t offset; + int i, ret; =20 for (i =3D 0; i < nr_add_reg; i++) { - reg =3D add_reg[i].region; - - vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd); - if (fd <=3D 0) { - continue; - } - - ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); + ret =3D send_add_region(dev, add_reg[i].region); if (ret < 0) { return ret; } - - /* - * At this point, we know the backend has mapped in the new - * region, if the region has a valid file descriptor. - * - * The region should now be added to the shadow table. - */ - u->shadow_regions[u->num_shadow_regions].guest_phys_addr =3D - reg->guest_phys_addr; - u->shadow_regions[u->num_shadow_regions].userspace_addr =3D - reg->userspace_addr; - u->shadow_regions[u->num_shadow_regions].memory_size =3D - reg->memory_size; - u->num_shadow_regions++; } =20 return 0; --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655485; cv=none; d=zohomail.com; s=zohoarc; b=F3eDgubDumcIMo3/2AObUEnx0imWAkCJWd2Mz44a+U4DOXBrFA38kNzt8Qlrd92nRg0EiLUyhABAkdbpd8+wXAsbZVeOxEBjqz8xC2Vo4V6sJS7mWAp3xL7vegM5mcrHrXoPRsNcs2pnOZL3jx0bE9cLANDOZmglpPibCqhXc1E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655485; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JhzSinP7fyD6Ftn7j0lcOm2RHltzwWjqlGDzAyQEdGw=; b=Nvu1ILJBzVPSBFM2ykfTt9CWBZBJWAJkpdKeVXMPD3pfDlJ7wcWU7MWAjep5+m61euxy22hD39QWlQVVedN0Mhtu6b1tIM+038h9h/J1epVzmHLvVtoh/jOOKAi2ruaH0rAjuykttH/gAoip4/fZ3oroMYflK4KpQZM1HoQYxJk= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655485967395.87091058497685; Thu, 17 Sep 2026 07:31:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8C-0001rH-Ij; Thu, 17 Sep 2026 10:30:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D83-0001nq-0E for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:23 -0400 Received: from forwardcorp1a.mail.yandex.net ([178.154.239.72]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7z-0007fG-GU for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id 2511CC0A24; Thu, 17 Sep 2026 17:30:17 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-QwkI9Off; Thu, 17 Sep 2026 17:30:16 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655416; bh=JhzSinP7fyD6Ftn7j0lcOm2RHltzwWjqlGDzAyQEdGw=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=DUdHD5KLh0eG5zw4If7zBOHAOkkpIIDszmkuQX5HyEgMc4kll+O2autXkIyCXtc6S U3899pd3CZ0yl5ol74ROKxNRcb8lXW1r2oMHtKAbMh6ieWEyPST3DyjHg2dyWdstMn Cac643uNVJ00N1eGkNWVYhGWA64DtCT3aCZRj9sg= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 5/8] vhost-user: vhost_user_add_remove_regions(): drop extra reg variable Date: Thu, 17 Sep 2026 17:30:08 +0300 Message-ID: <20260917143011.881361-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=178.154.239.72; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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, 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: qemu development 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: 1789655488265158500 Content-Type: text/plain; charset="utf-8" Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 4492374eab0..40f247a355e 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -823,7 +823,7 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev) int nr_add_reg, nr_rem_reg; int ret; bool found[VHOST_USER_MAX_RAM_SLOTS] =3D {}; - struct vhost_memory_region *reg, *shadow_reg; + struct vhost_memory_region *shadow_reg; int i, j, add_idx =3D 0, rm_idx =3D 0; bool matching; =20 @@ -841,9 +841,7 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev) matching =3D false; =20 for (j =3D 0; j < dev->mem->nregions; j++) { - reg =3D &dev->mem->regions[j]; - - if (reg_equal(shadow_reg, reg)) { + if (reg_equal(shadow_reg, &dev->mem->regions[j])) { matching =3D true; found[j] =3D true; break; @@ -867,7 +865,6 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev) * file descriptors. */ for (i =3D 0; i < dev->mem->nregions; i++) { - reg =3D &dev->mem->regions[i]; /* * If the region was in both the shadow and device state we don't * need to send a VHOST_USER_ADD_MEM_REG message for it. @@ -876,7 +873,7 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev) continue; } =20 - add_reg[add_idx].region =3D reg; + add_reg[add_idx].region =3D &dev->mem->regions[i]; add_reg[add_idx].reg_idx =3D i; add_idx++; } --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655499; cv=none; d=zohomail.com; s=zohoarc; b=lfrchUeTTB1GlC42wNaTD0chAubds/cPEvr7FrRxl4CAPL1xJW1nnq1ZCT5JV78Q3VnAHXWI6QfJTwcoR+wyZGAkpwrsaC7RcCPo3K3oTEx8RmGLwUIJoHSmhyw/chyMhGDhs8iQBrafnI7KU86dycCjnfTgA2BnytrlzWHez9A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655499; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3qqJClZdklWOU1cccdd9+lFLgjYbdoraqMIJSg2ic1E=; b=DhUoQeqXQbEaj44pwTTm2w5TamCRmyObz6gSeNUsG9E1MqSPQNXHhwtLJrvmRz+R/0KmcEtbHSFmcxgFiuW35MBSJr6tsFHTBm1rmTTy/CYLJMVNEyqLBfS7Dm9eSB5OD6WkA2nDPaggrs5a+j2I3L79vl2CYZDHL5zCRwNPkS0= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655499419590.3620465326026; Thu, 17 Sep 2026 07:31:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8D-0001rr-BU; Thu, 17 Sep 2026 10:30:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D83-0001np-0H for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:23 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7z-0007fZ-7v for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id C4429C0A28; Thu, 17 Sep 2026 17:30:17 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-uAtyFnSS; Thu, 17 Sep 2026 17:30:17 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655417; bh=3qqJClZdklWOU1cccdd9+lFLgjYbdoraqMIJSg2ic1E=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=qf5paGipxbe4PS7Um4iFmZWDF5MKiVKs6i4gsH7EAYfMYR6DgqtHUgSFXIGceb6X/ i8qQ8ikesOmuCk74C2vm6YQBkigfauzCi4RmcpcMmqtsHrqxFU3bygOqp5dSMHLvuz YZ9dSTenmnkF4Dqw0j3hO7bcsl6w9e3ZM5PD5RTA= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 6/8] vhost-user: move to QLIST for shadow_regions Date: Thu, 17 Sep 2026 17:30:09 +0300 Message-ID: <20260917143011.881361-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655501833158500 Content-Type: text/plain; charset="utf-8" And finally we get rid of extra intermediate add/remove arrays. Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 165 +++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 106 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 40f247a355e..100621a4329 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -322,6 +322,13 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION (0x1) =20 +typedef struct VhostShadowRegion { + uint64_t guest_phys_addr; + uint64_t memory_size; /* bytes */ + uint64_t userspace_addr; + QLIST_ENTRY(VhostShadowRegion) next; +} VhostShadowRegion; + struct vhost_user { struct vhost_dev *dev; /* Shared between vhost devs of the same virtio device */ @@ -345,8 +352,7 @@ struct vhost_user { bool postcopy_listen; =20 /* Our current regions */ - int num_shadow_regions; - struct vhost_memory_region shadow_regions[VHOST_USER_MAX_RAM_SLOTS]; + QLIST_HEAD(, VhostShadowRegion) shadow_regions; =20 /** * @protocol_features: the vhost-user protocol feature set by @@ -613,6 +619,20 @@ static void vhost_user_fill_msg_region(struct vhost_de= v *dev, dst->mmap_offset =3D mmap_offset; } =20 +static void vhost_user_fill_rem_msg_region(struct vhost_dev *dev, + VhostUserMemoryRegion *dst, + VhostShadowRegion *src) +{ + bool use_phys =3D vhost_user_gpa_addresses(dev); + + assert(src !=3D NULL && dst !=3D NULL); + + dst->userspace_addr =3D use_phys ? src->guest_phys_addr : src->userspa= ce_addr; + dst->memory_size =3D src->memory_size; + dst->guest_phys_addr =3D src->guest_phys_addr; + dst->mmap_offset =3D 0; +} + static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u, struct vhost_dev *dev, VhostUserMsg *msg, @@ -669,7 +689,7 @@ static int vhost_user_fill_set_mem_table_msg(struct vho= st_user *u, return 0; } =20 -static inline bool reg_equal(struct vhost_memory_region *shadow_reg, +static inline bool reg_equal(VhostShadowRegion *shadow_reg, struct vhost_memory_region *vdev_reg) { return shadow_reg->guest_phys_addr =3D=3D vdev_reg->guest_phys_addr && @@ -678,8 +698,9 @@ static inline bool reg_equal(struct vhost_memory_region= *shadow_reg, } =20 static int send_add_rem_mem_reg(struct vhost_dev *dev, - struct vhost_memory_region *reg, - bool add, uint64_t mmap_offset, int fd) + struct vhost_memory_region *add_reg, + VhostShadowRegion *rem_reg, + uint64_t mmap_offset, int fd) { int ret; VhostUserMemoryRegion region_buffer; @@ -690,23 +711,26 @@ static int send_add_rem_mem_reg(struct vhost_dev *dev, }; int *fds, fd_num; =20 + assert(!add_reg !=3D !rem_reg); + msg.hdr.size =3D sizeof(msg.payload.mem_reg); =20 - if (add) { + if (add_reg) { msg.hdr.request =3D VHOST_USER_ADD_MEM_REG; fds =3D &fd; fd_num =3D 1; + vhost_user_fill_msg_region(dev, ®ion_buffer, add_reg, mmap_offs= et); } else { msg.hdr.request =3D VHOST_USER_REM_MEM_REG; fds =3D NULL; fd_num =3D 0; + vhost_user_fill_rem_msg_region(dev, ®ion_buffer, rem_reg); } =20 if (reply_supported) { msg.hdr.flags |=3D VHOST_USER_NEED_REPLY_MASK; } =20 - vhost_user_fill_msg_region(dev, ®ion_buffer, reg, mmap_offset); msg.payload.mem_reg.region =3D region_buffer; =20 ret =3D vhost_user_write(dev, &msg, fds, fd_num); @@ -725,22 +749,17 @@ static int send_add_rem_mem_reg(struct vhost_dev *dev, } =20 static int send_remove_region(struct vhost_dev *dev, - int shadow_reg_idx) + VhostShadowRegion *shadow_reg) { - struct vhost_user *u =3D dev->opaque; - struct vhost_memory_region *shadow_reg =3D &u->shadow_regions[shadow_r= eg_idx]; int ret; =20 - ret =3D send_add_rem_mem_reg(dev, shadow_reg, false, 0, 0); + ret =3D send_add_rem_mem_reg(dev, NULL, shadow_reg, 0, 0); if (ret < 0) { return ret; } =20 - memmove(&u->shadow_regions[shadow_reg_idx], - &u->shadow_regions[shadow_reg_idx + 1], - sizeof(struct vhost_memory_region) * - (u->num_shadow_regions - shadow_reg_idx - 1)); - u->num_shadow_regions--; + QLIST_REMOVE(shadow_reg, next); + g_free(shadow_reg); =20 return 0; } @@ -751,13 +770,14 @@ static int send_add_region(struct vhost_dev *dev, struct vhost_user *u =3D dev->opaque; int fd, ret; ram_addr_t offset; + VhostShadowRegion *new_reg; =20 vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd); if (fd <=3D 0) { return 0; } =20 - ret =3D send_add_rem_mem_reg(dev, reg, true, offset, fd); + ret =3D send_add_rem_mem_reg(dev, reg, NULL, offset, fd); if (ret < 0) { return ret; } @@ -768,49 +788,13 @@ static int send_add_region(struct vhost_dev *dev, * * The region should now be added to the shadow table. */ - u->shadow_regions[u->num_shadow_regions].guest_phys_addr =3D - reg->guest_phys_addr; - u->shadow_regions[u->num_shadow_regions].userspace_addr =3D - reg->userspace_addr; - u->shadow_regions[u->num_shadow_regions].memory_size =3D - reg->memory_size; - u->num_shadow_regions++; - - return 0; -} - -static int send_remove_regions(struct vhost_dev *dev, - struct scrub_regions *remove_reg, - int nr_rem_reg) -{ - int i, ret; - - /* - * The regions in remove_reg appear in the same order they do in the - * shadow table. Therefore we can minimize memory copies by iterating - * through remove_reg backwards. - */ - for (i =3D nr_rem_reg - 1; i >=3D 0; i--) { - ret =3D send_remove_region(dev, remove_reg[i].reg_idx); - if (ret < 0) { - return ret; - } - } - - return 0; -} - -static int send_add_regions(struct vhost_dev *dev, - struct scrub_regions *add_reg, int nr_add_reg) -{ - int i, ret; - - for (i =3D 0; i < nr_add_reg; i++) { - ret =3D send_add_region(dev, add_reg[i].region); - if (ret < 0) { - return ret; - } - } + new_reg =3D g_new(VhostShadowRegion, 1); + *new_reg =3D (VhostShadowRegion) { + .guest_phys_addr =3D reg->guest_phys_addr, + .userspace_addr =3D reg->userspace_addr, + .memory_size =3D reg->memory_size, + }; + QLIST_INSERT_HEAD(&u->shadow_regions, new_reg, next); =20 return 0; } @@ -818,26 +802,16 @@ static int send_add_regions(struct vhost_dev *dev, static int vhost_user_add_remove_regions(struct vhost_dev *dev) { struct vhost_user *u =3D dev->opaque; - struct scrub_regions add_reg[VHOST_USER_MAX_RAM_SLOTS]; - struct scrub_regions rem_reg[VHOST_USER_MAX_RAM_SLOTS]; - int nr_add_reg, nr_rem_reg; int ret; bool found[VHOST_USER_MAX_RAM_SLOTS] =3D {}; - struct vhost_memory_region *shadow_reg; - int i, j, add_idx =3D 0, rm_idx =3D 0; + VhostShadowRegion *shadow_reg, *next_reg; + int i, j; bool matching; =20 - /* Ensure nregions fits the fixed-size arrays used below. */ + /* Ensure nregions fits the fixed-size array used below. */ assert(dev->mem->nregions <=3D VHOST_USER_MAX_RAM_SLOTS); =20 - /* - * Find memory regions present in our shadow state which are not in - * the device's current memory state. - * - * Mark regions in both the shadow and device state as "found". - */ - for (i =3D 0; i < u->num_shadow_regions; i++) { - shadow_reg =3D &u->shadow_regions[i]; + QLIST_FOREACH_SAFE(shadow_reg, &u->shadow_regions, next, next_reg) { matching =3D false; =20 for (j =3D 0; j < dev->mem->nregions; j++) { @@ -848,47 +822,20 @@ static int vhost_user_add_remove_regions(struct vhost= _dev *dev) } } =20 - /* - * If the region was not found in the current device memory state - * create an entry for it in the removed list. - */ if (!matching) { - rem_reg[rm_idx].region =3D shadow_reg; - rem_reg[rm_idx++].reg_idx =3D i; + ret =3D send_remove_region(dev, shadow_reg); + if (ret) { + return ret; + } } } =20 - /* - * For regions not marked "found", create entries in the added list. - * - * Note their indexes in the device memory state and the indexes of th= eir - * file descriptors. - */ for (i =3D 0; i < dev->mem->nregions; i++) { - /* - * If the region was in both the shadow and device state we don't - * need to send a VHOST_USER_ADD_MEM_REG message for it. - */ if (found[i]) { continue; } =20 - add_reg[add_idx].region =3D &dev->mem->regions[i]; - add_reg[add_idx].reg_idx =3D i; - add_idx++; - } - nr_rem_reg =3D rm_idx; - nr_add_reg =3D add_idx; - - if (nr_rem_reg) { - ret =3D send_remove_regions(dev, rem_reg, nr_rem_reg); - if (ret < 0) { - return ret; - } - } - - if (nr_add_reg) { - ret =3D send_add_regions(dev, add_reg, nr_add_reg); + ret =3D send_add_region(dev, &dev->mem->regions[i]); if (ret < 0) { return ret; } @@ -2450,6 +2397,7 @@ static int vhost_user_backend_init(struct vhost_dev *= dev, void *opaque, u =3D g_new0(struct vhost_user, 1); u->user =3D vus; u->dev =3D dev; + QLIST_INIT(&u->shadow_regions); dev->opaque =3D u; =20 err =3D vhost_user_get_features(dev, &features); @@ -2592,6 +2540,7 @@ static int vhost_user_backend_init(struct vhost_dev *= dev, void *opaque, static int vhost_user_backend_cleanup(struct vhost_dev *dev) { struct vhost_user *u; + VhostShadowRegion *shadow_reg; =20 assert(dev->vhost_ops->backend_type =3D=3D VHOST_BACKEND_TYPE_USER); =20 @@ -2614,6 +2563,10 @@ static int vhost_user_backend_cleanup(struct vhost_d= ev *dev) g_free(u->region_rb_offset); u->region_rb_offset =3D NULL; u->region_rb_len =3D 0; + while ((shadow_reg =3D QLIST_FIRST(&u->shadow_regions))) { + QLIST_REMOVE(shadow_reg, next); + g_free(shadow_reg); + } g_free(u); dev->opaque =3D 0; =20 --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655456; cv=none; d=zohomail.com; s=zohoarc; b=QeLbuanqy4JweoN25xwfSXvthC6poQbvkDYkE+ABUB+KgFGBoChpxAMbEJC9u7pFyMYlayxfMWqshsB7qSw0i330Jxd2CSmvnlKb8OQdQ/GXiOVEzPOqDgFTU8/1yMm8Seue7v74F9VxTszdXQRW3psN97v9cF8JeQ4WaTPxfDU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655456; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yUsSov/yEw4rcKWYC9/ddrUYem8UiITdQiOBDA+BDq8=; b=iFRJ3fQdzM3ubYmiMDDwvi0P1EQzj50M0lAgOfpxXpl6n4THQAKgEnUy+qElqP6hIVEbJwiKFiCKv8Ba/LuiGhOxINFGTq9Yvk3JWVyhWis3S1VvK4gpC8j6pyRzGuH5FXpXZAk+iCB5+GPd3P+V5qVTCSMzjOwbSZNoWuIxZ3U= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655455768991.9841299863398; Thu, 17 Sep 2026 07:30:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8C-0001rT-Uj; Thu, 17 Sep 2026 10:30:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D83-0001nr-1H for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:23 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D7z-0007fo-OL for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:22 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id 4CF37C0A2A; Thu, 17 Sep 2026 17:30:18 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-da0rJY0l; Thu, 17 Sep 2026 17:30:17 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655417; bh=yUsSov/yEw4rcKWYC9/ddrUYem8UiITdQiOBDA+BDq8=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=IPR6McwWMhC0P8DEoPLA+bGVkH7IKB+haWrFc9kXXnazg0H+WJbr4KnIYriwjn47S Ymqk4qZgWC8dtbsMofY8El86A5/pCktwoYn31Ry+QDPlQUmHpb5c6tAJAggFeBuwX+ e2rEPB622VTET+bpcq8H0rS14hDbuvzId6tUafqk= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 7/8] vhost-user: vhost_user_add_remove_regions(): final cosmetics Date: Thu, 17 Sep 2026 17:30:10 +0300 Message-ID: <20260917143011.881361-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655460777158500 Content-Type: text/plain; charset="utf-8" Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 100621a4329..e677f1bd05d 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -805,19 +805,18 @@ static int vhost_user_add_remove_regions(struct vhost= _dev *dev) int ret; bool found[VHOST_USER_MAX_RAM_SLOTS] =3D {}; VhostShadowRegion *shadow_reg, *next_reg; - int i, j; - bool matching; + int i; =20 /* Ensure nregions fits the fixed-size array used below. */ assert(dev->mem->nregions <=3D VHOST_USER_MAX_RAM_SLOTS); =20 QLIST_FOREACH_SAFE(shadow_reg, &u->shadow_regions, next, next_reg) { - matching =3D false; + bool matching =3D false; =20 - for (j =3D 0; j < dev->mem->nregions; j++) { - if (reg_equal(shadow_reg, &dev->mem->regions[j])) { + for (i =3D 0; i < dev->mem->nregions; i++) { + if (reg_equal(shadow_reg, &dev->mem->regions[i])) { matching =3D true; - found[j] =3D true; + found[i] =3D true; break; } } --=20 2.43.0 From nobody Sat Sep 26 20:52:34 2026 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=1789655521; cv=none; d=zohomail.com; s=zohoarc; b=EYTH3NuzQPo/QjlLYOZrAnDTe2FENO/6jPLJwjq976PGj9DYPOeG689VtZoo1NvuwfKDQd0q7GBjQLppuEaG3diS43oWikIH3gFX+tPjbLQs1GnqhfhbzOfp6nqC1hEPsX3ArqGSKg0Pyy1sgQPAt1+R6pHCVQm6/xtCgILvhmI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789655521; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jXtNyScx3RS9/pxq7vM9HasQv8AbMFT+TjkQxTj1mVU=; b=a+LE3GWi6axgnkqJtnCQHwkJc96GOxaJ0I/iOno6wNG9rixZByj3Xi7+b9wa8Rxs1/Z4YMnL+gCo6VrfDbHLYtBeBMT26aYrIH/qm+t+EdXLqefttkItuPipbwGZWILCh32DSY+RY8UDeuU75VAgcROfT0qSeuYppIJTsHWbq2Q= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789655521065811.8683998000832; Thu, 17 Sep 2026 07:32:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7D8A-0001qI-QD; Thu, 17 Sep 2026 10:30:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D83-0001oQ-PR for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:25 -0400 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7D80-0007fz-66 for qemu-devel@nongnu.org; Thu, 17 Sep 2026 10:30:23 -0400 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (postfix) with ESMTPS id CFB34C0A2B; Thu, 17 Sep 2026 17:30:18 +0300 (MSK) Received: from i115954770.yandex-team.ru (unknown [2a02:6bf:8080:b33::1:33]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp) with ESMTPSA id DUXfb20WRqM0-lCITyc2b; Thu, 17 Sep 2026 17:30:18 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1789655418; bh=jXtNyScx3RS9/pxq7vM9HasQv8AbMFT+TjkQxTj1mVU=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=hL3Ta1mFQA4EAUXPmSaidy5IiwMvkZp2uWarXf3StwCSJw7FUA00a+HWdq16dfb+D AXhchsndmFEagnmwrcViAAXqA1t5G+Jajw+oBNGtK5h34+SNcRdIuZ94yLTib3XDG3 NUqXVwrJnc+IU6s1t1xql9mI9hMss0GombZ3O4JM= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: mst@redhat.com Cc: sgarzare@redhat.com, qemu-devel@nongnu.org, vsementsov@yandex-team.ru Subject: [PATCH 8/8] vhost-user: stop store userspace_addr for shadow when GPA negotiated Date: Thu, 17 Sep 2026 17:30:11 +0300 Message-ID: <20260917143011.881361-9-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260917143011.881361-1-vsementsov@yandex-team.ru> References: <20260917143011.881361-1-vsementsov@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=lists1p.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_DNSWL_NONE=-0.0001, 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: qemu development 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: 1789655524119158500 Content-Type: text/plain; charset="utf-8" This make the logic clear, that we don't need and don't use userspace address when GPA negotiated. This helps to introduce vhost-user local migration later (as we can't migrate userspace addresses). Feature: vhost-user-blk-fd-mig Signed-off-by: Vladimir Sementsov-Ogievskiy --- hw/virtio/vhost-user.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index e677f1bd05d..4a29bb77dc9 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -325,7 +325,12 @@ static VhostUserMsg m __attribute__ ((unused)); typedef struct VhostShadowRegion { uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ - uint64_t userspace_addr; + /* + * @userspace_addr_or_zero is unused and must be zero + * when vhost_user_gpa_addresses(). Otherwise, it's + * a userspace address, sent to backend. + */ + uint64_t userspace_addr_or_zero; QLIST_ENTRY(VhostShadowRegion) next; } VhostShadowRegion; =20 @@ -627,7 +632,8 @@ static void vhost_user_fill_rem_msg_region(struct vhost= _dev *dev, =20 assert(src !=3D NULL && dst !=3D NULL); =20 - dst->userspace_addr =3D use_phys ? src->guest_phys_addr : src->userspa= ce_addr; + dst->userspace_addr =3D + use_phys ? src->guest_phys_addr : src->userspace_addr_or_zero; dst->memory_size =3D src->memory_size; dst->guest_phys_addr =3D src->guest_phys_addr; dst->mmap_offset =3D 0; @@ -689,11 +695,15 @@ static int vhost_user_fill_set_mem_table_msg(struct v= host_user *u, return 0; } =20 -static inline bool reg_equal(VhostShadowRegion *shadow_reg, +static inline bool reg_equal(struct vhost_dev *dev, + VhostShadowRegion *shadow_reg, struct vhost_memory_region *vdev_reg) { + bool use_phys =3D vhost_user_gpa_addresses(dev); + return shadow_reg->guest_phys_addr =3D=3D vdev_reg->guest_phys_addr && - shadow_reg->userspace_addr =3D=3D vdev_reg->userspace_addr && + (use_phys || + shadow_reg->userspace_addr_or_zero =3D=3D vdev_reg->userspace_add= r) && shadow_reg->memory_size =3D=3D vdev_reg->memory_size; } =20 @@ -767,6 +777,7 @@ static int send_remove_region(struct vhost_dev *dev, static int send_add_region(struct vhost_dev *dev, struct vhost_memory_region *reg) { + bool use_phys =3D vhost_user_gpa_addresses(dev); struct vhost_user *u =3D dev->opaque; int fd, ret; ram_addr_t offset; @@ -791,7 +802,7 @@ static int send_add_region(struct vhost_dev *dev, new_reg =3D g_new(VhostShadowRegion, 1); *new_reg =3D (VhostShadowRegion) { .guest_phys_addr =3D reg->guest_phys_addr, - .userspace_addr =3D reg->userspace_addr, + .userspace_addr_or_zero =3D use_phys ? 0 : reg->userspace_addr, .memory_size =3D reg->memory_size, }; QLIST_INSERT_HEAD(&u->shadow_regions, new_reg, next); @@ -814,7 +825,7 @@ static int vhost_user_add_remove_regions(struct vhost_d= ev *dev) bool matching =3D false; =20 for (i =3D 0; i < dev->mem->nregions; i++) { - if (reg_equal(shadow_reg, &dev->mem->regions[i])) { + if (reg_equal(dev, shadow_reg, &dev->mem->regions[i])) { matching =3D true; found[i] =3D true; break; --=20 2.43.0