From patchwork Mon Jun 26 16:45:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Anton Nefedov X-Patchwork-Id: 9810093 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3A7EB60329 for ; Mon, 26 Jun 2017 16:48:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 329182811A for ; Mon, 26 Jun 2017 16:48:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 24FD52858D; Mon, 26 Jun 2017 16:48:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1BA992811A for ; Mon, 26 Jun 2017 16:48:31 +0000 (UTC) Received: from localhost ([::1]:47627 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dPXBe-0002EI-3Z for patchwork-qemu-devel@patchwork.kernel.org; Mon, 26 Jun 2017 12:48:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55278) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dPX9v-0001yw-Px for qemu-devel@nongnu.org; Mon, 26 Jun 2017 12:46:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dPX9s-0002pw-Ip for qemu-devel@nongnu.org; Mon, 26 Jun 2017 12:46:43 -0400 Received: from mail-eopbgr10097.outbound.protection.outlook.com ([40.107.1.97]:8480 helo=EUR02-HE1-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 1dPX9r-0002p3-Rd for qemu-devel@nongnu.org; Mon, 26 Jun 2017 12:46:40 -0400 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=HPow28XHVpAK0WLNloHYiY7TtUoMpuzcU6szdPz6GqI=; b=gY5gdi13W2btwvClquelOpbQVFGQKt9XEZQNFo9IUiUh4jUveAdWUJBI91WaNRCr6o8XQf5lUVnTIXdjA8x42dzujftlEMCEANcCMzsliYkM38fYi5TwSGN2RYs3Xw5QKBnGpbiysV7aXRf6ogPgBWA6TPufB65VakD/gaaxgHs= Authentication-Results: nongnu.org; dkim=none (message not signed) header.d=none; nongnu.org; dmarc=none action=none header.from=virtuozzo.com; Received: from xantnef-ws.sw.ru (195.214.232.6) by VI1PR0801MB1998.eurprd08.prod.outlook.com (2603:10a6:800:8a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1199.15; Mon, 26 Jun 2017 16:46:32 +0000 From: Anton Nefedov To: qemu-devel@nongnu.org Date: Mon, 26 Jun 2017 19:45:39 +0300 Message-ID: <1498495550-72357-3-git-send-email-anton.nefedov@virtuozzo.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1498495550-72357-1-git-send-email-anton.nefedov@virtuozzo.com> References: <1498495550-72357-1-git-send-email-anton.nefedov@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HK2P15301CA0013.APCP153.PROD.OUTLOOK.COM (2603:1096:202:1::23) To VI1PR0801MB1998.eurprd08.prod.outlook.com (2603:10a6:800:8a::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5f5735dc-de76-4486-2797-08d4bcb2e8f9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095); SRVR:VI1PR0801MB1998; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 3:8qE5+crfi4FbvRKNEkmy2gyczeGH+ayOW7o9M6E5d4+JiVEQp9ozpaoS5xKlva0LSVS/D4h9BPArNOf2M+Hx28rUSqn4Kd5nV/d/okxdcN/3lZ4M5J35jQ8yZnGplP5GXU8/U039S0+6CbzripJ36rGMMKL3ewpoLQiP2GtBsbBnWcoPZpv4JdSsHZJI6IbJ8967M5fq73lFpVnA0jhgDWM7bl1gd1WsytTx/iKcZI5cXvqgG+8a0RiJJ1puLSauzIxHLv3NjBLtIeq4cZ4MZaXKCMArT4GbSRReUscRswdATwS654oV2D1Z8+yL1hhRD8YPaQHHmAaPridHx+7Kp1v15GUJ/u+xMTKQrZbOcj3U2z6i4bQyAFR2Mxr0B7z+sfW7wHUuPWlwOCns7lSVNeW9ogTfH5uwXrANX18I9Toint9654AcBIggyIhNkzjB09PTZqwQCofovphQiTzOGedD4NHfKTtJ0mHk6uCg33/uLe3zk1KbFpmPHWsuHH+1bmz3WcPf/cBxJtD1x0AgeFdrtzxEG++WZKwwbeuRxC7JxXZpOjp7GnavyDBzY3b48uOVUluSJs5qtqVL2/p3pmeGFGnh8GO7hGFxvmAfuzXm85NghrfH8H0AcqjvtlevBfil1IVka3RIKvghfdxATtlBAqZ2IkIK3vnr1FzedPYKOq37/NPsAn/Jgz/f3/e9 X-MS-TrafficTypeDiagnostic: VI1PR0801MB1998: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 25:/3t3rNjLdRzKe2GjsxTJojvpWC1fhU7QUmJl6urzfPXqhjDL1T7vbyXA5odNSwMiNCYtLhZbVwcoXXq5KNpmwidbZAuRwT0XmqhMHtjYctB8yckdqWORSWnhwdKcFLzdrdzOC5m0wIRplJcaF53GJhdV5GTuixnzz6pJVkg1bLJOD0CWfWlCqF86y50kmFobo13ACR4X+IPtdioB8GbZMXJb0NolCBztIEVO+y0cKHBljHy3Y3QEt0xxBvKQNcqWVrf7/lBYWzf/7L1P8ja2blK6kIFZs7unsPcc/pwq0hW5OnWtzYYMEXmrYTW1fh1RwgP7VLNXpDNYrZ7Z1oluCJyADf5HQjm3RfqF2r8JV6ILTaqZ4K7E6tEPGABm0xPC5qZdDuiJpUS4iaIM7gj50qFVGgdbYnBdGXXX7DPnnCWcZgB9thNhiqdhoQLGNG9UEZiiq3F6BUoIOloAa+poXS+l2+2rCzEaRt1Y2mX3T/h+r36t41BBF6PvsqazwGB/YxNcn7O3JXwjxBdmu2wv/2e0oY0dBR0Xq3BZv6cIHx3NQ3tChm4YBeviUP4KmDmC32BftC8LWjT6e4R9YA3qSNzkusI5ibdaCQ0v057eiSX64OksK4L/UyET5oMgNed9P2uotfQXNVoNczU5HsDlKSP1CF4COhbHZPn6U7JwhDouiuumqw3YBxeICjnldRhY/YwfzyarqVSE7VLtx//DUuTcsB33CIagLx5kQ2rD41q1gfG6XRV3rtRpeCOq9ibh4MTTTIBjkFq9CjIX/OXtaTvrUzMRM9celXAs53SFaXmCan7a1eQJEBqIU1nPgOv7PR0BBUlFvkkOAbdgpK2xsYD+P1RQKrQW4ej9jkyZiceCESF33uKaITzhICITu+3TxtJoiQDCGE+zYGVVq0t8spRgL0uemCt+m9yB3klQsJk= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 31:7E3czIl98HHreHV3A5sPdH5UULvdMn8DH2/54b8sja43Xq0dUtPKOpGMTT5pUteF0lkYJObn19xpXFRwRyE74445yrey9Fu86W7C8Pz0mptlAwYRvTC1/2fp8sLb3aK5EKTNrbvs0MfnAPzzeUTaEt4yLsdVco48PGgp6Xm0DJAjj3xXTJWpE8fcyvZqBWWQCqGSiG/5gvj5J0/wzDGPfAXVzIdW7ueGW25G8vHml4aTDZe6uemeQmtM0n2SH5Tf9MBcnsXe1i3caiQ0yUYSeIOVhWKPD6+gpOnIFsBS1QC4XAiBEuL0EbHnGcdh4BOJ1m0TQ/lp9fYIIwK2rGHizStP+go+1Wnt5hrqrQHj6JgXbMINSVlPhLO1J+JqU1HXxR9PQRhFBMmUUHmLwdG5XfrIWd8mxBYgzxgXboMXFS6L0tJVDpXYabre40FXGclAKtYqXwkQyBT0+SiJ3kbvL7hWSa4bSZ23+es8HyRU33q//iF6Ld6XssHyAjuKbDrhvEGdUMR+9pEKqhKThE1ZQemM9Xn2bumlgOznGPs+C56L0Ceb5pKmSqGx8J+mLBG1E6/dToCMadvFm5dAi6AI97y0xnpp971yq5T34uxhBqqICgpF6VuUQE1zxhejebZrc7Jg2T9Hbp2dA2x8ZtdV6pW57GykXL6LgnvQklzpQas= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 20:x1Q7UAbsBgdgYXGrAOIQjUWYvENQzhXm5Dk+xx4eW0ttj0+fzNLrAerBrl3wAr3N6w938E0mIP8bJVmyjWi1QEQ0zVQX1YsHlR1GLymt/eWanZHMWOYs6EsBhSTc1BrTB7YCrU+OihlcMgThuk0B8VLw1U1SvFhSypUhKmbEu/taX19toZL1iuYUii8mdzAvm+JwoDclCANspqG3yKCSVVStLjoUrLt66RuGO/pmN8Epo0kxZ+iQE8jHHtaqkwD2TRqvxQp/OReakblrdl+29FZLokRhRIO87P9AB0CrOX3wBTmsnggW0boLohu/ZQnjZ60uSQVA9KTjtmIjAq8gmqh48HQJYVczbJIj+BSW7y3AcsjwZvTrBjxnSIAMXJ1vNH53TyU38MTLkBUd8f+w90jUZjjvVBgs6PcAkOcnNKI= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(158342451672863)(236129657087228); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123560025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123564025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR0801MB1998; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR0801MB1998; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1998; 4:R69jWKbX5cb9A+Q9qXwdyfGS/kZkDQkn9tYdMIBY?= =?us-ascii?Q?xWSIvDjUb7H1zvXNh5DJlu0Rwp4IYx521AaZRytNgvHuDJ4ZkG1JOXVkI6TN?= =?us-ascii?Q?H+4IgnArA88NbbKiDGusfyxdOf49hQ1B0qm04cfUwOJkUJ31xhWycjNXOVsx?= =?us-ascii?Q?meVzER1nn+6Obg2eeKkgxGLcVzkVplgESTKqUrIg5qtxkc7c8WnykuhsIAbu?= =?us-ascii?Q?EamyGBuP4fZNw3CykSdWg9PqJ17myWHr9YMCh3RpZcZ1iXBlcfJtx5K2+o6m?= =?us-ascii?Q?kaC7u8s1872NSFPoY/xZX9B27EOIkCz/niYB/1h121RqigfargP569ZRAi7W?= =?us-ascii?Q?EZpomSk3qveI0n/pA+w1k7G+cXMYuVd1mOygttQMFS+KLuTIkA3D5W+wuKyA?= =?us-ascii?Q?4HX49jGhjwys2xrd10B2mPNZyvmcgTHR1AyvRHK6+QVNMiZUFWwM4/SlLSr2?= =?us-ascii?Q?2+Q19D3/XS2SrRp9AHiQRe+KrwSMvWUbHBjJZGn2RP7yIiv0bXeYy1i6vI5z?= =?us-ascii?Q?osDSEd//vUzV5viDxoLGCiA2QJbz03/hEFaHmXak3/Gc9ejzGZfh+539qB2c?= =?us-ascii?Q?hztNnCI/opliUrMQSXbz+OrRImOdMdeN2909C4wW+3Yk31e94mo23goU4T3D?= =?us-ascii?Q?P2uSNCuRS1PYELoOMwTGW/njegfE7h3HFwy0nxJWk5Z89t+reQ7OmIj9pdz3?= =?us-ascii?Q?jG0sxoSyjupUO/KYjx5p/Xucol+ZNjgq8+E0e8P0gYHJUfC33C/O7SVV5DkZ?= =?us-ascii?Q?F2vbdxINeN8Tnfkm3ABOiALsGH/0QzWpXPCzVEeEjvrDkiOSIGXGdWEeu8jv?= =?us-ascii?Q?lIa+KgVjel2zY0KRCj4/gFixHS2YP1Lw7enPykL7gofFAMwixCGkEGvbVDys?= =?us-ascii?Q?DZyUweQZVpGcfC4jgJT/yEYCNSGB0o5KFRKt0lX4gL67qJRVdklofh5qgr+D?= =?us-ascii?Q?BsevShiNq6yGfm0qAQkdvVHbeqoTSLGhyE1susGWVv3cjaTv4BbtQhbqbJpJ?= =?us-ascii?Q?KeoA+VVNKaI1SXnbKaf+01WrGI2wVAJHLVVO9K6I9o0iYSciguZYNwW2EA7h?= =?us-ascii?Q?A93whUVfelF1z/oheyHoXcgp17EghzqCLpc6EwYLFRIfO7LSfGccbmbhjHZp?= =?us-ascii?Q?XuyU6CpHhmshu1DM1Lz44nOZBXlgKUQh0n7++fysiYH2jlt8FoX3B61mIu+Y?= =?us-ascii?Q?VJLjOzuRG4UliTUPUk5CGkEgMSdKdbiWxm6TVcGY1y5J8TvqM/yaVj8o+w?= =?us-ascii?Q?=3D=3D?= X-Forefront-PRVS: 0350D7A55D X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39400400002)(39410400002)(39840400002)(39450400003)(189998001)(575784001)(86362001)(53416004)(2870700001)(478600001)(53936002)(53946003)(6486002)(5660300001)(50226002)(5890100001)(50466002)(42186005)(36756003)(81166006)(25786009)(50986999)(6506006)(76176999)(3846002)(23676002)(66066001)(47776003)(305945005)(33646002)(2906002)(38730400002)(110136004)(2361001)(6116002)(107886003)(4326008)(7736002)(6512007)(2351001)(2950100002)(8676002)(6916009); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1998; H:xantnef-ws.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1998; 23:Y+hYL4gw5LwEubD5gDLrZD0v0xwDdWFEaisfElO?= =?us-ascii?Q?BjT2nYRi7Nd8aeWygf4PSZn82MVQ09NjTgN40G+sA9oW6sD4FPw0mgXjGmnv?= =?us-ascii?Q?GO5/lm97C09IgreqoEyFht6GLzc15su3VMabKR1KIrj5RkyeHQDgj7Gmx7lb?= =?us-ascii?Q?8JLRAsC2wivfOajLs3xakeCHD303VQ2uTMVRV9df8FcDTKfEaKlUzr85vIoi?= =?us-ascii?Q?xFf5MJzibhHKOWTVzRSsJsqN2dwDfFA/K5v8coiiJ/gMHM5n3q6hEXxW8Ki9?= =?us-ascii?Q?FGXkTr1L2IeEkrS1WamD8b9uR1i6qSq7/xPMZB/+OhWH8R5q03LIRpDQsi90?= =?us-ascii?Q?BRU1hdJCV6z9Ba8XjahrjStIxR1QB88opn47pMCin8XFoLqGTwzOkjBrBShi?= =?us-ascii?Q?M1FxNcHJz0Oz2afG9iAcYbLi2TppQrhjKDf9ZVhe4+z/md6fEPltm4EHQcIu?= =?us-ascii?Q?l7dqsc+Y5FAeknGHiYh4sVrWp54Hm0aL6TU7Acs5FA3mdtCPIWw7C0zxZr12?= =?us-ascii?Q?+MWl5jgsJOgZ6aYWjXLMWEle8IGDJc+PGGNH0KSzbX3fFaqLT3nk4Yol0t4v?= =?us-ascii?Q?bh7VaEa7U+9gSYtoJD5Wl4C19NI9aCTQdm2ukVLcl6K9diPGzaAQ5vNImWhy?= =?us-ascii?Q?vqL3u07dR0dGwbsPu13j9x5r6q+qtvk7XZLpSeSk1kSUTiNhFomqio6JEFYe?= =?us-ascii?Q?0PswOjGxnP32OXrlgojSlkfujYYLZ1DpoLmZ2gRIagrZrxpdoorbAhgyW2BH?= =?us-ascii?Q?90DhBSKcqdN8TjYkHi9UmZI8z9jMqbn8oNHFN1X0iXrN82cBnyS3EcSBdZU6?= =?us-ascii?Q?fxBtP3/0/8D9VHmHFE1pQPN38A4CglVtXKxwqvUkVZfHa2Ndey67eq4EYsHP?= =?us-ascii?Q?JexFgqsMeEeEXNs3Ibn+njqyi5q0mJ1bUnEDVKIB9yiiFeWPIyUu0MN5NXnY?= =?us-ascii?Q?5awK6jazHkheY3QJ710ODEP5aYTOxXoj/oOZV4Uj8h8GHLFpFsaQ+pcDo24i?= =?us-ascii?Q?izDBHPrkPW4+OBDA7NcSs4eKxXviXbMp1/o1OnKjkZGAv6q06CPsY6WBoXKG?= =?us-ascii?Q?qUWy/niHwnphqicCgp5G6qE9qXvdAMAIBcd4If1shNjLHTaSRyr13+hGDibz?= =?us-ascii?Q?as/9VRcevJN4=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1998; 6:qawov/uEIQWT5f2z7Sg2ZSOs8evYqhTaWMdu7mrg?= =?us-ascii?Q?1uNPp4C/CpPZ/YTG6eZmEsJ2xvOCdzzQIGTGNAlG3Osd/gJX7vLBsTJUSnfK?= =?us-ascii?Q?25POEDByrTEPhhFB8gTZbPpckAYjSpAG2/lBG3evuAlR6Fu/hiWrUgTiiN9z?= =?us-ascii?Q?6b14ehA1eVubnyA9r/4lgxCy5bGCiGHzzavf/b9bokQOqWTRBk2IZ/5qk58f?= =?us-ascii?Q?DiAZlAQVLe41BhiWIoQNnd6zRn53UAopQ79a73lxrVl0e+CBgQ/QVwAISIov?= =?us-ascii?Q?D9XTgHpWGXf2ujP2a9JVGLEr87b0T4EV0cJTU26mRER2FcmzlUaLoVpRidlV?= =?us-ascii?Q?6rZaEGJ+2FJoJecEoEvMOoe3kyRkU0FiIPxlxmvf8QZn9dD2sy3arTs5vVYy?= =?us-ascii?Q?AqqIKgnitpCtOw/XIBwQ7zylVJ+laE52L030pjcZaV/fG1mbG31Y+bx8X9I7?= =?us-ascii?Q?BymZwzHJ7rNm6WA8lR6tehGkRymap1GVQtcWl2XLMeDwFNswE3+TntZICb+m?= =?us-ascii?Q?vh/gWUYKmPO4CEFGKsvq1LvC4ARl3IaPu351YR4IajuadXz61ZprA2tXfN7v?= =?us-ascii?Q?n266HFsuBT0rRedBgMZ7jARLHYGhlNCZfoVxAOIEHup28guYWdz3n1WnCoYl?= =?us-ascii?Q?x6F4TX/wvzfUR6ETeqiniOiUbgI9MKi6qHs64BAYq5T6FfceEI45lKLRW2TG?= =?us-ascii?Q?tz3EE+67nf5/BHsTYt/qx5PYwmzGSlIZ5mS4o47Zaw7VzbwuONhehmqa3Gbj?= =?us-ascii?Q?l21qlnnKVexPXHUOEP5KVZOfmB9V/iD7N7j2qQTtOaPe/pPMIPqfnY1+Kbmk?= =?us-ascii?Q?9DpCZU6VDkFQ7mZYNfci5lkSui9Il2EZmUiv6/hssT3Ddbgx8BtHTycKQA0G?= =?us-ascii?Q?hbm0H6f03y45qjRspGmFLfS7/9AfeoNLmCvuDvukLDCG+K6vuDYRGOdDGjQw?= =?us-ascii?Q?mlUZJj/68BkTV9ctcsfFpGzgFkJ0erFC4VvR/ddx8BL5+v71oQlS6wSWWNr8?= =?us-ascii?Q?Y4s=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 5:Akxi2Z9SJuk4111P81gN6et4CK/o3Dqi2gDJMorNmCpUNcZ8XNKm0CXrC65iVL7yqlU69jvGdA+uH+FBpx8hZrv60I82Q/BK3i0UCTNJYXlSRRlvrUR84R4t00e8qpSDHMytYYKlxOetq5wA1sXYyIpR/EJ6XjL1of+PLTRg3GsgaBBewwgOasL/qT0r9m9kocaZ+/l0c04yH3vgnxyVkJWNxzEeWktj2+sAqjibit5R6n9YohioVHCA+kXFHeekYF2FW77YdgrodmHA8BdUL9UyZZoeHTRvUcEbG7/o+MD3igKKZ0xNF7VAqrKVzC+i0/1IDJeqzBeTLqahEtJwM5GnyFwAx0O+/egtfI5vohdNgqlFLHPa0jzWM/RAl3MS19vFa5iug7ir3/enc7ksUCYhmoZ6sptk1mLqx9t1P4LTXWLxINp6qnOlu0TNMOLmSv2wF4NLaRomVcLV+bLUPSnyJ6v54EZqleH4CkmbRdQkEYJxDQndnXtGWO1J9zvk; 24:fGVJOFInJooe2nOAemrJLsATgfggOAQm94jWiQRoN0CUgluAbM88myONHgn/rXVi72xZ+PucNvDOKVY2yu+DYriDd3fpVJR93RE2+T051Jw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 7:1BzIjqp/6JVQ+vUKi2t6J4PPpaBJMpmSfSVSyJQEmox4H3kzQZ3hncxGyp/wm31IIfVygYz2ONzcyYE2bb8OFLZ3405LqDqyMlChZ1WokAHKhlTISmNruLkFANSxi71b1fQTl7E9BoBhZDaZPfB1qECMgZe+H1dMlM0svT6EaX/GonFs5st9tMbCJGqesL7W6kNadG77KSNQBTwEaQoI6wiIC9+W0K7UDkGrv46fEVWrqa01PzhV+ney1tzzgR/KqmFQhpuFjtyY8TZBSsl6cUcxMo8J8rdF0KSJGjVLUJPTfWiPEu+y1HrPE9c6iHK1n3A+M4qSimTJxl5QqNwmvFsIAbvJqVz1dHWl3wEfajOmaGZNKG4ebPKLOFkRueAzvNq64Y/AOwcXQxw/ifWtIesT4cT+f6K90y6bvg5kbE8Sss/WJ6UsphOkKCqpVT4Qa3V7zWiF/nvOU7YQQGR3cBZwm+bdx/eYXV6h/Zd7+UO/uYzrUECDwgV5sXzJ8viwycKxBSHvCL94uhSkeRRjSm7IO4B1zXQpd0wVwvu7EjLXcaCn7Wiwp8nWEvWHYEJUY4V7RDJOEcKbxn9HqmPDjgOXNp3hC1dwwSW4zqGU/2JP0JsJaNVvzUqIpTxqqRpsUER0HUa/AylWElPrbnu0nwC6B/cnFEsa0olYaSWXi2BkM7RiSEEGu+uvla7q+qUoeTx3xew8N7lP79tOOrZgxGMuyCElMZWiDngiwAjT/o/hGkXnYWHYKpK9AQxJHyJchcXzfJV6DNzFXByKTvh3u4/EdjJ7BW7TCBKEPKG3Luc= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1998; 20:ceAfse6t9ChSidxrWYWy9JodXJYmENjuwvhdRl2N9Yh3HgCMmzMmrnO+tN6K/E1Coh7v83pyDGOl/IrbVcYvlmfVXR477W/roHr+ofWJ/hy6D+KuauG1TE7af/0smPHPwmOznamLZGfnKE1vUz/a7bwtWkvuXVHJSYNNwVAeSRc= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Jun 2017 16:46:32.7894 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1998 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.1.97 Subject: [Qemu-devel] [PATCH v4 02/13] char: add backend hotswap 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, Anton Nefedov , den@virtuozzo.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Frontends should have an interface to setup the handler of a backend change. The interface will be used in the next commits Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-André Lureau --- include/chardev/char-fe.h | 5 +++++ backends/rng-egd.c | 2 +- chardev/char-fe.c | 4 +++- chardev/char-mux.c | 1 + gdbstub.c | 2 +- hw/arm/pxa2xx.c | 3 ++- hw/arm/strongarm.c | 2 +- hw/char/bcm2835_aux.c | 2 +- hw/char/cadence_uart.c | 2 +- hw/char/debugcon.c | 2 +- hw/char/digic-uart.c | 2 +- hw/char/escc.c | 2 +- hw/char/etraxfs_ser.c | 2 +- hw/char/exynos4210_uart.c | 2 +- hw/char/grlib_apbuart.c | 2 +- hw/char/imx_serial.c | 2 +- hw/char/ipoctal232.c | 2 +- hw/char/lm32_juart.c | 2 +- hw/char/lm32_uart.c | 2 +- hw/char/mcf_uart.c | 2 +- hw/char/milkymist-uart.c | 2 +- hw/char/pl011.c | 2 +- hw/char/sclpconsole-lm.c | 2 +- hw/char/sclpconsole.c | 2 +- hw/char/serial.c | 2 +- hw/char/sh_serial.c | 2 +- hw/char/spapr_vty.c | 2 +- hw/char/stm32f2xx_usart.c | 3 ++- hw/char/terminal3270.c | 2 +- hw/char/virtio-console.c | 4 ++-- hw/char/xen_console.c | 2 +- hw/char/xilinx_uartlite.c | 2 +- hw/ipmi/ipmi_bmc_extern.c | 2 +- hw/mips/boston.c | 2 +- hw/mips/mips_malta.c | 2 +- hw/misc/ivshmem.c | 2 +- hw/usb/ccid-card-passthru.c | 2 +- hw/usb/dev-serial.c | 2 +- hw/usb/redirect.c | 2 +- monitor.c | 4 ++-- net/colo-compare.c | 10 ++++++---- net/filter-mirror.c | 6 +++--- net/slirp.c | 2 +- net/vhost-user.c | 7 ++++--- qtest.c | 2 +- tests/test-char.c | 14 ++++++++++---- tests/vhost-user-test.c | 2 +- 47 files changed, 76 insertions(+), 57 deletions(-) diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 2cbb262..9f38060 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -4,6 +4,7 @@ #include "chardev/char.h" typedef void IOEventHandler(void *opaque, int event); +typedef int BackendChangeHandler(void *opaque); /* This is the backend as seen by frontend, the actual backend is * Chardev */ @@ -12,6 +13,7 @@ struct CharBackend { IOEventHandler *chr_event; IOCanReadHandler *chr_can_read; IOReadHandler *chr_read; + BackendChangeHandler *chr_be_change; void *opaque; int tag; int fe_open; @@ -54,6 +56,8 @@ Chardev *qemu_chr_fe_get_driver(CharBackend *be); * receive * @fd_read: callback to receive data from char * @fd_event: event callback + * @be_change: backend change callback; passing NULL means hot backend change + * is not supported and will not be attempted * @opaque: an opaque pointer for the callbacks * @context: a main loop context or NULL for the default * @set_open: whether to call qemu_chr_fe_set_open() implicitely when @@ -68,6 +72,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, IOCanReadHandler *fd_can_read, IOReadHandler *fd_read, IOEventHandler *fd_event, + BackendChangeHandler *be_change, void *opaque, GMainContext *context, bool set_open); diff --git a/backends/rng-egd.c b/backends/rng-egd.c index e7ce2ca..d2b9ce6 100644 --- a/backends/rng-egd.c +++ b/backends/rng-egd.c @@ -106,7 +106,7 @@ static void rng_egd_opened(RngBackend *b, Error **errp) /* FIXME we should resubmit pending requests when the CDS reconnects. */ qemu_chr_fe_set_handlers(&s->chr, rng_egd_chr_can_read, - rng_egd_chr_read, NULL, s, NULL, true); + rng_egd_chr_read, NULL, NULL, s, NULL, true); } static void rng_egd_set_chardev(Object *obj, const char *value, Error **errp) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 3f90f05..7054863 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -216,7 +216,7 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del) assert(b); if (b->chr) { - qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, true); + qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, NULL, true); if (b->chr->be == b) { b->chr->be = NULL; } @@ -235,6 +235,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, IOCanReadHandler *fd_can_read, IOReadHandler *fd_read, IOEventHandler *fd_event, + BackendChangeHandler *be_change, void *opaque, GMainContext *context, bool set_open) @@ -258,6 +259,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, b->chr_can_read = fd_can_read; b->chr_read = fd_read; b->chr_event = fd_event; + b->chr_be_change = be_change; b->opaque = opaque; if (cc->chr_update_read_handler) { cc->chr_update_read_handler(s, context); diff --git a/chardev/char-mux.c b/chardev/char-mux.c index 08570b9..4cda5e7 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -278,6 +278,7 @@ void mux_chr_set_handlers(Chardev *chr, GMainContext *context) mux_chr_can_read, mux_chr_read, mux_chr_event, + NULL, chr, context, true); } diff --git a/gdbstub.c b/gdbstub.c index ec4e4b2..e561244 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -2003,7 +2003,7 @@ int gdbserver_start(const char *device) if (chr) { qemu_chr_fe_init(&s->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_receive, - gdb_chr_event, NULL, NULL, true); + gdb_chr_event, NULL, NULL, NULL, true); } s->state = chr ? RS_IDLE : RS_INACTIVE; s->mon_chr = mon_chr; diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c index 629e6c6..731ed08 100644 --- a/hw/arm/pxa2xx.c +++ b/hw/arm/pxa2xx.c @@ -1970,7 +1970,8 @@ static void pxa2xx_fir_realize(DeviceState *dev, Error **errp) PXA2xxFIrState *s = PXA2XX_FIR(dev); qemu_chr_fe_set_handlers(&s->chr, pxa2xx_fir_is_empty, - pxa2xx_fir_rx, pxa2xx_fir_event, s, NULL, true); + pxa2xx_fir_rx, pxa2xx_fir_event, NULL, s, NULL, + true); } static bool pxa2xx_fir_vmstate_validate(void *opaque, int version_id) diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c index 7683edc..1fa082c 100644 --- a/hw/arm/strongarm.c +++ b/hw/arm/strongarm.c @@ -1247,7 +1247,7 @@ static void strongarm_uart_realize(DeviceState *dev, Error **errp) strongarm_uart_can_receive, strongarm_uart_receive, strongarm_uart_event, - s, NULL, true); + NULL, s, NULL, true); } static void strongarm_uart_reset(DeviceState *dev) diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c index 4d46ad6..370dc7e 100644 --- a/hw/char/bcm2835_aux.c +++ b/hw/char/bcm2835_aux.c @@ -279,7 +279,7 @@ static void bcm2835_aux_realize(DeviceState *dev, Error **errp) BCM2835AuxState *s = BCM2835_AUX(dev); qemu_chr_fe_set_handlers(&s->chr, bcm2835_aux_can_receive, - bcm2835_aux_receive, NULL, s, NULL, true); + bcm2835_aux_receive, NULL, NULL, s, NULL, true); } static Property bcm2835_aux_props[] = { diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c index 4a2c124..3a9335c 100644 --- a/hw/char/cadence_uart.c +++ b/hw/char/cadence_uart.c @@ -485,7 +485,7 @@ static void cadence_uart_realize(DeviceState *dev, Error **errp) fifo_trigger_update, s); qemu_chr_fe_set_handlers(&s->chr, uart_can_receive, uart_receive, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } static void cadence_uart_init(Object *obj) diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c index 762e3d8..9b56fb8 100644 --- a/hw/char/debugcon.c +++ b/hw/char/debugcon.c @@ -92,7 +92,7 @@ static void debugcon_realize_core(DebugconState *s, Error **errp) return; } - qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, s, NULL, true); + qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL, s, NULL, true); } static void debugcon_isa_realizefn(DeviceState *dev, Error **errp) diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c index 34306e1..6ebcb87 100644 --- a/hw/char/digic-uart.c +++ b/hw/char/digic-uart.c @@ -146,7 +146,7 @@ static void digic_uart_realize(DeviceState *dev, Error **errp) DigicUartState *s = DIGIC_UART(dev); qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } static void digic_uart_init(Object *obj) diff --git a/hw/char/escc.c b/hw/char/escc.c index 3f78763..3546df3 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -1016,7 +1016,7 @@ static void escc_realize(DeviceState *dev, Error **errp) if (qemu_chr_fe_get_driver(&s->chn[i].chr)) { s->chn[i].clock = s->frequency / 2; qemu_chr_fe_set_handlers(&s->chn[i].chr, serial_can_receive, - serial_receive1, serial_event, + serial_receive1, serial_event, NULL, &s->chn[i], NULL, true); } } diff --git a/hw/char/etraxfs_ser.c b/hw/char/etraxfs_ser.c index c1fba9f..a184026 100644 --- a/hw/char/etraxfs_ser.c +++ b/hw/char/etraxfs_ser.c @@ -233,7 +233,7 @@ static void etraxfs_ser_realize(DeviceState *dev, Error **errp) qemu_chr_fe_set_handlers(&s->chr, serial_can_receive, serial_receive, - serial_event, s, NULL, true); + serial_event, NULL, s, NULL, true); } static void etraxfs_ser_class_init(ObjectClass *klass, void *data) diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c index b51d44a..a84d2c3 100644 --- a/hw/char/exynos4210_uart.c +++ b/hw/char/exynos4210_uart.c @@ -645,7 +645,7 @@ static void exynos4210_uart_realize(DeviceState *dev, Error **errp) qemu_chr_fe_set_handlers(&s->chr, exynos4210_uart_can_receive, exynos4210_uart_receive, exynos4210_uart_event, - s, NULL, true); + NULL, s, NULL, true); } static Property exynos4210_uart_properties[] = { diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c index 32d98ed..12d0c99 100644 --- a/hw/char/grlib_apbuart.c +++ b/hw/char/grlib_apbuart.c @@ -247,7 +247,7 @@ static int grlib_apbuart_init(SysBusDevice *dev) grlib_apbuart_can_receive, grlib_apbuart_receive, grlib_apbuart_event, - uart, NULL, true); + NULL, uart, NULL, true); sysbus_init_irq(dev, &uart->irq); diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c index af25030..70405cc 100644 --- a/hw/char/imx_serial.c +++ b/hw/char/imx_serial.c @@ -315,7 +315,7 @@ static void imx_serial_realize(DeviceState *dev, Error **errp) DPRINTF("char dev for uart: %p\n", qemu_chr_fe_get_driver(&s->chr)); qemu_chr_fe_set_handlers(&s->chr, imx_can_receive, imx_receive, - imx_event, s, NULL, true); + imx_event, NULL, s, NULL, true); } static void imx_serial_init(Object *obj) diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c index 337a3e56..cc8c8dc 100644 --- a/hw/char/ipoctal232.c +++ b/hw/char/ipoctal232.c @@ -545,7 +545,7 @@ static void ipoctal_realize(DeviceState *dev, Error **errp) if (qemu_chr_fe_get_driver(&ch->dev)) { qemu_chr_fe_set_handlers(&ch->dev, hostdev_can_receive, hostdev_receive, hostdev_event, - ch, NULL, true); + NULL, ch, NULL, true); DPRINTF("Redirecting channel %u to %s\n", i, ch->dev->label); } else { DPRINTF("Could not redirect channel %u, no chardev set\n", i); diff --git a/hw/char/lm32_juart.c b/hw/char/lm32_juart.c index 3948dcd..d75c835 100644 --- a/hw/char/lm32_juart.c +++ b/hw/char/lm32_juart.c @@ -119,7 +119,7 @@ static void lm32_juart_realize(DeviceState *dev, Error **errp) LM32JuartState *s = LM32_JUART(dev); qemu_chr_fe_set_handlers(&s->chr, juart_can_rx, juart_rx, - juart_event, s, NULL, true); + juart_event, NULL, s, NULL, true); } static const VMStateDescription vmstate_lm32_juart = { diff --git a/hw/char/lm32_uart.c b/hw/char/lm32_uart.c index cff8c38..c4a3b9b 100644 --- a/hw/char/lm32_uart.c +++ b/hw/char/lm32_uart.c @@ -266,7 +266,7 @@ static void lm32_uart_realize(DeviceState *dev, Error **errp) LM32UartState *s = LM32_UART(dev); qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } static const VMStateDescription vmstate_lm32_uart = { diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c index fe12ad5..56fa402 100644 --- a/hw/char/mcf_uart.c +++ b/hw/char/mcf_uart.c @@ -305,7 +305,7 @@ static void mcf_uart_realize(DeviceState *dev, Error **errp) mcf_uart_state *s = MCF_UART(dev); qemu_chr_fe_set_handlers(&s->chr, mcf_uart_can_receive, mcf_uart_receive, - mcf_uart_event, s, NULL, true); + mcf_uart_event, NULL, s, NULL, true); } static Property mcf_uart_properties[] = { diff --git a/hw/char/milkymist-uart.c b/hw/char/milkymist-uart.c index e19d0f6..548ee27 100644 --- a/hw/char/milkymist-uart.c +++ b/hw/char/milkymist-uart.c @@ -199,7 +199,7 @@ static void milkymist_uart_realize(DeviceState *dev, Error **errp) MilkymistUartState *s = MILKYMIST_UART(dev); qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } static void milkymist_uart_init(Object *obj) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 33802f0..2aa277f 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -329,7 +329,7 @@ static void pl011_realize(DeviceState *dev, Error **errp) PL011State *s = PL011(dev); qemu_chr_fe_set_handlers(&s->chr, pl011_can_receive, pl011_receive, - pl011_event, s, NULL, true); + pl011_event, NULL, s, NULL, true); } static void pl011_class_init(ObjectClass *oc, void *data) diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c index 1b15046..741c641 100644 --- a/hw/char/sclpconsole-lm.c +++ b/hw/char/sclpconsole-lm.c @@ -313,7 +313,7 @@ static int console_init(SCLPEvent *event) console_available = true; qemu_chr_fe_set_handlers(&scon->chr, chr_can_read, - chr_read, NULL, scon, NULL, true); + chr_read, NULL, NULL, scon, NULL, true); return 0; } diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c index 4a107a2..a92baa8 100644 --- a/hw/char/sclpconsole.c +++ b/hw/char/sclpconsole.c @@ -228,7 +228,7 @@ static int console_init(SCLPEvent *event) } console_available = true; qemu_chr_fe_set_handlers(&scon->chr, chr_can_read, - chr_read, NULL, scon, NULL, true); + chr_read, NULL, NULL, scon, NULL, true); return 0; } diff --git a/hw/char/serial.c b/hw/char/serial.c index e1f1250..ab14ca4 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -897,7 +897,7 @@ void serial_realize_core(SerialState *s, Error **errp) qemu_register_reset(serial_reset, s); qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, - serial_event, s, NULL, true); + serial_event, NULL, s, NULL, true); fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH); fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH); serial_reset(s); diff --git a/hw/char/sh_serial.c b/hw/char/sh_serial.c index ca9816d..ad043bd 100644 --- a/hw/char/sh_serial.c +++ b/hw/char/sh_serial.c @@ -400,7 +400,7 @@ void sh_serial_init(MemoryRegion *sysmem, qemu_chr_fe_init(&s->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&s->chr, sh_serial_can_receive1, sh_serial_receive1, - sh_serial_event, s, NULL, true); + sh_serial_event, NULL, s, NULL, true); } s->eri = eri_source; diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c index 8f02f3a..ddd1b00 100644 --- a/hw/char/spapr_vty.c +++ b/hw/char/spapr_vty.c @@ -84,7 +84,7 @@ static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp) } qemu_chr_fe_set_handlers(&dev->chardev, vty_can_receive, - vty_receive, NULL, dev, NULL, true); + vty_receive, NULL, NULL, dev, NULL, true); } /* Forward declaration */ diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c index 59872e6..268e435 100644 --- a/hw/char/stm32f2xx_usart.c +++ b/hw/char/stm32f2xx_usart.c @@ -207,7 +207,8 @@ static void stm32f2xx_usart_realize(DeviceState *dev, Error **errp) STM32F2XXUsartState *s = STM32F2XX_USART(dev); qemu_chr_fe_set_handlers(&s->chr, stm32f2xx_usart_can_receive, - stm32f2xx_usart_receive, NULL, s, NULL, true); + stm32f2xx_usart_receive, NULL, NULL, + s, NULL, true); } static void stm32f2xx_usart_class_init(ObjectClass *klass, void *data) diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c index 7b10a04..5adf95b 100644 --- a/hw/char/terminal3270.c +++ b/hw/char/terminal3270.c @@ -179,7 +179,7 @@ static void terminal_init(EmulatedCcw3270Device *dev, Error **errp) } terminal_available = true; qemu_chr_fe_set_handlers(&t->chr, terminal_can_read, - terminal_read, chr_event, t, NULL, true); + terminal_read, chr_event, NULL, t, NULL, true); } static int read_payload_3270(EmulatedCcw3270Device *dev, uint32_t cda, diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 0cb1668..afb4949 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -188,11 +188,11 @@ static void virtconsole_realize(DeviceState *dev, Error **errp) */ if (k->is_console) { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - NULL, vcon, NULL, true); + NULL, NULL, vcon, NULL, true); virtio_serial_open(port); } else { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - chr_event, vcon, NULL, false); + chr_event, NULL, vcon, NULL, false); } } } diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c index f9af8ca..c4e8c72 100644 --- a/hw/char/xen_console.c +++ b/hw/char/xen_console.c @@ -246,7 +246,7 @@ static int con_initialise(struct XenDevice *xendev) xen_be_bind_evtchn(&con->xendev); qemu_chr_fe_set_handlers(&con->chr, xencons_can_receive, - xencons_receive, NULL, con, NULL, true); + xencons_receive, NULL, NULL, con, NULL, true); xen_pv_printf(xendev, 1, "ring mfn %d, remote port %d, local port %d, limit %zd\n", diff --git a/hw/char/xilinx_uartlite.c b/hw/char/xilinx_uartlite.c index 71ed2fc..2a8bc1e 100644 --- a/hw/char/xilinx_uartlite.c +++ b/hw/char/xilinx_uartlite.c @@ -212,7 +212,7 @@ static void xilinx_uartlite_realize(DeviceState *dev, Error **errp) XilinxUARTLite *s = XILINX_UARTLITE(dev); qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } static void xilinx_uartlite_init(Object *obj) diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c index 329b03e..182de58 100644 --- a/hw/ipmi/ipmi_bmc_extern.c +++ b/hw/ipmi/ipmi_bmc_extern.c @@ -453,7 +453,7 @@ static void ipmi_bmc_extern_realize(DeviceState *dev, Error **errp) } qemu_chr_fe_set_handlers(&ibe->chr, can_receive, receive, - chr_event, ibe, NULL, true); + chr_event, NULL, ibe, NULL, true); } static int ipmi_bmc_extern_post_migrate(void *opaque, int version_id) diff --git a/hw/mips/boston.c b/hw/mips/boston.c index a4677f7..146be2a 100644 --- a/hw/mips/boston.c +++ b/hw/mips/boston.c @@ -533,7 +533,7 @@ static void boston_mach_init(MachineState *machine) chr = qemu_chr_new("lcd", "vc:320x240"); qemu_chr_fe_init(&s->lcd_display, chr, NULL); qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL, - boston_lcd_event, s, NULL, true); + boston_lcd_event, NULL, s, NULL, true); ahci = pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->sec_bus, PCI_DEVFN(0, 0), diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c index 95cdabb..1bb6f89 100644 --- a/hw/mips/mips_malta.c +++ b/hw/mips/mips_malta.c @@ -570,7 +570,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space, chr = qemu_chr_new("fpga", "vc:320x200"); qemu_chr_fe_init(&s->display, chr, NULL); qemu_chr_fe_set_handlers(&s->display, NULL, NULL, - malta_fgpa_display_event, s, NULL, true); + malta_fgpa_display_event, NULL, s, NULL, true); s->uart = serial_mm_init(address_space, base + 0x900, 3, uart_irq, 230400, uart_chr, DEVICE_NATIVE_ENDIAN); diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 2f0819d..a857e50 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -894,7 +894,7 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp) } qemu_chr_fe_set_handlers(&s->server_chr, ivshmem_can_receive, - ivshmem_read, NULL, s, NULL, true); + ivshmem_read, NULL, NULL, s, NULL, true); if (ivshmem_setup_interrupts(s, errp) < 0) { error_prepend(errp, "Failed to initialize interrupts: "); diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c index ac1725e..e9f58c9 100644 --- a/hw/usb/ccid-card-passthru.c +++ b/hw/usb/ccid-card-passthru.c @@ -348,7 +348,7 @@ static int passthru_initfn(CCIDCardState *base) qemu_chr_fe_set_handlers(&card->cs, ccid_card_vscard_can_read, ccid_card_vscard_read, - ccid_card_vscard_event, card, NULL, true); + ccid_card_vscard_event, NULL, card, NULL, true); ccid_card_vscard_send_init(card); } else { error_report("missing chardev"); diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index bfbf7cd..dc145a6 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -502,7 +502,7 @@ static void usb_serial_realize(USBDevice *dev, Error **errp) } qemu_chr_fe_set_handlers(&s->cs, usb_serial_can_read, usb_serial_read, - usb_serial_event, s, NULL, true); + usb_serial_event, NULL, s, NULL, true); usb_serial_handle_reset(dev); if (chr->be_open && !dev->attached) { diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index aa22d69..115efb9 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -1399,7 +1399,7 @@ static void usbredir_realize(USBDevice *udev, Error **errp) /* Let the backend know we are ready */ qemu_chr_fe_set_handlers(&dev->cs, usbredir_chardev_can_read, usbredir_chardev_read, usbredir_chardev_event, - dev, NULL, true); + NULL, dev, NULL, true); dev->vmstate = qemu_add_vm_change_state_handler(usbredir_vm_state_change, dev); diff --git a/monitor.c b/monitor.c index 3c369f4..54c4af5 100644 --- a/monitor.c +++ b/monitor.c @@ -4097,12 +4097,12 @@ void monitor_init(Chardev *chr, int flags) if (monitor_is_qmp(mon)) { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_read, - monitor_qmp_event, mon, NULL, true); + monitor_qmp_event, NULL, mon, NULL, true); qemu_chr_fe_set_echo(&mon->chr, true); json_message_parser_init(&mon->qmp.parser, handle_qmp_command); } else { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read, - monitor_event, mon, NULL, true); + monitor_event, NULL, mon, NULL, true); } qemu_mutex_lock(&monitor_lock); diff --git a/net/colo-compare.c b/net/colo-compare.c index 6d500e1..abfc23c 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -543,7 +543,7 @@ static void compare_pri_chr_in(void *opaque, const uint8_t *buf, int size) ret = net_fill_rstate(&s->pri_rs, buf, size); if (ret == -1) { - qemu_chr_fe_set_handlers(&s->chr_pri_in, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr_pri_in, NULL, NULL, NULL, NULL, NULL, NULL, true); error_report("colo-compare primary_in error"); } @@ -560,7 +560,7 @@ static void compare_sec_chr_in(void *opaque, const uint8_t *buf, int size) ret = net_fill_rstate(&s->sec_rs, buf, size); if (ret == -1) { - qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, NULL, NULL, NULL, true); error_report("colo-compare secondary_in error"); } @@ -588,9 +588,11 @@ static void *colo_compare_thread(void *opaque) s->worker_context = g_main_context_new(); qemu_chr_fe_set_handlers(&s->chr_pri_in, compare_chr_can_read, - compare_pri_chr_in, NULL, s, s->worker_context, true); + compare_pri_chr_in, NULL, NULL, + s, s->worker_context, true); qemu_chr_fe_set_handlers(&s->chr_sec_in, compare_chr_can_read, - compare_sec_chr_in, NULL, s, s->worker_context, true); + compare_sec_chr_in, NULL, NULL, + s, s->worker_context, true); s->compare_loop = g_main_loop_new(s->worker_context, FALSE); diff --git a/net/filter-mirror.c b/net/filter-mirror.c index 52d978f..62a8265 100644 --- a/net/filter-mirror.c +++ b/net/filter-mirror.c @@ -112,7 +112,7 @@ static void redirector_chr_read(void *opaque, const uint8_t *buf, int size) if (ret == -1) { qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL, - NULL, NULL, true); + NULL, NULL, NULL, true); } } @@ -124,7 +124,7 @@ static void redirector_chr_event(void *opaque, int event) switch (event) { case CHR_EVENT_CLOSED: qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL, - NULL, NULL, true); + NULL, NULL, NULL, true); break; default: break; @@ -245,7 +245,7 @@ static void filter_redirector_setup(NetFilterState *nf, Error **errp) qemu_chr_fe_set_handlers(&s->chr_in, redirector_chr_can_read, redirector_chr_read, redirector_chr_event, - nf, NULL, true); + NULL, nf, NULL, true); } if (s->outdev) { diff --git a/net/slirp.c b/net/slirp.c index 6a6d727..9fbc949 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -778,7 +778,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, fwd->slirp = s->slirp; qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_read, - NULL, fwd, NULL, true); + NULL, NULL, fwd, NULL, true); } return 0; diff --git a/net/vhost-user.c b/net/vhost-user.c index a042ec6..36f32a2 100644 --- a/net/vhost-user.c +++ b/net/vhost-user.c @@ -211,7 +211,7 @@ static void chr_closed_bh(void *opaque) vhost_user_stop(queues, ncs); qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, net_vhost_user_event, - opaque, NULL, true); + NULL, opaque, NULL, true); if (err) { error_report_err(err); @@ -257,7 +257,7 @@ static void net_vhost_user_event(void *opaque, int event) g_source_remove(s->watch); s->watch = 0; - qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL, NULL, NULL, false); aio_bh_schedule_oneshot(ctx, chr_closed_bh, opaque); @@ -305,7 +305,8 @@ static int net_vhost_user_init(NetClientState *peer, const char *device, return -1; } qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, - net_vhost_user_event, nc0->name, NULL, true); + net_vhost_user_event, NULL, nc0->name, NULL, + true); } while (!s->started); assert(s->vhost_net); diff --git a/qtest.c b/qtest.c index 9a5d1dc..88a09e9 100644 --- a/qtest.c +++ b/qtest.c @@ -691,7 +691,7 @@ void qtest_init(const char *qtest_chrdev, const char *qtest_log, Error **errp) qemu_chr_fe_init(&qtest_chr, chr, errp); qemu_chr_fe_set_handlers(&qtest_chr, qtest_can_read, qtest_read, - qtest_event, &qtest_chr, NULL, true); + qtest_event, NULL, &qtest_chr, NULL, true); qemu_chr_fe_set_echo(&qtest_chr, true); inbuf = g_string_new(""); diff --git a/tests/test-char.c b/tests/test-char.c index 9e361c8..1f6b9bc 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -180,6 +180,7 @@ static void char_mux_test(void) fe_can_read, fe_read, fe_event, + NULL, &h1, NULL, true); @@ -188,6 +189,7 @@ static void char_mux_test(void) fe_can_read, fe_read, fe_event, + NULL, &h2, NULL, true); qemu_chr_fe_take_focus(&chr_be2); @@ -211,7 +213,8 @@ static void char_mux_test(void) h1.read_count = 0; /* remove first handler */ - qemu_chr_fe_set_handlers(&chr_be1, NULL, NULL, NULL, NULL, NULL, true); + qemu_chr_fe_set_handlers(&chr_be1, NULL, NULL, NULL, NULL, + NULL, NULL, true); qemu_chr_be_write(base, (void *)"hello", 6); g_assert_cmpint(h1.read_count, ==, 0); g_assert_cmpint(h2.read_count, ==, 0); @@ -309,13 +312,13 @@ static void char_socket_test(void) qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, socket_can_read, socket_read, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); chr_client = qemu_chr_new("client", tmp); qemu_chr_fe_init(&client_be, chr_client, &error_abort); qemu_chr_fe_set_handlers(&client_be, socket_can_read_hello, socket_read_hello, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); g_free(tmp); d.conn_expected = true; @@ -385,6 +388,7 @@ static void char_pipe_test(void) fe_can_read, fe_read, fe_event, + NULL, &fe, NULL, true); @@ -433,7 +437,7 @@ static void char_udp_test(void) d.chr = chr; qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, socket_can_read_hello, socket_read_hello, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5); g_assert_cmpint(ret, ==, 5); @@ -525,6 +529,7 @@ static void char_file_test(void) fe_can_read, fe_read, fe_event, + NULL, &fe, NULL, true); main_loop(); @@ -579,6 +584,7 @@ static void char_null_test(void) fe_can_read, fe_read, fe_event, + NULL, NULL, NULL, true); ret = qemu_chr_fe_write(&be, (void *)"buf", 4); diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index b3cc045..d4da09f 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -464,7 +464,7 @@ static void test_server_create_chr(TestServer *server, const gchar *opt) qemu_chr_fe_init(&server->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&server->chr, chr_can_read, chr_read, - chr_event, server, NULL, true); + chr_event, NULL, server, NULL, true); } static void test_server_listen(TestServer *server)