From nobody Sun Apr 28 20:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516359974831591.6758625024456; Fri, 19 Jan 2018 03:06:14 -0800 (PST) Received: from localhost ([::1]:41676 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecUDy-0006FR-C1 for importer@patchew.org; Fri, 19 Jan 2018 05:48:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58014) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecUD6-0005rY-3w for qemu-devel@nongnu.org; Fri, 19 Jan 2018 05:47:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecUD1-0008FH-9p for qemu-devel@nongnu.org; Fri, 19 Jan 2018 05:47:48 -0500 Received: from mail-ve1eur01on0102.outbound.protection.outlook.com ([104.47.1.102]:4837 helo=EUR01-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecUD0-0008EV-Mj for qemu-devel@nongnu.org; Fri, 19 Jan 2018 05:47:43 -0500 Received: from localhost.sw.ru (195.214.232.6) by VI1PR0801MB2077.eurprd08.prod.outlook.com (2603:10a6:800:8b::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.428.17; Fri, 19 Jan 2018 10:47:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Ml9TwID13LC0coeMvFnoTQBSHpsrc1JhlEhL860enDQ=; b=ErRQDr4nkqJiLgQwNpy2qWTnC8B74cdmTv4UhArJ/QRxMMYfY4s3tS86jAyMgomU606AORgwkWialUkOzwNqgg3P5uRlViTjWFElegqSyPzeIhf1hPTOmR04Tsc21IugX8Y9E65xmIc3jY/tVM6bL1sRo95P3Jacw5lHfMoJ+yw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=klim.kireev@virtuozzo.com; From: Klim Kireev To: qemu-devel@nongnu.org Date: Fri, 19 Jan 2018 13:47:15 +0300 Message-Id: <20180119104715.22184-1-klim.kireev@virtuozzo.com> X-Mailer: git-send-email 2.14.3 MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0202CA0033.eurprd02.prod.outlook.com (2603:10a6:3:e4::19) To VI1PR0801MB2077.eurprd08.prod.outlook.com (2603:10a6:800:8b::22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 74125dc6-3904-4246-25c9-08d55f2a0fe2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB2077; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB2077; 3:if7IlRPw8cdYcF16aphjZvmKDSw3yawxp5hWBdd0tI463xD4Gog+pFyqgusTxD/dqWT9XuL9MUYxPAL9zSSiiDH72OROX1W3dzjEOH864z6K7fOISgVnk/VVIK14ONA3A22vRBlFqfOzE625N/B5IwmFGEWHIsxvOrFD/z7NQkkWM9R5MJGxwuoTRzo/DK4DHRuiQuJ5nlyItToKbjDqhNaDHwE6NO9e9Kyb0M8qETEw1yPd+faQKeAgwkT55Mdy; 25:49UoJvYNlUwlBp6RLY6/5o6YkZa/iM2ZEknN8jLV0NNY9XJrFc0pA90oCtHEhWr0tFnsg5vKaKKSQlORynmfbrL1zt4h33lcHacIISDN7qL+pMMcu61pgbCj/XxCjOLKYetSU/nqgsQB/BaUiEAlhvZh7WVWCghF9v2GHRJILXw0pJjQxxGv8a3T1WMzmWk/jDtX/YsBr1dXKCxG6iBryT5UWA7Mq2frprGxPuPb+fF/y7oPzzUznPWiK/HmWuIdqdLj5TfhidCv1Dv3OOnXcsFOB1Bjx1JctDY/xoQ7aSPFYMZixmM9APueeqV5gg0BpJ+9jOCdsVFc75YZQ95ubw==; 31:Z5KFU0/Seqefo5wEVUK+/m+i+Xif0D9BK4nu5bx5IOv5yB+Yv/12H755/j2QEIEJRtcVYGipjhJsFGIS3GDdkmlb5htqQF+Ufib2a0jwp2YnNSg6c6GQOX0Mbi00fSKaFfOZYoaLM3Li+5GCY/+GO+7jWDT0de1RjQsX2duN0YVojWWY8boUx3A6nKc6eVkhpLXnMucvyLdwd/Vy3bb4tf8lkYLMRUUMjJlweO2JIIs= X-MS-TrafficTypeDiagnostic: VI1PR0801MB2077: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB2077; 20:CKJjbFP0tRoIFdm5jYV7sZqbiY4GKnYw8ekG2bh0JPXNG7Zn1Fjwm0VZBpkBAQJBVs5ReC9FopM643Jh3nCs7xlINpc8FgXpn4YwJcnM9VIH6Rwbr3gps50hbmX+u6F3eXrklVXpXWjm5MebW1ezWFCnBu0VjaDeQJQFykKIR4gsVH896NCGDbTZSELjb1G8GJ4mp0Eq2whilYpyw1azFIkBPOy5yZbIOSrcqdFDqrGJO5CSxIut+YkEixKip2nFq7EpXdTLhF4jOMu/7BKXqbi05AOLEBaFWWe49cJQqEuAIcGVsS0F+dqqLM5RXlfenyQONTQDVmBDyoSQQA604lpFrdBTq6hK+b8iC1HJh6DDaGmmyj4bawUlpNQltPzBsKj97soHwOpt2qrVAxZ5VS3Nqr1zrfw/g9e+P1441uE=; 4:l/HHWIuaD6t7xnEuNZX1JZPRNPP0EW6DwiXBg2AFu1ZW3cMcYKRDWnNpxCypzTtkELsxjGonoMIb3qNJ66oJb32Kyi2esaGJHuz9ibceg8dWZLktenRsaCxwRRPe1dBf3HcSbcT5h1o/gRmt9kFzPCJYGzA0LGdjxh/FjQuanjVs4uKw2/J90gBtfGpm/104Q9nhDNIjyJwE1JCQVOP9tQHqcnd5i94rDBZDo6sxgcwvUryXquWYmD6LkI7yjossmsM+l7SdA4ZtR8iNqtvpCIjvoFnIGjiIwnPwtjBo+9BgGoEKsnFCHlcPqySxUI6C X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(3231023)(2400076)(944501161)(10201501046)(6041268)(20161123560045)(20161123564045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR0801MB2077; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0801MB2077; X-Forefront-PRVS: 0557CBAD84 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(39850400004)(366004)(376002)(39380400002)(396003)(54534003)(199004)(189003)(53416004)(4326008)(8936002)(68736007)(16526018)(3846002)(76506005)(305945005)(59450400001)(69596002)(2906002)(81166006)(81156014)(66066001)(6116002)(6666003)(50226002)(316002)(36756003)(478600001)(6486002)(25786009)(5660300001)(47776003)(386003)(6512007)(105586002)(52116002)(51416003)(50466002)(97736004)(86362001)(2361001)(2351001)(48376002)(106356001)(8676002)(7736002)(53936002)(26005)(6506007)(6916009)(16586007)(1076002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB2077; H:localhost.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB2077; 23:YJ2OVSxoh02bCpZUqfIUEPwfEc6TaulD4uDfFzt?= =?us-ascii?Q?wfpMsvZTYy1niF2cd0vsFF1xinkGzkXTki9LroW4t2+xMumuDgfbob4Yz+TJ?= =?us-ascii?Q?sKaAGOFDAoil/45m6izMG3I9vU0J5B0P9qCP3xVtH70Oe8i8fQuCMji57UNn?= =?us-ascii?Q?W8zj61nAPFAeU+bC1XGWXtj6W0mpQ1/c7f+EwYELnvpDJuzdMj7a6C4MrWcY?= =?us-ascii?Q?0euhQh6EidJ9mAHJoFTxW2Omd6GtJpamLIL4NLK8HgpwnmheN/MtSn9hHS7H?= =?us-ascii?Q?7i/DIzJ0ARej2Ubnp3ExJC1dfiuXw3S5AfpNMtyEyVM8+oTYvXOxUdXPwbYD?= =?us-ascii?Q?gsC7CXHmFrKtXlxiu0hmRISSEaL8nwaxaDelgcjs9kixDkBzwNMEE5j8eWCJ?= =?us-ascii?Q?wuyEo497rubgCK6ul2l9B4eTFxHkL11zb7FNiOlct012kFBuzq1p4q9d0ioH?= =?us-ascii?Q?pqtK41C1rJhgfeUiNYylv6fbJTkJKGKVkC0nJ2C6fdGOF8TmsKWtbCZmtRCd?= =?us-ascii?Q?yNBe72iyQy5s0awXoBqj6uCxOa2pp7z9atR53DrZ3qK6jkwMwpKCZR2Wvnos?= =?us-ascii?Q?Kgy3v9keKlI0Oaja3bGsU9laGTaDeoTaPa8UuroNWq8sSc+6FSWrMpffFUFg?= =?us-ascii?Q?VJbEWYXEk3uJTkoKw9rbY+gE1CZ5cQZ+eWA7dISDVxpefHLUDvbfDpTlPpUU?= =?us-ascii?Q?qTL98p/LoaZHQXG1tjaMwmKMqgXjXv1+jBqXZL69ndI5Y+PVypTlA43qvvXn?= =?us-ascii?Q?Yzl9Phe405BJ5/+GhGRNwW2wGPGCa7CgtT/GDs7EDgFZBxGW9PegykJYxmI6?= =?us-ascii?Q?bic5olTIpYnVtigFMAnlg3Ia0+aT2+wcC3fvaEXPSNp92wRFqOX8Aad81jCd?= =?us-ascii?Q?eJhAoWDHCD2PN/Ixn/jVMdfraQ8G0b7EeNIpZmHzj7fjsjmN1WPWrJHp3FnI?= =?us-ascii?Q?i1zyF4vt1pRk/3AZmLF/NJbtEwKWgvUaM0lX3iAI1pJ8tS0Nt7ChgVyVsrhp?= =?us-ascii?Q?ddAPJspqRaozqMeyKXh0srG1eqDOxiNV9FX3h/1gApYUXBfYaTR658RLSzTm?= =?us-ascii?Q?LKOKYH/FTUZI5deBYs14HSmsNS7ULE5ZkNPhlch2tfPebjgyri8dv72LZTUj?= =?us-ascii?Q?fHkkD01Gx3ZbRjR1qCvcF8uliI3zBqwH2xbw/tZGofX7/ZPktmhmVH717npN?= =?us-ascii?Q?dtSXrQT/sbPlTZYEFpCiDmlzg7DXI5EdtNfPakhN86QVinwA50q4XLGCMQg?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB2077; 6:9WSRjxmb0C3OqJh2HFI45vMUIsgeg/Kq9MzfTdh4NRgSeC/CMl3pCQfsTN2sXk2JBAzKRWcnzZIMJE+ph7Q7tn7n+yNpg9bZR9l0u6YeNEf+Nub7Js7H90cEz9CXVxXWDvA05VNxl2qqyzjI3aNj5AHfMlmwbx5WkpTs39MTq70a/jpcDPEPZkLnqjaWB0LOSe86jxSaz8O+Jr8/d58zTK3H2EK/Ul0PpDa7znVrGbtxr/8xUdsb0NpgphQivgR75ZeR262NfxpfGuq18Iy2vqLOjdxqnvfantG1yWI8MLXjrDLOzdhtohfmOhPxPQPyEU2CrMelcAmv7Jx0fDBS1s9QhhasULV4TxwTlqpNWJ8=; 5:vXttYiYWYMCrPh9V5c9HyGPwl91YJmAHLcdobvMg+LFH3KDMpIXYXBKer5UPuRAmRwPvTU0SNyODk36CG65hsE1QN4SzRYG38eFWWpCw6OgX9gTVtBMVkWmEsOwyJwSGeuQtZrYDYgowvanswcGx67zFTw86E49+yWBANpltr38=; 24:ti0wmObUP6HhD91L0Uwqm5FNK6kUvoAc9EXz1iHI+aKj5uyVAo4AACk2aX9z+d3E8uFz8/CNBxbbh3RLTPJvFFH2yI0/HG+Q3An3zIZjMwg=; 7:7yo9A677Qh/LycXC8C9XxJe/pSHpHEcZUgDc/v+JgKPFxdcSDE2KfqLB2dKsa5WqYa+3D9RDU2X0XpZ6Ooz3Bg1t3rwJICBwCLkZOz6jwVUSr2OnRClOUFmNx8R11UYGSjj7tVUKRUnp/hGCiVRRDxp6NMi6JD/bo7+7biGhgeYcNak4BybCBEnUJR3Pv0E5M2vuGaFvZHU4k3Vt+9PFOLW17s5PmnsrUUY/xA84+jao8nRaIaCWVHebBS81pCwO SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB2077; 20:bXOHFtPI2Ia7uY3hIo7di09xMJWyleb/f48/e9B5T3fsIxo4HYRORoWoUg4Tv3zTvI5SyrqKBudHgdp3CWTxENaQ17CDNQbVqGa0JMQEi3tdRcLlu/hk9az/rQvW8/iT4dB+3MXaPr0nJHB3NBkbG1J/TSMdHbSEpZekmPOQorg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jan 2018 10:47:39.9256 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 74125dc6-3904-4246-25c9-08d55f2a0fe2 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB2077 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.1.102 Subject: [Qemu-devel] [PATCH v3] chardev/char-socket: add POLLHUP handler X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The following behavior was observed for QEMU configured by libvirt to use guest agent as usual for the guests without virtio-serial driver (Windows or the guest remaining in BIOS stage). In QEMU on first connect to listen character device socket the listen socket is removed from poll just after the accept(). virtio_serial_guest_ready() returns 0 and the descriptor of the connected Unix socket is removed from poll and it will not be present in poll() until the guest will initialize the driver and change the state of the serial to "guest connected". In libvirt connect() to guest agent is performed on restart and is run under VM state lock. Connect() is blocking and can wait forever. In this case libvirt can not perform ANY operation on that VM. The bug can be easily reproduced this way: Terminal 1: qemu-system-x86_64 -m 512 -device pci-serial,chardev=3Dserial1 -chardev soc= ket,id=3Dserial1,path=3D/tmp/console.sock,server,nowait (virtio-serial and isa-serial also fit) Terminal 2: minicom -D unix\#/tmp/console.sock (type something and press enter) C-a x (to exit) Do 3 times: minicom -D unix\#/tmp/console.sock C-a x It needs 4 connections, because the first one is accepted by QEMU, then two= are queued by the kernel, and the 4th blocks. The problem is that QEMU doesn't add a read watcher after succesful read until the guest device wants to acquire recieved data, so I propose to install a separate pullhup watcher regardless of whether the device waits for data or not. Signed-off-by: Klim Kireev --- Changelog: v2: Remove timer as a redundant feature v3: Remove read call and return G_SOURCE_REMOVE chardev/char-socket.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 77cdf487eb..83fa7b70f0 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -42,6 +42,7 @@ typedef struct { QIOChannel *ioc; /* Client I/O channel */ QIOChannelSocket *sioc; /* Client master channel */ QIONetListener *listener; + guint hup_tag; QCryptoTLSCreds *tls_creds; int connected; int max_size; @@ -352,6 +353,11 @@ static void tcp_chr_free_connection(Chardev *chr) s->read_msgfds_num =3D 0; } =20 + if (s->hup_tag !=3D 0) { + g_source_remove(s->hup_tag); + s->hup_tag =3D 0; + } + tcp_set_msgfds(chr, NULL, 0); remove_fd_in_watch(chr); object_unref(OBJECT(s->sioc)); @@ -455,6 +461,15 @@ static gboolean tcp_chr_read(QIOChannel *chan, GIOCond= ition cond, void *opaque) return TRUE; } =20 +static gboolean tcp_chr_hup(QIOChannel *channel, + GIOCondition cond, + void *opaque) +{ + Chardev *chr =3D CHARDEV(opaque); + tcp_chr_disconnect(chr); + return G_SOURCE_REMOVE; +} + static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) { SocketChardev *s =3D SOCKET_CHARDEV(chr); @@ -528,6 +543,10 @@ static void tcp_chr_connect(void *opaque) tcp_chr_read, chr, chr->gcontext); } + if (s->hup_tag =3D=3D 0) { + s->hup_tag =3D qio_channel_add_watch(s->ioc, G_IO_HUP, + tcp_chr_hup, chr, NULL); + } qemu_chr_be_event(chr, CHR_EVENT_OPENED); } =20 @@ -546,7 +565,11 @@ static void tcp_chr_update_read_handler(Chardev *chr) tcp_chr_read, chr, chr->gcontext); } -} + if (s->hup_tag =3D=3D 0) { + s->hup_tag =3D qio_channel_add_watch(s->ioc, G_IO_HUP, + tcp_chr_hup, chr, NULL); + } + } =20 typedef struct { Chardev *chr; --=20 2.14.3