From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11023135.outbound.protection.outlook.com [52.101.83.135]) by lore.virtuozzo.com (Postfix) with ESMTPS id 3CF4A8015D for ; Tue, 8 Sep 2026 01:07:56 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=p5xz6zwbrRZAUGBLeySWcmnH3EDpTQDCL5TyhrPCPAS+JPrR8oT86HVODIvysMPZVfRosLx6lWH9nVOOqbCVrMcwLKbQKJBaAlsZNFRlQQIUwKjoZC38qltFrsYaQBTkyfapU6T4DgtsjoKdHN6gR2STqMTyLKAJp3B1zgtrGpDvPSFXjqStnj0NDBOE1owGWLn91qNW8RcRwJTk0ultaoccKosgSTWpyUQF4dIjEGQNTZuEFlW2xYlwLRc5nYTLw8sHtKSEe0ygnflJvf1Bj5QAA6mYIEUjKgzBJkqfWz+V+UpGcbNxoUsQ/NGJDjJz6iOtS/5kgVBNGzh0EVw2fA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=L9Cj6iYmF+Rcw6ldT+TtoICd3ZIM79Pob40Xwt4kWEs=; b=yEwPC3/Fd6Prul6wk75WKfUw0Aobao2Wd+mZyWjR/NpyL3WUosGu2qbp+jQ9F8lbwzzJCU6N3e5qtm6yjdCX1XkRXBhzvQotUlJ0gB11P/y4CVkVHLUYoTP9I72asho/lY3f3eDSgY95oe2lNR0vnEeP3Ojj7f3jvRKdmeR4ooiSI7H3bAGBg64C3r5+HhkBNT/xem2Eu06wu74X9k7wW3gSjvAAlFJuxXExhQEnnQW++ifSp+d0Wmcfg7CWCzqdcHlo+p3Ux/OL3LwG7VYYjOidzNPYueDgXaEPx+UbXv1Uc/0k0pusZnFHnx7hFQf2nOnI6fAcpkp8PdBhe+fJsQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 130.117.225.111) smtp.rcpttodomain=virtuozzo.com smtp.mailfrom=virtuozzo.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=virtuozzo.com; dkim=pass (signature was verified) header.d=virtuozzo.com; arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L9Cj6iYmF+Rcw6ldT+TtoICd3ZIM79Pob40Xwt4kWEs=; b=h1fjHTy9H6+gGkdr1qAQTZ6Agp6rplehfuuVUcYuXS3Z4+hs6nfJzn63dlfi4IScYGI0Cz+by5E4LRTkJndhrMKRR8rS296L3q0aodXVRZh9YLZI1FTQ1ne7Mpbpr6Zs6wVZ4z4/lHYlFbvlhe1tibBLmFXMM24RupwfYJsCgakfUKm1uBvXOrbJVVB2VOJfr7cGV5IqRJVtaCRxHfPgVv74mkNV2XCB+/1JpYyopBiyof96lB/5F6qwhZ19GI1l84y/JrLcCaqntHK1Q5rsnexiJKo2g/N+pyUYnK72sBUQc9YsOBUH/zRtbngFOoaBIABZ1WdOVtE4bW8ElpYGTA== Received: from DU7P195CA0020.EURP195.PROD.OUTLOOK.COM (2603:10a6:10:54d::11) by PA4PR08MB5983.eurprd08.prod.outlook.com (2603:10a6:102:e7::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.6; Tue, 8 Sep 2026 01:07:49 +0000 Received: from DU2PEPF0001E9C6.eurprd03.prod.outlook.com (2603:10a6:10:54d:cafe::17) by DU7P195CA0020.outlook.office365.com (2603:10a6:10:54d::11) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.15 via Frontend Transport; Tue, 8 Sep 2026 01:07:49 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 130.117.225.111) smtp.mailfrom=virtuozzo.com; dkim=pass (signature was verified) header.d=virtuozzo.com;dmarc=pass action=none header.from=virtuozzo.com; Received-SPF: Pass (protection.outlook.com: domain of virtuozzo.com designates 130.117.225.111 as permitted sender) receiver=protection.outlook.com; client-ip=130.117.225.111; helo=relay.virtuozzo.com; pr=C Received: from relay.virtuozzo.com (130.117.225.111) by DU2PEPF0001E9C6.mail.protection.outlook.com (10.167.8.75) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.5 via Frontend Transport; Tue, 8 Sep 2026 01:07:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=L9Cj6iYmF+Rcw6ldT+TtoICd3ZIM79Pob40Xwt4kWEs=; b=MCb4mLXeIKkv 6kj79hoUbIy0ePXVPiQD3ZYLkClHtD8tUcL0wFcSEDGwpinedOetrbms0fKvEorfzHK5fDo4hjJ3d VwkLezOEyu8hSRbhChvD5Q2Ks8+X1mtQWyeRvhfOaG4N/wYaS5kKiO4GDn7jDNqwWVUMp2f26/6Uj Ux0FKaj0m9JNvNt+kHvi4jceQ62LzoRBTC+/hv2lmXpf3U7gpD8U2/CRPcJfk3zYQ7uhZga9QcHRm VP3fdqVT/yTiDWGX2bqwnfO07hvsupvV+CuMWm4HoN3I4DS57PQtdKUf8w7hx2vAEt/GfyousPvXn m1q7FvcW8No+XBaFoD6Mlw==; Received: from [130.117.225.5] (helo=vz9-demens-1.aci.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1x3kGt-00DU8a-0V; Tue, 08 Sep 2026 03:07:39 +0200 From: Andrey Zhadchenko To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com Subject: [QEMU HCI-8.0 PATCH v3 2/5] vhost-blk: change backend setup Date: Tue, 8 Sep 2026 04:04:52 +0300 Message-ID: <20260908010455.249679-3-andrey.zhadchenko@virtuozzo.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260908010455.249679-1-andrey.zhadchenko@virtuozzo.com> References: <20260908010455.249679-1-andrey.zhadchenko@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PEPF0001E9C6:EE_|PA4PR08MB5983:EE_ X-MS-Office365-Filtering-Correlation-Id: 325a0bda-08b9-4bf8-536c-08df0d4599a6 List-Id: svt-core@virtuozzo.com X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|36860700016|82310400026|1800799024|376014|10067099003|5113699003|22082099003|18002099003|57112099003|13003099007; X-Microsoft-Antispam-Message-Info: 8L04jL29zL+TrPtgu2Kw1TPK+URZ5nNOrqrXUDqPBcWowLmhJr8tcuGGN0qe/6lWTV0jmsAIpIHH7bnAy6thaIYlypqG8YXvWgsoSeXfBXTG8jjbEyE5UqUMgee/fOEtolXRkgAaPz8fLqQNrHLU8LQkjzeLfdyE30IbdTVLxoNejRDwnHmw8D3PKJb4U2UuD3GLfsMA7r1H9J6MggWuIHxiVPOBbLKsl1crqQEylWmZM2CscF/7iGpfrTbN7OXdoIcAE1+Mj3dDP6RPmZDOtmX+jlssQjF4qi7DcZSHhdYuPLAsco8LoRqQ2QOcj2QXoXfAP0Be+of9/n6WlyqFLCqc2br12nGTVtVINuVan5HyakYNSadveLxC7nkl7VnsYWVJouqQ9rjdu24EcyKYzaJEC4HJyBmEfDCKKXOK6KmaoaMvTAh+tCHCBDqwuBG32xGL6k7JVt0EMIxSO17VYyKqIgAGODmFnYJOpCxiceZUESJqHUYiFq36pFYdsgGrm75Cc3wfXNUOXQuK3a600SG1Trx74koQDBNbyJ/rhRr2qDz4fFvty31hE1odrIekvjN40+1yO7OlrYNNvycIGmSoEK9KAfQk8jsLjj/kxJLEpiYq8c8HEmdnc2vQnHUV73o3AgK7EdIlIqhog2N6eIZuyknntQC2zPJhvGou3/Ld0Z6WRm1m4m7PRV/TyX0WATWhBy+7WUAfCnVcgqlPGzXMtPt8yHBd3ivwM01z5PfL/imAnJDt9vQkNob4KAWRiz1rer25WnV5ff7zxjbbu06FcCmT+orxtioYy27LZnt+gBrLrI3JxmtrhOxYTL34vYL6njrGPxJshW8vu1a+OnKiu71jtsRVzdTAMjaEh9X1ezS2gT6IFwuibAbgTGwCzoyLzaNrHGYDqrgjXeVkKMlTw3aYEmdAnJjAh4zMfNk= X-Forefront-Antispam-Report: CIP:130.117.225.111;CTRY:CH;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:relay.virtuozzo.com;PTR:relay.virtuozzo.com;CAT:NONE;SFS:(13230040)(23010399003)(36860700016)(82310400026)(1800799024)(376014)(10067099003)(5113699003)(22082099003)(18002099003)(57112099003)(13003099007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Yq7KwibpIjicPvbSrNJ5i0KICDQ9nXLivqslxuFxamw92xREzH3dNrbT8RoQ60ID21zgcYVi8QS4AImd2q1HHuZX2wKjvChUBALYBwIBzTtnHJgk/PEYG1YYQDsf7xBmX7W/cFVCzR7OSGbQfqyXZANFx8J+1seiWnvY/WggZr21M6O9gAWXd56+/SFdxIai1guSnyAPcmaeLEdUIRbZsd/2RXAB0NMZ3dkLnh+7+iaxuvf65YJKuvDzmGzAyjBexCD+tkbEvca+KFTwQaUKvToEY/kqUXQp+NugNMtgOTCetfJ07R4KmM3tFj/Jjxd09sCeRvcnHSaoDmaIKXhqWUMCzEOv8BGKI7TguV9hn0g8H+UzL5ehMVJWKf53yEEWyYVA7IxuGsiyEfJYvHxaXBioE3HmFTCMNuTuAMNnMa7JjkTGxVIHshqQ0isPqyE0 X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2026 01:07:49.1274 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 325a0bda-08b9-4bf8-536c-08df0d4599a6 X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0bc7f26d-0264-416e-a6fc-8352af79c58f;Ip=[130.117.225.111];Helo=[relay.virtuozzo.com] X-MS-Exchange-CrossTenant-AuthSource: DU2PEPF0001E9C6.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB5983 Previously we used very ugly and incapsulation-breaking assignment fd = blk_bs(s->conf.conf.blk)->file->bs->opaque; It is wrong in a many ways, so let's rework this. Patch changes default `drive` to new `devpath` option so device fd is managed by vhost-blk itself. Unfortunately this way we need a bit more preparational work: finding out disk length, etc. Don't be too broad and just do the minimal work. Also drop generic block device properties along with the block node: the kernel module does all IO in terms of 512 sectors, so simply report 512 byte logical/physical block size to the guest. Existing vhost-blk setups will break, but it is expected. We also lose resize, as this is tied to the block node, which is now have no place in the setup. We will add this in the next patches as well as RO mode. https://virtuozzo.atlassian.net/browse/VSTOR-143437 Signed-off-by: Andrey Zhadchenko --- v2: - moved double close fix to 'do not double close vhostfd' patch - dropped DEFINE_BLOCK_PROPERTIES_BASE exposition to the outside. Let's just use defaults for now. We can later check if tweaking this values makes any difference and add them back. - change vhost_blk_update_size() to return zero or error and move 'changed' to a separate argument - changed lseek to BLKGETSIZE64 (we already use BLKROGET anyway) v3: - make vhost_blk_update_size() return the changed flag directly - use ERRP_GUARD() for reliable error propagation hw/block/vhost-blk.c | 124 ++++++++++++++++++++-------------- include/hw/virtio/vhost-blk.h | 5 +- 2 files changed, 77 insertions(+), 52 deletions(-) diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c index 20c2f41691..d6681235e5 100644 --- a/hw/block/vhost-blk.c +++ b/hw/block/vhost-blk.c @@ -25,22 +25,17 @@ #include "linux-headers/linux/vhost.h" #include #include -#include "include/block/block_int-common.h" #include "system/runstate.h" static int vhost_blk_start(VirtIODevice *vdev) { VHostBlk *s = VHOST_BLK(vdev); struct vhost_vring_file backend; - int ret, i, nworkers, *fd; + int ret, i, nworkers; BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); char serial[VIRTIO_BLK_ID_BYTES] = {0}; - bdrv_graph_rdlock_main_loop(); - fd = blk_bs(s->conf.conf.blk)->file->bs->opaque; - bdrv_graph_rdunlock_main_loop(); - if (!k->set_guest_notifiers) { error_report("vhost-blk: binding does not support guest notifiers"); return -ENOSYS; @@ -92,7 +87,7 @@ static int vhost_blk_start(VirtIODevice *vdev) memset(&backend, 0, sizeof(backend)); backend.index = 0; - backend.fd = *fd; + backend.fd = s->backend_fd; if (ioctl(s->vhostfd, VHOST_BLK_SET_BACKEND, &backend)) { error_report("vhost-blk: unable to set backend"); ret = -errno; @@ -208,29 +203,69 @@ static void vhost_blk_vm_state(void *opaque, bool running, RunState state) } } -static void vhost_blk_resize_cb(void *opaque) +static bool vhost_blk_update_size(VHostBlk *s, Error **errp) { - VirtIODevice *vdev = opaque; + BlockConf *conf = &s->conf.conf; + uint64_t length; + bool changed; + + if (ioctl(s->backend_fd, BLKGETSIZE64, &length) < 0) { + error_setg_errno(errp, errno, + "vhost-blk: unable to determine size of '%s'", + s->conf.devpath); + return false; + } - assert(qemu_get_current_aio_context() == qemu_get_aio_context()); - virtio_notify_config(vdev); + changed = s->length != length; + s->length = length; + conf->heads = 16; + conf->secs = 63; + conf->cyls = s->length / BDRV_SECTOR_SIZE / + (conf->heads * conf->secs); + conf->cyls = MIN(MAX(conf->cyls, 2U), 16383U); + + return changed; } -static void vhost_blk_resize(void *opaque) +static bool vhost_blk_open_backend(VHostBlk *s, Error **errp) { - VirtIODevice *vdev = VIRTIO_DEVICE(opaque); + ERRP_GUARD(); + BlockConf *conf = &s->conf.conf; + struct stat st; - /* - * virtio_notify_config() needs to acquire the global mutex, - * so it can't be called from an iothread. Instead, schedule - * it to be run in the main context BH. - */ - aio_bh_schedule_oneshot(qemu_get_aio_context(), vhost_blk_resize_cb, vdev); -} + s->backend_fd = qemu_open(s->conf.devpath, O_RDWR, errp); + if (s->backend_fd < 0) { + error_prepend(errp, "vhost-blk: unable to open backend: "); + return false; + } -static const BlockDevOps vhost_blk_block_ops = { - .resize_cb = vhost_blk_resize, -}; + if (fstat(s->backend_fd, &st) < 0) { + error_setg_errno(errp, errno, "vhost-blk: unable to stat '%s'", + s->conf.devpath); + goto fail; + } + + if (!S_ISBLK(st.st_mode)) { + error_setg(errp, "vhost-blk: '%s' is not a block device", + s->conf.devpath); + goto fail; + } + + vhost_blk_update_size(s, errp); + if (*errp) { + goto fail; + } + + conf->logical_block_size = BDRV_SECTOR_SIZE; + conf->physical_block_size = BDRV_SECTOR_SIZE; + + return true; + +fail: + qemu_close(s->backend_fd); + s->backend_fd = -1; + return false; +} static void vhost_blk_device_realize(DeviceState *dev, Error **errp) { @@ -240,13 +275,8 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) struct vhost_virtqueue *vqs; int i, ret; - if (!conf->conf.blk) { - error_setg(errp, "vhost-blk: drive property not set"); - return; - } - - if (!blk_is_inserted(conf->conf.blk)) { - error_setg(errp, "vhost-blk: device needs media, but drive is empty"); + if (!conf->devpath) { + error_setg(errp, "vhost-blk: devpath property must be set"); return; } @@ -274,17 +304,7 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) return; } - if (!blkconf_apply_backend_options(&conf->conf, - !blk_supports_write_perm(conf->conf.blk), - true, errp)) { - return; - } - - if (!blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, errp)) { - return; - } - - if (!blkconf_blocksizes(&conf->conf, errp)) { + if (!vhost_blk_open_backend(s, errp)) { return; } @@ -313,8 +333,6 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) goto cleanup; } - blk_set_dev_ops(s->conf.conf.blk, &vhost_blk_block_ops, s); - ret = vhost_dev_init(&s->dev, (void *)((size_t)s->vhostfd), VHOST_BACKEND_TYPE_KERNEL, 0, NULL); if (ret < 0) { @@ -336,6 +354,10 @@ cleanup: close(s->vhostfd); s->vhostfd = -1; } + if (s->backend_fd >= 0) { + qemu_close(s->backend_fd); + s->backend_fd = -1; + } for (i = 0; i < conf->num_queues; i++) { virtio_del_queue(vdev, i); } @@ -351,6 +373,10 @@ static void vhost_blk_device_unrealize(DeviceState *dev) qemu_del_vm_change_state_handler(s->mighand); vhost_blk_set_status(vdev, 0); vhost_dev_cleanup(&s->dev); + if (s->backend_fd >= 0) { + qemu_close(s->backend_fd); + s->backend_fd = -1; + } g_free(s->dev.vqs); virtio_cleanup(vdev); } @@ -383,10 +409,6 @@ static uint64_t vhost_blk_get_features(VirtIODevice *vdev, virtio_add_feature(&features, VIRTIO_F_VERSION_1); - if (!blk_is_writable(s->conf.conf.blk)) { - virtio_add_feature(&features, VIRTIO_BLK_F_RO); - } - if (s->conf.num_queues > 1) { virtio_add_feature(&features, VIRTIO_BLK_F_MQ); } @@ -405,7 +427,9 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) int64_t length; int blk_size = conf->logical_block_size; - blk_get_geometry(s->conf.conf.blk, &capacity); + length = s->length; + capacity = length / BDRV_SECTOR_SIZE; + memset(&blkcfg, 0, sizeof(blkcfg)); virtio_stq_p(vdev, &blkcfg.capacity, capacity); virtio_stl_p(vdev, &blkcfg.seg_max, s->conf.queue_size - 2); @@ -413,7 +437,6 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) virtio_stl_p(vdev, &blkcfg.blk_size, blk_size); blkcfg.geometry.heads = conf->heads; - length = blk_getlength(s->conf.conf.blk); if (length > 0 && length / conf->heads / conf->secs % blk_size) { unsigned short mask; @@ -432,7 +455,7 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) } static const Property vhost_blk_properties[] = { - DEFINE_BLOCK_PROPERTIES(VHostBlk, conf.conf), + DEFINE_PROP_STRING("devpath", VHostBlk, conf.devpath), DEFINE_PROP_UINT16("num-queues", VHostBlk, conf.num_queues, VHOST_BLK_AUTO_NUM_QUEUES), DEFINE_PROP_UINT16("queue-size", VHostBlk, conf.queue_size, 256), @@ -478,6 +501,7 @@ static void vhost_blk_instance_init(Object *obj) VHostBlk *s = VHOST_BLK(obj); s->vhostfd = -1; + s->backend_fd = -1; device_add_bootindex_property(obj, &s->conf.conf.bootindex, "bootindex", "/disk@0,0", DEVICE(obj)); diff --git a/include/hw/virtio/vhost-blk.h b/include/hw/virtio/vhost-blk.h index 0c7e212595..c194b421d9 100644 --- a/include/hw/virtio/vhost-blk.h +++ b/include/hw/virtio/vhost-blk.h @@ -14,7 +14,6 @@ #include "standard-headers/linux/virtio_blk.h" #include "hw/block/block.h" #include "hw/virtio/vhost.h" -#include "system/block-backend.h" #define TYPE_VHOST_BLK "vhost-blk" #define VHOST_BLK(obj) \ @@ -25,6 +24,7 @@ typedef struct VhostBlkConf { BlockConf conf; + char *devpath; uint16_t num_queues; uint16_t queue_size; uint16_t num_threads; @@ -37,10 +37,11 @@ typedef struct VHostBlk { VMChangeStateEntry *mighand; uint64_t host_features; uint64_t decided_features; - struct virtio_blk_config blkcfg; int vhostfd; + int backend_fd; struct vhost_dev dev; bool vhost_started; + uint64_t length; } VHostBlk; #endif -- 2.43.5