From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023100.outbound.protection.outlook.com [52.101.72.100]) by lore.virtuozzo.com (Postfix) with ESMTPS id B742080CB2 for ; Mon, 26 Oct 2026 11:29:18 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dHVEo7fLUGCmpQQajz/C7Xw50bAkNCCT7lOBcp1NMXFswn7jvvxdauXRL0s6uAqI3S/4ZCuS0lGrOTIqZ/5moA/9pEjnZlssDpZB7JWw8aGj+obOvOxRxRW6RuW74ZUksrcbkIXYqPr6+zXIyB6aU+cSGBPmnKMfrtT/12LxcqREYBumSZqqTxZ6pWv+mTmsCkGeOWrzN0ENVnool94waBTs1dnk0rQrgl6MJKcRTTDI7bWjlK8s+3YTVIYMOZCXruIxM+CDywjr4VTcDbxOyaLSqrwyEIvBMsRMt4khtNNiEzuUE7aoehdGzJRoSzLJX0uQa260XsLhqWNfobZnnA== 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=XIOatNM0XIkHr+dZddXTjRHThUqJHYw4FaLlJHD81zs=; b=YwxbrUkpMlqNIWXrrL6I5IAEBDzQQj949t9yFNWOvBqZJrUlS0HdvqY9dVrkXqNh0zUQG0rE0TpLDOwmu/pqCc1zC5aslMEccSepJuW2cWQJsZG8YATfBWqmgSJWiFseIO3hZ0YZLbp1O76193ViCZVxl25R6Q8kraC4r7rSZQ8Nrrg5uUwNCFr6yh6RxJAxfJ6jDkXBLzseYvUPyh2kjVGM2J1ATo8nAp1LEnxvcOj/Om9MS8MuspKMu2GfpysaZ32ebfpZtT828lczXW8d5LaP6IGZLirWq5pp8NIMTjLfhs9+D4aH5YHvFlCkp8D1VBkTaJQLKjJAPLb8b3V8aQ== 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=XIOatNM0XIkHr+dZddXTjRHThUqJHYw4FaLlJHD81zs=; b=owKhzUWbe80tpCDVsfCWwM5k9H67y7mMIvUPDNt2v9R7cudxreu9ApzlE4Lps4+hUgqKz5rXL6nOiISLXjUG4xdhEbLRETMpOHn0nE6/bTslWW+Wmav+vT3xQ8zWPOjzRMhDSWWGcoJ2bVcjG8KfTlu32fnXcfoDT58p0oVIprqhLD6S2N/I0z79QthKtZvvwV5z4uTiI19dt+Pd9P2vbPDIOimmMOLnhIGZKmxPLttdDVdQIoA477/dSVNHA4JISNzJLQgHunKMOG5psh4yLXVQ2r1UNRBGHZ5/4w2WbgHDBOtIL7GL1PWgLQSPfUVuUAWhG5WjBdfOamooVUNdEA== 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 AS4PR08MB8046.eurprd08.prod.outlook.com (2603:10a6:20b:586::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.22; Mon, 26 Oct 2026 11:29:12 +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.0546.021; Mon, 26 Oct 2026 11:29:12 +0000 Message-ID: <4ceea932-9bce-4fb2-a705-50bb6bdb369e@virtuozzo.com> Date: Mon, 26 Oct 2026 13:29:10 +0200 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH hci-8.1 1/1] virtio-scsi: fix hot-plug event racing device realize #VSTOR-151351 To: "Denis V. Lunev" Cc: svt-core@virtuozzo.com References: <20261026111134.145823-1-den@openvz.org> <20261026111134.145823-2-den@openvz.org> Content-Language: en-US From: Andrey Drobyshev In-Reply-To: <20261026111134.145823-2-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: ZR0P278CA0108.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:23::23) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS4PR08MB8046:EE_ X-MS-Office365-Filtering-Correlation-Id: ed778df4-a065-42aa-a8c9-08df33545bbb 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|376014|1800799024|366016|18002099003|5113699003|22082099003|56012099006|5023799004|4143699003|261021121427099003|10067099003|261009223027099003|261022075727099003|261022105027099003|261021123027099003; X-Microsoft-Antispam-Message-Info: kPo6h2+UyswYUclAwuAUZ8Wzz/CcwSmXbiDTva9Nq95em16q1OmytKEuK4YFOhUZ5NHL5avyoOp2/ALCN6dc/lr7SmUQyHlcfLgUWdTBRR/ImGdEEFefdktsYxo8HzXkLhppR1qpduLi+aXe9oi8T2B0mcrLZFcP6sa/P6c9E6GfwG/Ve9zRtS8OHl3lsKLx3JWXqnd6iEB/IaQ/hOjDTTUUGKWd2MHLRwQyR3PC4kUV/wB6VFWX7kzKUUsKDT9taQUfil0EAc3Py3pamYAM1pzu3K3NiFPgCzZ5nShIpZQFhcoL8SlwyG7j+vMZ70BAm565lWqjVFpsp7ueAI39jj+YAeEjLf7I7ThyoT1bLwLrOgDOqFK9s3zXaOGZ4gGuGTwRcEEDjWBXX7f2ipA5kC/sDF0wkYH7tayFoqYo0MM6o9V8qz/hlW6X5VS+eT98tzmWliNn7y7KwiBlGfkYG8G+j5FFis4UEmrnjzWGwBYFP+QyIq2Jwc12vqkmakfDpQn+99hTQD6iFmxkXN4qTMFjktpMVchxl/jTpEvejXixiGcprkdk/SQpcAEAv38q/RdG7L1kFwAwd2waeu2ASHAZTDCUY+mJMmRZEeRS1Bnrb1qkkGzd7WYbh+dIM/2s3qqQuSAiu/WWIxE7Ae1X+aNViiAiyswQ4ZGaw5tyTuc= 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)(376014)(1800799024)(366016)(18002099003)(5113699003)(22082099003)(56012099006)(5023799004)(4143699003)(261021121427099003)(10067099003)(261009223027099003)(261022075727099003)(261022105027099003)(261021123027099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OG1oS2RFcGpzMWVvbmpnTVZqa2JUSjVML2cyYlE1YUU1d053UnFNR1VnanYw?= =?utf-8?B?dXdGMUxZckFVaDFuWW9ZdFhVTzFqT1RTa1lpWi9JOGN2dFZhcW0zdXdDRHkx?= =?utf-8?B?SGhvVzNiVUVydEJtYnl6ZDliVi9WMmhvMUpPK0wzTTFxWldJSFlFUkNnMTFV?= =?utf-8?B?bjZtT2U3TzRVV0dDSUVPajZ1WDlUSzZzV1RtNGJ3NkJwalVSU0hXb0RBV1do?= =?utf-8?B?WEFmM085bm12c2Jwa050alRrQUcyeXdOK0Z1cXFWQkYrWHA0NUJmL0xnSERI?= =?utf-8?B?cXlJQXNYRDBobDREbVpBbzN4aWRWeTRTS2R0SW9tMmxRbnpZdGh2bFRSNTds?= =?utf-8?B?UURZRjAvVy9BeTVrS1hpelc5Nm5SOUJEZ0haSnVvdTVYc01ldWMyaWduWnZW?= =?utf-8?B?a2lVcTRyK2tDaHE5enNHYlY5cGwzNG11WnFLbkh2SUtnMkdaaGZxZ0hSSXpR?= =?utf-8?B?ZnoxZzNQZ0VLTloxcWdxNHlnQXYzWWEzY3pyZjhhMVh4UWpvY3BraXJBZEdx?= =?utf-8?B?VHk3OFYxY3VIVG1kVW9mUVBPNDIzU2NZWExrK1VOdmlLV2tDSXNWN3NrbDFM?= =?utf-8?B?QXhjdUY0L25LaE95OVFSRWo0RTk5T3RDWVo4TlJxVHdRdlRBMGFyV2VHeUQz?= =?utf-8?B?cEJGZzZrUytXVmdsdEhpemVYeWhqcFFkL1k3TEpOamtDdG1oS0dUOXMvdXBw?= =?utf-8?B?dnRneWxkR0dobmNoVkZvQnd5bFZnWTg3bGJZMlNxdHhMZjVnVW83WjFBOXdZ?= =?utf-8?B?NytCdENTVGVBQnJFdURJMEhHc0tpc2NNTG1kZzVkN1hxczNYL0x6cE1ZODJy?= =?utf-8?B?UnpQOFpvMHdReHJNb2JaS0dhZndONkQrQlh6eTVnOFk5SnZqWjA2VWJpTlRt?= =?utf-8?B?WWFaa3VlQ1NlSzBmU0V5clBLZkk1VDl0WXVIMGdwQ1cybm9rU1JYVk5hRzNQ?= =?utf-8?B?KzlBci9ScDJpS3VCQ1NHTnJyV1I4M0ZSdW05VzlBSStTUWlHc0k2T2xEZGtV?= =?utf-8?B?OVY1bFA3eTVhekhRM09pWDNJaFJWdjgyODBod0ZPUTJ6ZGlWR1AxZ0U3RTho?= =?utf-8?B?QjlKcFNLRU9KZmdvaEFyUTRjWjBPSFVUS09DNzZaNXg0QjV4ZWdnSDhXaVRV?= =?utf-8?B?OTZKQXFPV0g1Y2w0T3luM1N4emx4TEZVanFqRjZMU2x6Z24yQTFITXFOOGZJ?= =?utf-8?B?THJBMFZUWmxGMVJ3ditQNTQzVjdLNVQybUJ1WHRwYW12T0VUaDMxdFkzem4v?= =?utf-8?B?ZFBNK3dLWG9yWmFjQ0Mrcmpmc1BlWkhKZDU2NjZCN0hFSU9acnhzYk9ZRmJP?= =?utf-8?B?ekRXd1prSUgwVnNyTTlTU3FCVjJseEt5SGx4bUVlTXZVbGtublZoeWx3UzFV?= =?utf-8?B?OXN5MWoweXZZZkxvQUZGUkl2WjNnWkpVd2Y1MCtHRnFxUTFpczZMblM1ejJR?= =?utf-8?B?T3U3N2lCeFZ6empadXBKQnhHaGFxQ2JOMUFibTBNdmhIczVpcDJ0bmpSM1dI?= =?utf-8?B?RndDYzFucFQwbUxiR3hCckxXY0x3dlMrbkxuV3c1QU9xRWQyazU5L2hWSnhm?= =?utf-8?B?RHBoUVNnMWt4eXUwVzV2LzJyaG9Ea09UTkJVaHJjcjlIYWZyNzlXM2phWkxi?= =?utf-8?B?b1JBbU4rSE1jN0dQSzlCUW9Zc2c0ZmVNSGZENXVMSUZmanp1UkZUSWlRbHpZ?= =?utf-8?B?UjQzYjBiZmJDRlIxeHNQby9XcG1iUmlOWXQxN0o3V3kvOFlZbHR4NTZpamFI?= =?utf-8?B?cXluTmpMM0craUxhNjh2b3NvTzYyNXRsRjh2eHU5ZG1IbHZmNVF0eWRRMm1x?= =?utf-8?B?bkNDSGo5RUJiUWxqSkdyVnNncTlXUHJKQW1aS2xHZmdiQTVNNW1WY1NoZExo?= =?utf-8?B?NHlYbnhrOVhKM1c3ZERWeVZOSUdVY2tmRWxuTzVjQ0tuU1dqek5zUlNtZXRr?= =?utf-8?B?a3l3aVBIbVp0dW5LTHJ4MEdYdURyR3QxRjdoWFJQUFFXbEt4TzFla3FGVmJH?= =?utf-8?B?QTNGTzdKaXpmYStnU3lweUVLUlFVbHhQYVE1MUFYL2lFL29MN21mK2FJM1B6?= =?utf-8?B?UlEyUkxCbDNzbHhyTkVGUkdKdGJTcWVBczVOVmNIL2xJNm04dVNpUG9RY3cr?= =?utf-8?B?RDBEd2haWkNYQjVTakJIaVFKVTNtMDVEbUdoSk16TmJFYXlKbTZCUjVRclIy?= =?utf-8?B?dVNIRm9pbHNQVlk0SDQ0TkYzRWNTcGdydU9oaTNiQXFZSHRKWXhHVFZ3ZGZK?= =?utf-8?B?SjNZUU5qUVE2V0RubWhuQUZTSDhkRytvVEJ1SEdiSnRoYzZVVGVOVVZUdlJx?= =?utf-8?B?V0ExNlVoVFk4R0JrT3lyZER1R0tMYktXVXBGOEZ6TWJvRG93ZlFCNkxZMUVL?= =?utf-8?Q?o1vnUouSgXHxIo+A=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: ed778df4-a065-42aa-a8c9-08df33545bbb X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2026 11:29:12.0732 (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: Ie403kJ/3DMjszDvrap37sktgyINTPQ6CrpMM2tGTHS9A2UP7xcc657H0pNqtURqeibDK+Qd66UToz8s9+OApJBFZoL9C5KWLrlc0I0alzE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB8046 LGTM Ack, applied to hci-dev On 10/26/26 1:11 PM, Denis V. Lunev wrote: > From: Denis V. Lunev > > virtio_scsi_hotplug() is the HotplugHandler plug() callback, which > device_set_realized() calls before it sets dev->realized. The callback > pushes VIRTIO_SCSI_T_TRANSPORT_RESET/RESCAN to the guest at once, but > until realized is set the request path ignores the new device: > virtio_scsi_device_get() -> scsi_device_get() skips unrealized devices, > and so does REPORT LUNS. A guest that reacts to the event quickly, on a > vCPU while the request queue is served by an iothread, scans the target > and gets VIRTIO_SCSI_S_BAD_TARGET. > > Neither Linux nor Windows retries that scan, so the hot-plugged disk or > CD-ROM stays invisible until somebody rescans the bus by hand. Linux > calls scsi_scan_target() once from the event handler. Windows storport > clears its rescan flag before enumerating the bus and never sets it > again for a failed target. > > Push the event, and the REPORTED LUNS CHANGED unit attention that goes > with it, from a main-loop bottom half instead. It runs under the BQL, > which device_add holds until device_set_realized() returns, so the guest > is only told about a device it can reach. The iothread context would not > do: its bottom half could run before realized is set, and the realized > check and scsi_bus_set_ua() rely on the BQL as plug() did. The bottom > half is only scheduled when the guest negotiated VIRTIO_SCSI_F_HOTPLUG, > as before, so cold-plugged devices do not get one. It still checks that > the device is realized: nothing orders it against a device_del that > follows device_add, and an unplugged device has no parent bus. > > Fixes: 8ddf958e8d62 ("scsi/scsi-bus: scsi_device_find: don't return unrealized devices") > Cc: qemu-stable@nongnu.org > Reported-by: Ilya Rudakov > Signed-off-by: Denis V. Lunev > Cc: Paolo Bonzini > Cc: Fam Zheng > Cc: "Michael S. Tsirkin" > --- > hw/scsi/virtio-scsi.c | 38 +++++++++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 11 deletions(-) > > diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c > index 3b635053b56..69b34adde22 100644 > --- a/hw/scsi/virtio-scsi.c > +++ b/hw/scsi/virtio-scsi.c > @@ -1145,6 +1145,29 @@ static void virtio_scsi_pre_hotplug(HotplugHandler *hotplug_dev, > sd->hba_supports_iothread = true; > } > > +static void virtio_scsi_hotplug_notify_bh(void *opaque) > +{ > + SCSIDevice *sd = opaque; > + DeviceState *dev = DEVICE(sd); > + > + /* Nothing orders us against a following device_del */ > + if (qdev_is_realized(dev)) { > + VirtIOSCSI *s = VIRTIO_SCSI(dev->parent_bus->parent); > + VirtIOSCSIEventInfo info = { > + .event = VIRTIO_SCSI_T_TRANSPORT_RESET, > + .reason = VIRTIO_SCSI_EVT_RESET_RESCAN, > + .address = { > + .id = sd->id, > + .lun = sd->lun, > + }, > + }; > + > + virtio_scsi_push_event(s, &info); > + scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED)); > + } > + object_unref(OBJECT(sd)); > +} > + > static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, > Error **errp) > { > @@ -1163,17 +1186,10 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, > } > > if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) { > - VirtIOSCSIEventInfo info = { > - .event = VIRTIO_SCSI_T_TRANSPORT_RESET, > - .reason = VIRTIO_SCSI_EVT_RESET_RESCAN, > - .address = { > - .id = sd->id, > - .lun = sd->lun, > - }, > - }; > - > - virtio_scsi_push_event(s, &info); > - scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED)); > + /* The request path ignores @sd until it is realized, so notify after */ > + object_ref(OBJECT(sd)); > + aio_bh_schedule_oneshot(qemu_get_aio_context(), > + virtio_scsi_hotplug_notify_bh, sd); > } > } >