From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11023095.outbound.protection.outlook.com [40.107.162.95]) by lore.virtuozzo.com (Postfix) with ESMTPS id 5BC8780E7E for ; Fri, 30 Oct 2026 14:46:27 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CMOwgSpTCdUiCUue5oJA7lLw8a7kCGBSOSPMCdNQmVbcoCJKjpl7+3LdKZNdibq8A8H73Kv1PWdyDJSw2woHU9F7GZGoONjPLfYv0k61YbCOt7Bpujqf9AZcea87qSElQNSVSJil2e43fe5GYL2n2UntFWuavP5aeaVRLwckfsp84/EHW5whsWeT9KbnbFWxU32SwHha+CrEFb5OklygO+kOQzfT9tXOgmBk2QeradlabTI/TiMlgn9u/jMPRs1+FfXvJI7KhProamT3l0W7/aOomqltu/pscG5W6+e1KHoMcVM2DZP2HXHQXXtPos+o3sHByCdDirhuRQqnIFEBoQ== 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=WB8Sx8E7dZkIJ2v2A3PMYYuzUIIAmg+kPPFk2pNgQ6c=; b=SeXerE19npB1oPLmWag6rIm743dHkdaNsieGpGx/2/Pp6KLudwDLmSy8zMpOsePDTaqb1mcNY8XdqCBCJrzqp5ioE28foGbEdidE+y62YdYfmrW82HlyLKFEzm5yB89yz7ia79sM/LK1EevB+/CeLOZ9rzNiWeNdZwzsO0Oho0wmjYWeIdiJoY2oqSWM1CRc1reumPt/fA6GLUW0noOVZ8W5EU1FAW1blO3Exn3WyxP1i0jO6+LranmbPPYBz/s1y2i70wMV9Phdp0ZcW+PKAMMhhV30JDDVBSdLAGR0VQmmyVq5itVgDfpQecWdfKbNyaCi5DKdG5ejaQIuQ+rXIA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none 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=WB8Sx8E7dZkIJ2v2A3PMYYuzUIIAmg+kPPFk2pNgQ6c=; b=M8DFctP6C7/q4m68pCoODqpHEMkGslcVYPX47HFSiSLq43Hsc1dOx5Hc8EMv3RxCta5vg8qAAiGZYrYlFbiLQ8nIg09jrpz+SUWBvxBS5cJMFKnYdf8MrYYGaoMJnDtHPzzFTaQfUFZd+xM4BAGE1s6AlKn0FBV4JOkFi1cCZv5wZauPA80yjSiHqtMVF8CzaYeQnOIaEx6eJwILyTBwSKDQ62BN/qFHjepSALvFmePO2jMsPsoY+nO+vBQ/LIwNtRAvOGXcf9R8k4ZUIOjdFeuSACykeAS+LF2r0qyTb46b6Fnhwq+MBZXFKERCkJVkDq3s/4KMpb7H3qlnPNO/Eg== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by GV2PR08MB9373.eurprd08.prod.outlook.com (2603:10a6:150:da::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.12; Fri, 30 Oct 2026 14:46:25 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0569.008; Fri, 30 Oct 2026 14:46:24 +0000 From: Andrey Drobyshev Date: Fri, 30 Oct 2026 16:46:01 +0200 Subject: [PATCH QEMU HCI-8.1 v6 30/34] VZ: migration/cpr-exec: take the vhost-net devices back if exec fails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261030-vfio_v1-v6-30-45de246bc92e@virtuozzo.com> References: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> In-Reply-To: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0502CA0031.eurprd05.prod.outlook.com (2603:10a6:803:1::44) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|GV2PR08MB9373:EE_ X-MS-Office365-Filtering-Correlation-Id: 9df4b6ee-74c8-4f02-15a6-08df36947ef6 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|366016|52116014|376014|261026121527099003|261009223027099003|261022105027099003|38350700014|56012099006|22082099003|10067099003|261021121427099003|18002099003|5113699003|261028144727099003|261026140227099003; X-Microsoft-Antispam-Message-Info: L5Uz1KcMbDS30jL7r+Vw26gFSRI/LkVqZHdN05OoRbnY4kVNDMFCce5ZV4alTcTpkjho8PUKDTg4B+oXBh1jWukLdRE+hJ90PuXI7HPGajLJaiJ8IwKofmaSPDec3sRSgf9WXz8qUJI2pqmvyHkuNjjwK5tp5rXGs+G4ZRR4+UA5SZaCIaSMdd6CyGDb4Bl7Dpikex8j3JsuIGbaX9J6G2fjKRElHErj1CIFMQuTyt54riwH+0Rg3QmifuJQrtWoYU9q/dsydGXHh7ns0pL8wnGG++X/hyIDaTsm6qePRMHyOdy/xxotIXAOa9z5ES79vIunrXg9VxCkV/378zOoChrhFopaFz4iD60gtSzlJvpGpyXUa0WTPMAUdulrQdfsPu9DhIB+7eOhLG1W706yPZBJrwAcsfWHNAUq+UCqzsbq+ozNHzMLsQE/4TUlL1ObmxMn73JB+n3fCJoHQNKA+bqmocUJBMa5lAoLxki0jXKPeNVx4MhA5TjnjNYpJ3dNCjkUsB8KEC61AqxAD9kilrBXn4rCU5EQVE4kfdkypHbA9NpRNVNHcWiooYJFp/rsxYXzbvjWSaQZd66Vi2n0ZOT4Z+6qwIQv7zv/oRWj1jWWZIZegaE7xcDc+sH9pqa4ndHHzpfwkV8cYD/ZdezvY0c5LNUBEY9n8ce9mZyuJmzU87cwB2AwyTmlOAWrUYSEo2l143hmUu26PjHQrelTAR0a4FGgeJ1qe8hm+7Hnirc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(366016)(52116014)(376014)(261026121527099003)(261009223027099003)(261022105027099003)(38350700014)(56012099006)(22082099003)(10067099003)(261021121427099003)(18002099003)(5113699003)(261028144727099003)(261026140227099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dmhLTFBZdVJWKzR1RDVhbXBicXlYL0g5OEVEaHNqRjd6V3RNb2RLb0pwTmhm?= =?utf-8?B?cGpzS3RDTXlFdSt3b0IzSzdlZG0xS0RrREFWWE1ZOUlWZTc1NEZtWGhQQ3Nm?= =?utf-8?B?Y0RjUFlvditEQVB1QjBJdFpkN3dJbEhyQTEzcElmeUw1NE5aT2lxa3I3ZmF3?= =?utf-8?B?T2wyVHk4REQvWi9oNDJXVWcvbGhzUWJJY3VzY0tSZHR1bWwwS05jKzFDeFFV?= =?utf-8?B?Wm1zdTFpTUFuUXlqb21WU3k4WGxMNkJyYkdoNDVyWFRYdkQ4enZDVWtlUVll?= =?utf-8?B?c3NwVzRyQkhoN21oNnc3MUcwVnlXNlJXOUw0UG42OS9lRUZ4Szk3YTJvbUpt?= =?utf-8?B?Y05aU2R3cnRCcTMxL1pvc1FvTS9pR2hYdTBrUVZZL1BFOXlQOExmNVZ4N2t5?= =?utf-8?B?dDlqVDZKdURzUkVic0NjbGI4YjBlTDVuUnFOcnZHeVJzR1NLMjZtK1JENmIv?= =?utf-8?B?YWZMU1U1NjFSUW9NK09RYUhaSEJOb2g1S0paMEs1TFcvWi9jaUlmTXBnbHFs?= =?utf-8?B?M2RsRmhzd2hxWllXZjJYV1Y4bnVjL3c4MmFzcmJ5aUdlNUFTZ0tDYmY5bGhT?= =?utf-8?B?eHdjcFVUUW9SNXRqanYzTXBHWlBtRVZvVEpDbk8vR29TNTFNd0M1SDhEQXBu?= =?utf-8?B?N3crbHhSUjVoRzI4WmJPVEhqUGt2b2EzeUFlV0NzZHE4Y0hsWi9CWE51MGVL?= =?utf-8?B?WFk1UWtRRjZ0ZElZU0Vhb0kzM0lMdjhXQWRIYWg1WWxuR0thaUZabklJaW1S?= =?utf-8?B?bTVrMGRqcXU5UFhiSDNkZGd3cXM5bzAwQW1FTFVrNnl1RGhLLzJuNlFodTdJ?= =?utf-8?B?RkpKUmpQcGcyMmNLK1pnb0tXWUV0UG1Wclc4cksrekJVaFZIUGk0REd0Tjdx?= =?utf-8?B?bFJ3RnRIVkVjN1VwK3JNQWh0MzdOZFVmZ3R6V1VmNWpjd1Z6Mm44eXI0SFZz?= =?utf-8?B?bTNoV2s3SksrdDg3UHo4OC81KzVqVU1wZ0NkcHJEYmdSbXNzdGVBRVhUR0sy?= =?utf-8?B?MkFmSGlNUStMckxERGdrOEtYdytZZUhrblRLL1VBRldEOWNBbVZhUGpXMjhz?= =?utf-8?B?U2hYOXM2bVpxV0dxelgrekpvbVpKYXBzNnQyZ2Z1dDY4V21nWlBuUi9RNnhN?= =?utf-8?B?NEV6aytwNENDb0VZeE5OaU03SUVpendsRklFdk5udzJkYUkzMVYyekw5WUR0?= =?utf-8?B?Um0reXg3UXFQRC9OcFlYOERVZmFYUGMwYkZmU25IMXlXdzNYZWQ3eGQ0dTNy?= =?utf-8?B?cDJDeTRLenRENjkrRkorTUc2SFJkVmt2NHFOcVJ0b0NMWDNHS21uRUh5WXBp?= =?utf-8?B?cGZmWDBrSm9YSi9YQWlBV1h2TXNyOHBvSzAvMFpjTk94MUVmZElNV3pnOG9K?= =?utf-8?B?NTdUdWhWbU9sREZ5UkQ4SFJ5NDhkb09ObmhKZjhMMUlKOGRkT0dZczhzUU9w?= =?utf-8?B?Y2JMSjNBZWpqWjFFc2hkVUkzcnJMMzJlZFdaalBNa243RVdtTm9FNSs0TmFQ?= =?utf-8?B?b2NYcUNXNHVieVBaWHViVHhTRWlKSzNEbmVRK2pGeDU2Yzc4QUw4dWRPV1Fi?= =?utf-8?B?Y0VnNEJJQ0IwZkhsYW5VQmhMemxwZXVkVWZhMDRFYUZjYUMwOEVjQWtjZDc4?= =?utf-8?B?UzVvRmpHS3hMUk9TZGRGYXJZZ3BqZ0VPQTdBUWNlUzFMaHdkVjFNUThzdmsx?= =?utf-8?B?ZFIvMnpIcjNhY2R4OU5mMWNlTEpCSFgxRVJEQVgvK1JDS3E4WFRyNzdEYjlV?= =?utf-8?B?QlArT20xcm1jZUtjbVIrZE9KMDhMeHNxdnFISUNkdVVJSVNnZVJ0UzlkMkho?= =?utf-8?B?K1V5UDFxc2JnbWlxUWJSLzA5TEthdXByUHBMeEdPSm83bEtVSDVqYVJjdGNE?= =?utf-8?B?ZVM3L1kzQmFWemFub2lwMlcrYXpMQjhnVkNBUjZEbDdIU2w2dWNlOUFocy9Z?= =?utf-8?B?UHcvSTR4R2dQTmtUeGlrVVM5aGd2N0JpQlZ0NW02VHJDK0prZWl6WjlqOTE1?= =?utf-8?B?c0ZkcXhLMmFsbmMvVkRjMHRsTlhDeTBiOWo3UjBNeVZEaWw2YTFFVjhIV3FP?= =?utf-8?B?NWNzL2xlckFnZ2FIQ1doamkxZTBCUzlpK3J1VEdxK3Z1UXN2aEd2S2xGc0Fp?= =?utf-8?B?NHNhMDhNZDJXZEdFNlVnNzNoNkFQVE0vR1Nqd09ncmV5TVhCSkRmNVM5MC80?= =?utf-8?B?RHcwTUNyTTFkNnFabUYwRklpZWZISVZlNzVRMkkvRUhpU2lxL2lvSnJRMW9j?= =?utf-8?B?eGlCeVJiZDZBcDFueWZ6cENzNlVtdmw4MzluTm9ZZmRnZDZ5K3laWUtqa3Bp?= =?utf-8?B?OEZBVGVLMDJvd1BuY1l4UHQyMTc1RjhQekhpK25ZWG5lei9Na3RidkhDUnVY?= =?utf-8?Q?pN3rMER6nGQGbrL0=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9df4b6ee-74c8-4f02-15a6-08df36947ef6 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2026 14:45:52.4021 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JRmW/TluJClOXcaugCnSZtUqoQQmHuFLelMrNX0Msvb6cDfWi4SzBwsuSNJTwDfHR7D683TBEm5PHzgZ76gjHa0WpjthTvPgwuOnt9BIcSs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB9373 Right before execve(), cpr_exec_cb() releases the kernel vhost-net devices with VHOST_RESET_OWNER, so that the new QEMU can take them. If execve() fails, the VM goes on in the old QEMU, but nobody takes the devices back: the kernel refuses the ioctls of the next vhost_net_start(), and the guest is left without network. Take them back with VHOST_SET_OWNER when the exec fails, and set the vring call and err fds again: VHOST_RESET_OWNER dropped them too, and vhost_dev_init() registers them only once. The devices are stopped at that point, and vhost_net_start() sets up the rest again when the VM resumes. Only the devices that were actually released are taken back: vhost_net_cpr_reset_owners() marks them. vhost-vsock does the same in its CPR notifier. Signed-off-by: Andrey Drobyshev --- hw/net/vhost_net.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ include/hw/virtio/vhost.h | 2 ++ include/net/vhost_net.h | 1 + migration/cpr-exec.c | 2 ++ 4 files changed, 54 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 56c697f4bcd..fae6b060c6f 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -594,6 +594,55 @@ void vhost_net_cpr_reset_owners(void) if (r < 0 && r != -ENOSYS) { warn_report("cpr: failed to reset vhost-net owner for %s: %s", nc->name, strerror(-r)); + } else if (r == 0) { + net->cpr_owner_reset = true; + } + } + } +} + +/* + * Take the ownership back when the exec fails and the VM goes on in the + * old QEMU. VHOST_RESET_OWNER has reset the kernel device, but the devices + * are stopped, and vhost_net_start() sets everything up again when the VM + * resumes. + */ +void vhost_net_cpr_set_owners(void) +{ + NetClientState *nc; + + QTAILQ_FOREACH(nc, &net_clients, next) { + VHostNetState *net = get_vhost_net(nc); + + if (net && net->cpr_owner_reset) { + struct vhost_dev *dev = &net->dev; + int i, r = vhost_dev_set_owner(dev); + + if (r < 0) { + warn_report("cpr: failed to set vhost-net owner for %s: %s", + nc->name, strerror(-r)); + continue; + } + net->cpr_owner_reset = false; + + /* RESET_OWNER also dropped the vring fds set by vhost_dev_init() */ + for (i = 0; i < dev->nvqs; i++) { + const VhostOps *ops = dev->vhost_ops; + struct vhost_virtqueue *vq = &dev->vqs[i]; + struct vhost_vring_file file = { + .index = ops->vhost_get_vq_index(dev, dev->vq_index + i), + .fd = event_notifier_get_wfd(&vq->masked_notifier), + }; + + r = ops->vhost_set_vring_call(dev, &file); + if (r == 0 && ops->vhost_set_vring_err) { + file.fd = event_notifier_get_fd(&vq->error_notifier); + r = ops->vhost_set_vring_err(dev, &file); + } + if (r < 0) { + warn_report("cpr: failed to set vring fds of %s: %s", + nc->name, strerror(-r)); + } } } } diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index a92439d3443..421f7139cfb 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -151,6 +151,8 @@ struct vhost_net { SaveAcketFeatures *save_acked_features; bool is_vhost_user; NetClientState *nc; + /* released for cpr-exec, take back if it fails */ + bool cpr_owner_reset; }; /** diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 39ce7ad0e3d..cdfefa81500 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -90,4 +90,5 @@ int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc, void vhost_net_save_acked_features(NetClientState *nc); void vhost_net_cpr_reset_owners(void); +void vhost_net_cpr_set_owners(void); #endif diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c index df11b0c7633..e4ea160698c 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -253,6 +253,8 @@ fail: if (cpr_ram_rdonly) { cpr_ram_restore_rw(); } + /* Still the same mm, take back the vhost-net devices we released */ + vhost_net_cpr_set_owners(); /* Note, we can go from state COMPLETED to FAILED */ migration_call_notifiers(MIG_EVENT_PRECOPY_FAILED, NULL); -- 2.47.1