From patchwork Fri Jun 16 11:15:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 9791105 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 627B66038E for ; Fri, 16 Jun 2017 11:15:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4ACE728613 for ; Fri, 16 Jun 2017 11:15:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D5182860F; Fri, 16 Jun 2017 11:15:49 +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=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C281D2860F for ; Fri, 16 Jun 2017 11:15:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752528AbdFPLPp (ORCPT ); Fri, 16 Jun 2017 07:15:45 -0400 Received: from mail-eopbgr20138.outbound.protection.outlook.com ([40.107.2.138]:51200 "EHLO EUR02-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752031AbdFPLPn (ORCPT ); Fri, 16 Jun 2017 07:15:43 -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=HUE879kR+gKZS7osc2cRTJmLqGmRJpzHowM80K8hUs8=; b=W3QP7uNJsN2T8sEpda7jXxZYH3n9J6wbwx5PZCaednlr3BtwIgNcB+kI4M0JyCbY+h3e8Oikf23E5+NTSLtNcFfZEt562pUs29/PvDjZsmpuX/3vO/i5XcX6LQnolowKLu+qn5Zsf72rpnbuqPyhVbmz4AbRRh0Y7qmMita580M= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR08MB0848.eurprd08.prod.outlook.com (2a01:111:e400:5a05::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1157.12; Fri, 16 Jun 2017 11:15:35 +0000 From: Roman Kagan To: kvm@vger.kernel.org, =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Cc: Paolo Bonzini , Evgeny Yakovlev , "Denis V . Lunev" , Andrew Jones Subject: [kvm-unit-tests PATCH v3] add hyperv_connections test Date: Fri, 16 Jun 2017 14:15:17 +0300 Message-Id: <20170616111517.18918-1-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.9.4 MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: KL1PR06CA0066.apcprd06.prod.outlook.com (2603:1096:802:14::34) To VI1PR08MB0848.eurprd08.prod.outlook.com (2a01:111:e400:5a05::18) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI1PR08MB0848: X-MS-Office365-Filtering-Correlation-Id: e008097b-af4f-4412-0c88-08d4b4a904f0 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:VI1PR08MB0848; X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 3:euazM1xML3i8ZSdTWlDqJjdLYUUhNQsII94DsrL7KT0Ppj8Mz9cA7zB+637G6zw7Ej28g+IWi2pR5dM40JY0LXoy8Kwqq2XHVqZmCQBmkY5bf3FBNbsxLwOBdEem/3dskmrSC3KspPRv63AsZxAAXi1e1wO4fbOGfhtDWLApB78XNOveO1t2uHiRN4YNU92dMu2L8WvFuGnrNc3bn2zFvVQK01ku+lGBN9oluuOHVaS/c/ILY107JXzYBUePLnSuQqIKw4IHXwWcDz0XFnrHIbuKjC9Q60Lvn9jeAT7HKxm8CfLvYDAVTySDuDlsbEwPh2PDQO8uzS1583pgUN/DuQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 25:LyGccvWxGqHhCCpP1Q6WSKAoFy7QHf4FhBpB+MQWQ8lQsRebKJXdtQR64GkNk98Izl6DiCmOANtMs1KEbDnC8jlgp5XcUkFKTP80uYvtzUrW9IolJ2b1WtCn/xM92D4orOw3qjZlJ+T8cvuuBzSYULXMONEOyyzoJfJESJQjZOShsqZs2E+s8hi8AZuve0Iw0neihJtfRy71jOuNbVWNKPqrXOIPjBS0AUlzNYszVCoVjM99U935KxtY5/q5CC+PYPJ7L2Zs1JDeFtNZBTimDvvg1NiKpa7ED8os7sqt9uz3RfKqK8ywV1uxp+Z7K14cL06isOgU17xBei+fqsFFyEpKQ6IGQZ6fJ1c++0hWX3y4AGHaXjYRhDfzmYVTBL0Vwx42vPDB+wNLP6Ei5Bpr6qmiL9Cj5nT+eDPmq2GuJZPpweq1AeNAk7s4IKrPcnWXeE4z6L/PKJEwYr7O4IccCqdjHH0OwIojkReowrnr/KhboaR8k+dFhwydo4xpD4YJnhVGiZC0Ga0lQRMqC26Mn8qEci5NknHJ7WW4c1k7kcJ0DEN+Q66CZz8KDQNXSXS+uvshNf1bvlQPVZUjj6IgTjapntOf57zKRZgxrdd8W+CSz8c9K5BBh1MjbWeyVg1vl7tHbxEoNhc9wtCqWfBFTQWho15WT+mop2Y/mkN4FzCiQO5ZQtRvUcqEW52eN2++t3IlVkUyJwbxagWtGwejpqfobp7+PCS9/ZuWORtybokKLXwTQ597IdgEY8joEdYymEs1woDnrDrY0hVJM4KFTLUWDYKwkZkbPj+CYo6Lt6xNG1/CNps17bXvuKC27IGK37aEJHVfnOeaInk5fzBW6J3AZR5lbe+P7dIKA7cIBydVsJLAxvf5ab5jy0xSgU25IuU+PNehvrwhZA8p4JgK607jdLMGf14FVhQ2ioWVi lo= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 31:OjSqwF5M0SNkv6aDYENX2IkVZVPexianZOS+ZLrEmyQHdy2/n1iZ3KTi/hVDVqQp8o4dq6qu/d9mRXaLrEMnfERUDsQckUMf7HtHBQHCBGaOLoAIPwvRH9oVOmXDdUR4aPiRNT4ONqFVUnyfxnE5BOv8cQRLcp5G4cgy5PX5teHd9uQD+TN/q1brDwPLYVvU9SP/ZuGH/Qe5JvJI/wjO7X+qBTCfYGZ0tsf2tLEAslRVan6XRtkxajHvD6XhoPTGuKgtDRZ0zdMR5MKgS5B2AqJcq/yweQ+oJ3k+VbMCovEPquGjZ20sVLZQayiUfPttrfljmFa/ALfjztkq1gA4KHSapnbO75BMI4tYIeYdEi1j7oZbIoXK2s7EcHfIU8gQRx+ZPiQQOVAMizbAnCm+5XsTdThRokGV3jPQ/WqcJAyHrwaju3Qh1Y/m7nBQtd+8wDH7mZuSz5e2npam50vdtW1NY8LgmmENvQDR7PRGnOGqzxMuf9myTL8NQSZQZDr/dL3ZKzEEN/bM9yRQW1T39/qdZ2uSqvWJFwaJwEAUvFkJaN16VWsPaYUBWnodvfl+XwTQYZrH9oC3hi5y0XVMJDnGGwRcsf0ZewY8VtdzktU= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 20:lXkZONiR05fJAVUtgjezVQYXKa2eEWlYIU2tuCC3FlsEOxuGZwSwzVVftoY9xgg6ZQB8mau97y8kIsZsmzlPCFoO+2kBnwtfgtrbzb1aFAdy3leKO3eTOP883PuGCj3uU5lEXETabBh9oeNOuQvS5BbYnuD+GMPqgB8fX+3gouKuPFocIaD7VQjODZXqPipaGpXX8tXhMXCohiBUXdjKBEOrN9vQDMjvLfgidIHkPk10Fz6jo6hItuZuHbHsYA6a/6ylLF4e2EqtfJe7PhdvoKbkG2RTOIzw76BvZmw5hfz2+ai5tQwUweAaXiPKvesIBJajeqNrLSmvCYJCEncPXkvye4RGKZsz1rlnBM3T/rBir1OFRZv4HzFt0COSOBofv9VfWDPsGzDqCsRqqD+CfNy5B9xLbhmV0lVWj+VzDoo= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(20558992708506); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6041248)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123558100)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR08MB0848; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR08MB0848; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR08MB0848; 4:ZxLCGQ9C60UMwwhOWMiBdJ1zLrigIVEYCSX3+4p5xq?= =?us-ascii?Q?RfC7j4vOxqNEJxSPGfQY1yt8S6cKXk73WOESXxxCdq1PhS/Bnlx0xPt5+H8G?= =?us-ascii?Q?CZcaTa/Xkj2SZoGVEI6F89KnKjgROUeDx05eOSjm5A9wP5CE2/S5exZKAtGt?= =?us-ascii?Q?RWf8zafrawj579rwvG1rgY+LoGmksmUKO2JluIKIPeSz9RFQ+L40msqTnb6l?= =?us-ascii?Q?J/3FbjNV8prSneAqaJSWW4ssfWSa3e/of+vTg7xNhkzQ3Qhfxf0y6bVX/ksU?= =?us-ascii?Q?osksQI+9tShn0STuID+hb3c2FiV7SxrZoENaNvDwhZx6uekdmN9nyOnFohf5?= =?us-ascii?Q?zIb1k2Z5kpgfWbG0IJolvH6xoUx6D1cUTXI/R6qDrTSjGAZfgHJTpsAh4dnY?= =?us-ascii?Q?cXRlPPmTBaSq8s5b4HXG6FOxpUNBwpHtNASjJyRL9UxoGSheK7tefnKEbHZT?= =?us-ascii?Q?o7B28aoPH734rZRiUQO4116BI/vBb87osTnr6Wz7YTTrQQaXCY7MOHct89G7?= =?us-ascii?Q?IgvOiX45ojje2Mr4MAo/JwiZ6yn3bH9UMbcOWLmzclv1WnlXh07VeiumR0hn?= =?us-ascii?Q?csQASuS+zWJn6Tq0WcxmI/vNI2m6TjkhB0P6W99b05dRez7Pns1fxdNtLH+e?= =?us-ascii?Q?jcCPj1GFUoa/33NExa39p4RiNLRpDzloweei62ueQ3ZVQYhT4P8P5MvM+QSB?= =?us-ascii?Q?4qFhyUpHGGrKI+3A23gdSnBmZ43dHq4oohE/WL/3lEzqaANazQwwrbkrrrlL?= =?us-ascii?Q?xXxOCjYPuYDZlS6cduZzNcIdIRkc/bEIRZiNKWgwANpq2PpWeLvr+JB7Gci1?= =?us-ascii?Q?IoiRPYJAD2eNQj6SG9fybe3EPUwIG/FWAqdhgcnzJNVuVhZH8vTVtToVk4Tg?= =?us-ascii?Q?t9KrjU9u7f/RSnpv7L7MXtft+uIIvG2Y+lJbWPorld9HqqdCVruClE8QFTaG?= =?us-ascii?Q?/aupFQdXuZvRt3TWIQ+zw4i+D5jne+uuZcVVKAjAVb4ceAh3M6e1zpZmZfVB?= =?us-ascii?Q?cn22LpxxuYcx/rduqs3+UqdtSsJonnp+zn5XD3vWyZLuVaj4I8gtMgwerXX/?= =?us-ascii?Q?O6CbjGm72jAzI7emkbc0kreQIMjhhSm/dml004zjQusXgGxEYTw2xILbKjoB?= =?us-ascii?Q?JHAU4stc5USA2CargAOvxhJqPEeY3abQkSEMBoK4BkHSsO802wujhVehwRvL?= =?us-ascii?Q?vmKRfCKlnr3lI=3D?= X-Forefront-PRVS: 0340850FCD X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39400400002)(39840400002)(39410400002)(36756003)(5003940100001)(110136004)(38730400002)(42186005)(25786009)(53936002)(33646002)(47776003)(4326008)(230783001)(7736002)(66066001)(305945005)(53416004)(2906002)(50986999)(5660300001)(6666003)(50226002)(6916009)(81166006)(6116002)(3846002)(86362001)(478600001)(48376002)(6506006)(6486002)(1076002)(50466002)(8676002)(6512007)(189998001)(54906002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR08MB0848; H:rkaganb.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR08MB0848; 23:aDfbQTJP1rTP0X9fyv6PYtzGcbnuYiBsSamYrR/Hj?= =?us-ascii?Q?7E86N+Bek8hqWYbfP6YUPiQ0lGtmUYL71ivpdSj1zXxHcaBvOMZRjyopuMT4?= =?us-ascii?Q?/v5aV5EysWC8QdPpl98kya13UDdgoh2EJrQHo4gDedMBKw1cMTWWVqT5D7eG?= =?us-ascii?Q?lHMgBt0ArqMGm4pgkeh2h4Bthar71Q2kwVzXcmx4yVxF5YTHYUvmGaw3vI2K?= =?us-ascii?Q?Dqf2hh3Hf3xJJikQZxZWVk3Ll7WAjXLHvTsVLS8Kj64hlj19FVjjIZczyqa6?= =?us-ascii?Q?2pqw51jbM8w+bqefH0jZ0FpqYU7/EY1wGQpsOpd9OvkPjo9TuSX667pkfjV1?= =?us-ascii?Q?dCbKeOjrEqmuQpGeWayYh/gsx4ICg5B3tHUVo5yZ/HczDTY2RztoRVNVbmXn?= =?us-ascii?Q?ApgDGDttYSkEnzSIDlYo8nR+eIQqMqZto7ZRbpKi+ruikQUGmzn85s8RnmLK?= =?us-ascii?Q?bEYE2X0+CeOt7Vc/5ZV6TgCvAAD1G8CGO6WF42dgU6EyrqnTIeI2bloeYuL+?= =?us-ascii?Q?uOUS7XrnsTfLgaKfQcSqtM1AXqbc0Z1eel6xfdkmLAiWoymAbb94q4uh+mCz?= =?us-ascii?Q?pEk93pPByC8Qgu0kMYBkXjFLTUkCK3ez9KgJLvV8WgU4qoWXpm6xxVhKDddY?= =?us-ascii?Q?aV0bCOv4Fkanz38cukfEZQWldunAcFWKhIRyyqbyC3Mg2+jmI04yyLPojNdj?= =?us-ascii?Q?8NmWnqUByas+fS8VThH/eWumgMNepCNdJETf4SzzDD2JOlpLeJerhhJwj/EU?= =?us-ascii?Q?a3jmE93NzBAht7srXYXmaGEFWLolCnnrwDCRak71Crq7micmM26yPeci5HqF?= =?us-ascii?Q?AiBZGYWvK2UXpoXUKrZx3ZsHfOPGY20ApA3AEoVT7MH7VtT9sgiVciyc3EC2?= =?us-ascii?Q?u8vNKhcE3bDyCX/XW9cSrQQGwA7+QKGGVGlX9TUknjJ/5DccFdXZ2EyVhowW?= =?us-ascii?Q?QubTPPLVlZwffNsb92eNDjzNiwU4V08qLSvKp1ccQf8kjCLhjTOZIKlzppV3?= =?us-ascii?Q?hskQIhklK6zMx/IzarhP9fz?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR08MB0848; 6:iCG9cqTa7lz3aQRIdDiLfCriqiZm17bT0bO6JMSwqc?= =?us-ascii?Q?xIRzrsDhCrGroDcuI9KOzoIlk+euaCCj1/JW/b1gV+d5oIycLVZKaktgOC4r?= =?us-ascii?Q?GwLXOyXnjiKVupFiXG7C9o0KcQf2VX5HH9PHV5odz3/OwX3V9mmrOLiELUpc?= =?us-ascii?Q?wnO1Qy80r+n80NJ/mhUYGClBKS/2QM9pFYW8ceLtIIoPXWuMIH6VqOK7QQzI?= =?us-ascii?Q?8t6kG0QHNZGVkBEcV7UpQlU6hpaWRxVIOS7iHhYuLDLZ0hAlQ6A39fokM5WF?= =?us-ascii?Q?1VzRu36EWHWuvsxCOkSaYl+qu3+mEWFjqyvqh37Yecp4F2sBB6B6S3VDmKVQ?= =?us-ascii?Q?tLwpN8Z/QMxz5D5rOWfrRIrobQA022nCJEmWGnf3SjkBweQkhfrekWbjm3Oh?= =?us-ascii?Q?5z/a0vIM7NWWbsu4OlGcvq2zu3T+Xpu/ZXf/xfYHZv0Ax1/A4O/tkwM9a63S?= =?us-ascii?Q?AZi9lAyRRUdGSRdGXO95+D9UM8ba7v5gDKPC8+/OHM62v+qOZkvMx727OPRD?= =?us-ascii?Q?lK6S2AwyVJJYLfffGlnNpG0Yv6XUYw3YO1He3dktdgv73XRXL974U8tTF7ax?= =?us-ascii?Q?gJjl+4XQr1jQwQC2Pit7p4rAVHKm8/lrk2YjfJ23RualRdq0bSl8S9IlGtEF?= =?us-ascii?Q?+Mmc8dFfnK/TPJIFjDZE4EBp7p1v9wiYLOtgJEMEo3RWiBqAaNtlkpiAFUrR?= =?us-ascii?Q?97CIA6MnmreMiOm3tkKkRvx9h2BW9en1bZGddGHPRew/8sF4EfhaNAFcBx5G?= =?us-ascii?Q?/65Ed/Vrwsb1lRBreL7ERohGfqHyGbBTE/gWIGGhPhXJ0IKVPKGENrxEE+O7?= =?us-ascii?Q?foiGdTQG2uAd4Uoa0s7QsfDvEV6PJFP2z7kYV+8rJUPupTz1OfKcNAyrDPCO?= =?us-ascii?Q?2djwR7OA3iaLgxHd8AOfHZa2rpMPVAaafU6XzbGnJk7UwSHswBmy3O8l23V5?= =?us-ascii?Q?PcxFU2x/HYQ7QraT2dClGGr083Xg9K2AHo8tqF5g+6FTdJTHN64ih4MNu+lq?= =?us-ascii?Q?g=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 5:/wBVNXVrVV7rK8bEEdDOXOc5dE/TDKxpFs3PONuN5FmYJxH4g1MECJRd+CiUlsQViUR2KpgBJOEabwINpo+WcoQ5e1p2jjJ+ze/8frJzNKGxEKcUZCLbaEPxWmw9KzUCxTUT5TtkfdmaQOw+b+tde2JwmATWrSPo5aZyLyTgDcB+udE3dF8dpIC5yOziA5/1aKwCX6t0EoDREWdrVGRyLTvLjOyk7VVLTtV6CWpPABuKhmReucj5/jYLXMhwr06Y2nczXHb1ORe2OYkXftzZkijGIiEI6EuuzcszDR9KbusK6Q4tDK28XvN2qnp8aVnY4MqHozepuAOy+kLRSJMmLvahokMcx/0GbNYgqj8/JBL9LevAmN4UAlKH8xm/U4uMT5pb9EH0IbmbJz9PVNh4ppiMkT0Lajzb0QAg0u8JyFfyBP8lFacqw6vUz2lf4ZzeMGGtYxhM5e5O5gx7Po3lwG7+iZDySdCWzJB3IZIg4rC41qUJj3UJyDaDi2BlzHn1; 24:tIKxEXUqdETD28bjT45NCkk8ivWqRfSs0qxhEgJ81i4odqhTDlc7A+c66NuZD1sG8K6ogrS//kc0R4mgYlTP1Y95iYHgE/dfshkDbKu1Pd8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 7:GntCyew4j4Tt3aXGQiSumoexfPS2kZxddhG0gkRv1vKivS1oBBqNdULqcaWDaEXTM8RSCe+S1WkVVSZOysYYfQ6PD/g5fRx5Iq2Nty80M3U+NzWv7qyAt3h148qmpzyJQ0eKmDXvnc96TTCRww4kg8CCiesNDDypubrSz9lZ0YWlGPX9f7xPqucIhJq85/QDgt2ghaPR1tyADed5aViB+biGpD0lS7b7DVatGgaLndih4GyOoWOOrMVPBOIMkWZYGKLokhhShmjMzJ52J6G5l5iQdizjbvqeA0DxNkkSk6fN18gxVVdqCL/AI2VGutauxAEoyQVthAVYzVexr3sTjhnBRj2pZw4MFr1ozapHQ3Ezcrc0MhG21aXq9b9OUKv9xgqBunwSKXbFrIPqM+bj9qFVhOHD2UUM9eVE6Q8EFBseEvKSd52pXeVW5gCuQbWtuJX/jcHOSKSj9TyNVvSZV4ou3frIcOZym6zTXCQsgfsUoswprty9ZZSwegy+MBp+nJ3udbLkbn+/6k+AzGwJMHIw3OrM13cUBDE45Ofy7Y2UR16clvvKOxsitgGtRTpagcKlc5llkVYzZ7k/yWgc9cxiLlcHs7k1BRgXumHh8wY/bkJRPBNPDYEnaZhwjHqE3oN8wZHdBMb93hfUbt7ZSC0M3t7W9aO+QKz2GWz9keNjk4tcNf0ZndZmfhcRdtOnZ6B3QZ5PllwW3yoUf79GnWZnivQavm9MRhbO6jw0SkuovZuejX7M2a11UyY0JOc2QxwFO2Sk5LcbLwoEsrTsDvfbKNx6X8Qt1JzQH7DOVcA= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0848; 20:yGxnNrVocCh/hlD3UtZOcJBgIfWJ+U9i3ANFXgQS8W2gnnpraWKbdJDTUkYaKfMiK0nbIw7NHrBvxJvhrF65cAO7cvyj67LvgPnlxhZQHGNMAQZVv4rnlNFHISJCQinPtdMvwAzxCdhmpzGEmPV7z7HDwAMel8VluXAxD8uT5Mk= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2017 11:15:35.1633 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB0848 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a test for Hyper-V message and event connections. It requires QEMU with the extended test device supporting message end event connection test modes (recently posted on qemu-devel). On older QEMU versions the test reports a single SKIP. Signed-off-by: Roman Kagan --- v2 -> v3: - more style fixes - check return value from alloc_page v1 -> v2: - dropped already applied patches - add detection of old QEMU per Paolo's suggestion and skip the test if QEMU doesn't support connectionid - adjusted test group in unittests.cfg - fixed indentation to use tabs as it's a new file - note: *not* switched to on_cpus() because different arguments are passed to each cpu x86/Makefile.common | 3 + x86/hyperv_connections.c | 336 +++++++++++++++++++++++++++++++++++++++++++++++ x86/unittests.cfg | 6 + 3 files changed, 345 insertions(+) create mode 100644 x86/hyperv_connections.c diff --git a/x86/Makefile.common b/x86/Makefile.common index 7bb6b50..ca97a8e 100644 --- a/x86/Makefile.common +++ b/x86/Makefile.common @@ -49,6 +49,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \ $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \ $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \ $(TEST_DIR)/hyperv_synic.flat $(TEST_DIR)/hyperv_stimer.flat \ + $(TEST_DIR)/hyperv_connections.flat \ ifdef API tests-api = api/api-sample api/dirty-log api/dirty-log-perf @@ -71,6 +72,8 @@ $(TEST_DIR)/hyperv_synic.elf: $(TEST_DIR)/hyperv.o $(TEST_DIR)/hyperv_stimer.elf: $(TEST_DIR)/hyperv.o +$(TEST_DIR)/hyperv_connections.elf: $(TEST_DIR)/hyperv.o + arch_clean: $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ $(TEST_DIR)/.*.d lib/x86/.*.d \ diff --git a/x86/hyperv_connections.c b/x86/hyperv_connections.c new file mode 100644 index 0000000..b061048 --- /dev/null +++ b/x86/hyperv_connections.c @@ -0,0 +1,336 @@ +#include "libcflat.h" +#include "vm.h" +#include "smp.h" +#include "isr.h" +#include "atomic.h" +#include "hyperv.h" +#include "bitops.h" + +#define MAX_CPUS 64 + +#define MSG_VEC 0xb0 +#define EVT_VEC 0xb1 +#define MSG_SINT 0x8 +#define EVT_SINT 0x9 +#define MSG_CONN_BASE 0x10 +#define EVT_CONN_BASE 0x20 +#define MSG_TYPE 0x12345678 + +#define WAIT_CYCLES 10000000 + +static atomic_t ncpus_done; + +struct hv_vcpu { + struct hv_message_page *msg_page; + struct hv_event_flags_page *evt_page; + struct hv_input_post_message *post_msg; + u8 msg_conn; + u8 evt_conn; + u64 hvcall_status; + atomic_t sint_received; +}; + +static struct hv_vcpu hv_vcpus[MAX_CPUS]; + +static void sint_isr(isr_regs_t *regs) +{ + atomic_inc(&hv_vcpus[smp_id()].sint_received); +} + +static void *hypercall_page; + +static void setup_hypercall(void) +{ + u64 guestid = (0x8f00ull << 48); + + hypercall_page = alloc_page(); + if (!hypercall_page) + report_abort("failed to allocate hypercall page"); + memset(hypercall_page, 0, PAGE_SIZE); + + wrmsr(HV_X64_MSR_GUEST_OS_ID, guestid); + + wrmsr(HV_X64_MSR_HYPERCALL, + (u64)virt_to_phys(hypercall_page) | HV_X64_MSR_HYPERCALL_ENABLE); +} + +static void teardown_hypercall(void) +{ + wrmsr(HV_X64_MSR_HYPERCALL, 0); + wrmsr(HV_X64_MSR_GUEST_OS_ID, 0); + free_page(hypercall_page); +} + +static u64 do_hypercall(u16 code, u64 arg, bool fast) +{ + u64 ret; + u64 ctl = code; + if (fast) + ctl |= HV_HYPERCALL_FAST; + + asm volatile ("call *%[hcall_page]" +#ifdef __x86_64__ + "\n mov $0,%%r8" + : "=a"(ret) + : "c"(ctl), "d"(arg), +#else + : "=A"(ret) + : "A"(ctl), + "b" ((u32)(arg >> 32)), "c" ((u32)arg), + "D"(0), "S"(0), +#endif + [hcall_page] "m" (hypercall_page) +#ifdef __x86_64__ + : "r8" +#endif + ); + + return ret; +} + +static void setup_cpu(void *ctx) +{ + int vcpu; + struct hv_vcpu *hv; + + write_cr3((ulong)ctx); + irq_enable(); + + vcpu = smp_id(); + hv = &hv_vcpus[vcpu]; + + hv->msg_page = alloc_page(); + hv->evt_page = alloc_page(); + hv->post_msg = alloc_page(); + if (!hv->msg_page || !hv->evt_page || !hv->post_msg) + report_abort("failed to allocate synic pages for vcpu"); + memset(hv->msg_page, 0, sizeof(*hv->msg_page)); + memset(hv->evt_page, 0, sizeof(*hv->evt_page)); + memset(hv->post_msg, 0, sizeof(*hv->post_msg)); + hv->msg_conn = MSG_CONN_BASE + vcpu; + hv->evt_conn = EVT_CONN_BASE + vcpu; + + wrmsr(HV_X64_MSR_SIMP, + (u64)virt_to_phys(hv->msg_page) | HV_SYNIC_SIMP_ENABLE); + wrmsr(HV_X64_MSR_SIEFP, + (u64)virt_to_phys(hv->evt_page) | HV_SYNIC_SIEFP_ENABLE); + wrmsr(HV_X64_MSR_SCONTROL, HV_SYNIC_CONTROL_ENABLE); + + msg_conn_create(MSG_SINT, MSG_VEC, hv->msg_conn); + evt_conn_create(EVT_SINT, EVT_VEC, hv->evt_conn); + + hv->post_msg->connectionid = hv->msg_conn; + hv->post_msg->message_type = MSG_TYPE; + hv->post_msg->payload_size = 8; + hv->post_msg->payload[0] = (u64)vcpu << 16; +} + +static void teardown_cpu(void *ctx) +{ + int vcpu = smp_id(); + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + + evt_conn_destroy(EVT_SINT, hv->evt_conn); + msg_conn_destroy(MSG_SINT, hv->msg_conn); + + wrmsr(HV_X64_MSR_SCONTROL, 0); + wrmsr(HV_X64_MSR_SIEFP, 0); + wrmsr(HV_X64_MSR_SIMP, 0); + + free_page(hv->post_msg); + free_page(hv->evt_page); + free_page(hv->msg_page); +} + +static void do_msg(void *ctx) +{ + int vcpu = (ulong)ctx; + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + struct hv_input_post_message *msg = hv->post_msg; + + msg->payload[0]++; + atomic_set(&hv->sint_received, 0); + hv->hvcall_status = do_hypercall(HVCALL_POST_MESSAGE, + virt_to_phys(msg), 0); + atomic_inc(&ncpus_done); +} + +static void clear_msg(void *ctx) +{ + /* should only be done on the current vcpu */ + int vcpu = smp_id(); + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + struct hv_message *msg = &hv->msg_page->sint_message[MSG_SINT]; + + atomic_set(&hv->sint_received, 0); + msg->header.message_type = 0; + barrier(); + wrmsr(HV_X64_MSR_EOM, 0); + atomic_inc(&ncpus_done); +} + +static bool msg_ok(int vcpu) +{ + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + struct hv_input_post_message *post_msg = hv->post_msg; + struct hv_message *msg = &hv->msg_page->sint_message[MSG_SINT]; + + return msg->header.message_type == post_msg->message_type && + msg->header.payload_size == post_msg->payload_size && + msg->header.message_flags.msg_pending == 0 && + msg->u.payload[0] == post_msg->payload[0] && + hv->hvcall_status == 0 && + atomic_read(&hv->sint_received) == 1; +} + +static bool msg_busy(int vcpu) +{ + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + struct hv_input_post_message *post_msg = hv->post_msg; + struct hv_message *msg = &hv->msg_page->sint_message[MSG_SINT]; + + return msg->header.message_type == post_msg->message_type && + msg->header.payload_size == post_msg->payload_size && + msg->header.message_flags.msg_pending == 1 && + msg->u.payload[0] == post_msg->payload[0] - 1 && + hv->hvcall_status == 0 && + atomic_read(&hv->sint_received) == 0; +} + +static void do_evt(void *ctx) +{ + int vcpu = (ulong)ctx; + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + + atomic_set(&hv->sint_received, 0); + hv->hvcall_status = do_hypercall(HVCALL_SIGNAL_EVENT, + hv->evt_conn, 1); + atomic_inc(&ncpus_done); +} + +static void clear_evt(void *ctx) +{ + /* should only be done on the current vcpu */ + int vcpu = smp_id(); + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + ulong *flags = hv->evt_page->slot[EVT_SINT].flags; + + atomic_set(&hv->sint_received, 0); + flags[BIT_WORD(hv->evt_conn)] &= ~BIT_MASK(hv->evt_conn); + barrier(); + atomic_inc(&ncpus_done); +} + +static bool evt_ok(int vcpu) +{ + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + ulong *flags = hv->evt_page->slot[EVT_SINT].flags; + + return flags[BIT_WORD(hv->evt_conn)] == BIT_MASK(hv->evt_conn) && + hv->hvcall_status == 0 && + atomic_read(&hv->sint_received) == 1; +} + +static bool evt_busy(int vcpu) +{ + struct hv_vcpu *hv = &hv_vcpus[vcpu]; + ulong *flags = hv->evt_page->slot[EVT_SINT].flags; + + return flags[BIT_WORD(hv->evt_conn)] == BIT_MASK(hv->evt_conn) && + hv->hvcall_status == 0 && + atomic_read(&hv->sint_received) == 0; +} + +static int run_test(int ncpus, int dst_add, ulong wait_cycles, + void (*func)(void *), bool (*is_ok)(int)) +{ + int i, ret = 0; + + atomic_set(&ncpus_done, 0); + for (i = 0; i < ncpus; i++) { + ulong dst = (i + dst_add) % ncpus; + on_cpu_async(i, func, (void *)dst); + } + while (atomic_read(&ncpus_done) != ncpus) + pause(); + + while (wait_cycles--) + pause(); + + if (is_ok) + for (i = 0; i < ncpus; i++) + ret += is_ok(i); + return ret; +} + +#define HV_STATUS_INVALID_HYPERCALL_CODE 2 + +int main(int ac, char **av) +{ + int ncpus, ncpus_ok, i; + + if (!synic_supported()) { + report_skip("Hyper-V SynIC is not supported"); + goto summary; + } + + setup_vm(); + smp_init(); + ncpus = cpu_count(); + if (ncpus > MAX_CPUS) + report_abort("# cpus: %d > %d", ncpus, MAX_CPUS); + + handle_irq(MSG_VEC, sint_isr); + handle_irq(EVT_VEC, sint_isr); + + setup_hypercall(); + + if (do_hypercall(HVCALL_SIGNAL_EVENT, 0x1234, 1) == + HV_STATUS_INVALID_HYPERCALL_CODE) { + report_skip("Hyper-V SynIC connections are not supported"); + goto summary; + } + + for (i = 0; i < ncpus; i++) + on_cpu(i, setup_cpu, (void *)read_cr3()); + + ncpus_ok = run_test(ncpus, 0, WAIT_CYCLES, do_msg, msg_ok); + report("send message to self: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + run_test(ncpus, 0, 0, clear_msg, NULL); + + ncpus_ok = run_test(ncpus, 1, WAIT_CYCLES, do_msg, msg_ok); + report("send message to another cpu: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + ncpus_ok = run_test(ncpus, 1, WAIT_CYCLES, do_msg, msg_busy); + report("send message to busy slot: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + ncpus_ok = run_test(ncpus, 0, WAIT_CYCLES, clear_msg, msg_ok); + report("receive pending message: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + ncpus_ok = run_test(ncpus, 0, WAIT_CYCLES, do_evt, evt_ok); + report("signal event on self: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + run_test(ncpus, 0, 0, clear_evt, NULL); + + ncpus_ok = run_test(ncpus, 1, WAIT_CYCLES, do_evt, evt_ok); + report("signal event on another cpu: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + ncpus_ok = run_test(ncpus, 1, WAIT_CYCLES, do_evt, evt_busy); + report("signal event already set: %d/%d", + ncpus_ok == ncpus, ncpus_ok, ncpus); + + for (i = 0; i < ncpus; i++) + on_cpu(i, teardown_cpu, NULL); + + teardown_hypercall(); + +summary: + return report_summary(); +} diff --git a/x86/unittests.cfg b/x86/unittests.cfg index 42f1ad4..3f3ad2a 100644 --- a/x86/unittests.cfg +++ b/x86/unittests.cfg @@ -504,6 +504,12 @@ smp = 2 extra_params = -cpu kvm64,hv_synic -device hyperv-testdev groups = hyperv +[hyperv_connections] +file = hyperv_connections.flat +smp = 2 +extra_params = -cpu kvm64,hv_synic -device hyperv-testdev +groups = hyperv + [hyperv_stimer] file = hyperv_stimer.flat smp = 2