From patchwork Fri Jun 16 15:16:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 9792005 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 A6F7260325 for ; Fri, 16 Jun 2017 15:16:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9B6372856F for ; Fri, 16 Jun 2017 15:16:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8E7672863A; Fri, 16 Jun 2017 15:16:52 +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 95B2C2856F for ; Fri, 16 Jun 2017 15:16:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752931AbdFPPQt (ORCPT ); Fri, 16 Jun 2017 11:16:49 -0400 Received: from mail-eopbgr20137.outbound.protection.outlook.com ([40.107.2.137]:48864 "EHLO EUR02-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752919AbdFPPQs (ORCPT ); Fri, 16 Jun 2017 11:16:48 -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=dnyWtkOIIIdNKvMQcG3/mqP7RZSyFZnqjg7iwNjMjY4=; b=fGu+5wvk335koKJsKsdsbrOswFWHadBYJwtWXXO8fDSdhkqM3EPX5rgx0NwKv/MbqGeiAcY80N9ayyzRn+cuMg+537a8FdQiWo4TKaX4eswRZ7GQOictm9r3lnB3ez7sDOLq12Y49qLuUxkkIcCIlylOjLsL0wYrmbvvXPfgEIY= 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 DB5PR08MB0840.eurprd08.prod.outlook.com (2a01:111:e400:599d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1178.14; Fri, 16 Jun 2017 15:16:39 +0000 From: Roman Kagan To: kvm@vger.kernel.org, =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Paolo Bonzini Cc: Evgeny Yakovlev , "Denis V . Lunev" , Eduardo Habkost , Igor Mammedov Subject: [PATCH] x86:kvm:hyperv: make VP_INDEX managed by userspace Date: Fri, 16 Jun 2017 18:16:21 +0300 Message-Id: <20170616151621.21590-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: KL1PR0302CA0008.apcprd03.prod.outlook.com (2603:1096:802::18) To DB5PR08MB0840.eurprd08.prod.outlook.com (2a01:111:e400:599d::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5d044b7a-254d-4de3-2c35-08d4b4cab287 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:DB5PR08MB0840; X-Microsoft-Exchange-Diagnostics: 1; DB5PR08MB0840; 3:FYun3b+wA2utSYYMGjAUNgrZv4jThKTKq6+kGyRCQiS2XvMp7WCOlF/xChxiyXQrqOZ6msC6Sd/O/u1r50m0hZtJUYD34jzTkX7mM6ioW4xe+u4GMCTyzR3eFc4PSHoU5OZCOXI1hsQll9GozNv7ImMdtZoJLDqhguRe30nFeMMWFYcvRlfp6nt2Lquko8lW96zx8d7u4AeXWc9/8RTwdQkxDNxQox/nvSmHtFxXxcJSUaT7ObiR2E4NTF+wxhetEUUv2AN/Io7k3arMFP5XWK3Rp5DH/K+WlAPeJoxNC5gFXaIKft0FgXSN5nCyfQuYPaIB7IXYj8GMshLQ8iP1gw==; 25:49RCkZkO2r0fVE0m9CKq0V7o3s8BwtugW7kqId1z0FMS6NE6BhJmysL3NeZS0sq2O1f1DvptjDQgmcgKx6pptGSoNEitcTBz9jAAyGnd3TiLUpg+2hgVcEDpoW6gl6R3/xtCMeAd9ByrbIxd7vVK8OzBC4F0RF2hvrfLQGmAkoRPMeOgT0cZnz1lOZdh6XyZm130WYaQAmEmjC30XBW5TXzYpMFPbjyAolLndsjGxBn5zxO0rGJ+n2S+TqHyFzfM3Z6895Zsr6qCMTyjiv2PJvx0akX7TdYoeA2u5oFpP/hHWSSOtj7gWRV7B856TkpfOwt8PjN4l8A64sdc0UzX+NzdsSonT9ufwiuni39lfSXoW3M3pj41BUiZXblgedOP7Sm9V4l59THtBM18yAX5TgWyCTE/56Ydtg0uHxj+fvI5aZvefakFM3H47DGUfxyrdjKMiNwjk8+pv+nCP6GBHUMWLJueKdtEQoTYckhRyvA= X-MS-TrafficTypeDiagnostic: DB5PR08MB0840: X-Microsoft-Exchange-Diagnostics: 1; DB5PR08MB0840; 31:E4nxpLym+uM5N2xtj8GhBdehzzI4bp00Sl9CNm7Q8/bmWoqXOg+5iE+VLa6Jx9KogEgCTvNDm4MvV1Vz75QC8fdL4Agk5ZOgGEMr2r01kOfHniKRHJo6p/2WtuXPYVrYF3N2k90IejjBHWj4zNrCYaea91o9AdiUQeDDz4H6rXtwbpBYkhHoS1Ci50sbVhsJtJ6erDMJ30TFnC8XqMpi+BhHsDkDtQA5pg4bRYdkLGQ=; 20:ziHezSRxtlmB76L/5hffFn6P+KeuXXMS2wNQhzudf57N5sjhCC7PXgrJoFA0kpOhy82bUqwFeKIUA0pgTxWMUVUxboKIu5kV+U8J5fddU+6kJOuEayrEX8Bvw1ZoJF9wR2MaDBqccT6fAw9IXiyP3tcZzz/JDt8MJJG7J2nLvREuTrQFFFlYObyvYR0awBIRehtPdoBGwB0T/YVjLbpHsPN8mXDge2D8gEKcAMtHxfmxIn9fmxoP+8uD2NqYSLhP50M6BUQ6WJ4LwbuEmPURl2iAoPH+tCFVxCIAxfGyVoHL+rVYs9x0GCBbkg88KV+Q0DBPgnW7H0w5NbsUhg2v1Et3mkozGBzTmb0TAiR7dUOeZMeC8sCkyEMDiodOPbscJdsFGcYW2J1aLG5eXqs+cjj9dnqyVvFApH5QI1vyqRY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(209352067349851); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6041248)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123558100)(20161123555025)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DB5PR08MB0840; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DB5PR08MB0840; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB5PR08MB0840; 4:bPLW0n4y8VnMc/P5sd8U/6BN1mZ+YJKTid7ICzqltm?= =?us-ascii?Q?opomuwyQmq/R9WjLc5udWydR1CepKS7UDRaJLGDvPNkf/XV0TLLH1writ4Yb?= =?us-ascii?Q?VUoFxSr+Go4wAt0e1KfRP4KqFe3k8RRURhjoWft367Eooj+9aD9S5VnA/7oQ?= =?us-ascii?Q?vubo85n4sFEO5Qqjqy8DJ7coYso8TA6xKKxEPa8Xh/My03wJranPb5+K11vs?= =?us-ascii?Q?tkg7YkjAUDwtTX92YpdSRYonXs5U7jjKXNSYm4ppA/A8ccK0kwNVOYkQ8sV2?= =?us-ascii?Q?wMOdqrpa+h6hfBKrPn5bve+xvWnOh/yIgPx99dbB0xm/uweeiWvVJ5JKZQUU?= =?us-ascii?Q?mojoniLvpt3nxy33XxDkZXLwvbM5DcEJ5m2zpY6LobSqshUNMD0f/FKpUGc5?= =?us-ascii?Q?OQ+p/eklEVA+eqKn5yjog8sJnUTQXnnRURBbMWExkcoRaq+629HHx/JtyTfP?= =?us-ascii?Q?pYe2lcoTAznsE+nt/WBeyj4l3m2XhdX2VZrPRPudTI6kk4c4YGiCByk/Fk99?= =?us-ascii?Q?YvhB41U96D5gZaezSiaJb10lmYU7p7slU+5pJy4UZPPtKf835o2OM7I7mf4N?= =?us-ascii?Q?Nqk2Fad6OQiiifRiDIldruT+M40qjw970rrsmo8IWaonX6z+Zoox4BlAfOUk?= =?us-ascii?Q?IRgv1OrgMVlWL7ILrerRZiVcWYGv/FHm5UFA2K6LPSTwurfU9icmpTHRxKcK?= =?us-ascii?Q?znZCjnni20RGoZMykN9VXGPmBQe/vCrQAyyXyCM0cbm8cmXOdTmt3cfpOR2C?= =?us-ascii?Q?UGgIh/Dxm5mrztCveOecu0L2iWWrkWyQHiEostV1NkZObhqC0UIQ5kUZzcFb?= =?us-ascii?Q?BgnhirZZDb//9UsqCE+lO8ietFHdlHZ4pjsC7Kxrh5pyyQD12j/hjDHPsLmE?= =?us-ascii?Q?+Mg/DBZEInGpFNRn5enZg2HzEPEfJq2yfOKPykKn9TkahY9WbnT+uis9KNo8?= =?us-ascii?Q?jvj9FfGGCUnNbbHcKGpvtM3VTkT02UfGQttioOcUk0/id8ZHbzPe8K2rk7H4?= =?us-ascii?Q?kGau03zFdjIGYsY3CV8i7tvXAtmOXhzkfEDSPn43C0dZehv84R2eyZH+/t4I?= =?us-ascii?Q?+VVa3uTYzqRhofBCDCkfbdw+XbGs2/1Aqb5eGolhoq5BRv4XbpbDIU9RRHlc?= =?us-ascii?Q?GdoySoxvainK8XUCZFoCp6VmmE0hJW6vu3KL92kzySyc0F72JJiDCr43Im5u?= =?us-ascii?Q?Y6e0tss2ojC1Y=3D?= X-Forefront-PRVS: 0340850FCD X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39450400003)(39400400002)(39410400002)(39840400002)(81166006)(36756003)(50226002)(53936002)(25786009)(305945005)(50986999)(478600001)(48376002)(6666003)(50466002)(6506006)(86362001)(8676002)(4326008)(5660300001)(6486002)(33646002)(5003940100001)(189998001)(6116002)(7736002)(1076002)(2906002)(54906002)(42186005)(47776003)(38730400002)(66066001)(6512007)(53416004)(3846002); DIR:OUT; SFP:1102; SCL:1; SRVR:DB5PR08MB0840; H:rkaganb.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB5PR08MB0840; 23:GPatlxONbP3cLFGpblBFTxj/kgoU4eZNTFOt0EEgp?= =?us-ascii?Q?P7fXSqBVTpHbQST4sEQs/F0Uu+E25AfYJ864Zxbj0T1hGRNKg4pkMoGS9K/r?= =?us-ascii?Q?AJUAbRGFycBiOJS6iihMFcDkUt9SyZ/7+caOg2klq7By6hmsSTVufnzXnLbH?= =?us-ascii?Q?xJGTTeTHcqb0Sjsddbunt/D+vN+1FLm6kpv/Q+YMxtpd5qDCZ7ICljQErnzs?= =?us-ascii?Q?VR6bwVSJGGVuHPS88XQgJVmRH3JTjkM6VUFdqvRqc3UVOqu5NCEebZC2/ZLn?= =?us-ascii?Q?jqV3G+JqQ+6ZP9Bx/9q7+vO1dpUssdTYwexbCBfeW6SzOIGfZ5Vu83FoNn7v?= =?us-ascii?Q?Tat5Y/fdhzVW8lbMauQScTjVDWX7iPF8+5klsc3P0HQ5CAf7iwcpxuztfrik?= =?us-ascii?Q?Ll8CtIhAVCP0t3UW+fQOL57lc91s7eyHWKBK8XMLo1EiadtWWvLki4RWvzUW?= =?us-ascii?Q?NcoSeylJuxlAR/fcDnOldowYo8Mj6ycMiL59Iekg+xE80I6t00GOfeLa6ZNH?= =?us-ascii?Q?rr+jXpVExWn2eLlCoixV3bBf36NsPD2NWk7DApC5gd5V9JP4eYjG0nEjEAWx?= =?us-ascii?Q?CKpxJ9yejfvrBgO9Oy/vZ0nyl74QXlCNvzR03toX5YPdxGcg6bivk7CSUJvQ?= =?us-ascii?Q?hguruccJxT75q79/sPTrW0QwbnA1hmobdLi9I04KkWAn4PDI/azOfh4UIGcp?= =?us-ascii?Q?a+2w0L9Snnvj9TLxEhttPOKCB7YimjuFISr35lhpOqYuiaWAuv0Ldzqhre2D?= =?us-ascii?Q?LQTaIZAkbGBvwSk00yi015jD4VMihJhxIlydkp4Oqo4C7wbdRNDBRZDXIZFb?= =?us-ascii?Q?P/0Oz2isiwJmcaswuvsq30Ic4wad2Hko7hiaou4FgtrlwQJcDHnzmBLEvg5S?= =?us-ascii?Q?MvzRp4Id5Y+xH6cE7UDjIEMKh159anCZ33Neo9mP9EbaHrs3No5WK7xWhnkB?= =?us-ascii?Q?OfznZ0gggzVs84j0pWYB9yIsN15C4MeOWCVFe9bCQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB5PR08MB0840; 6:NGY2ZfvkZQHFQhLi6+/t2NckJ5hwR3MRZA3r06Rh9O?= =?us-ascii?Q?4L01phgN/uy8M/THsXE1gUgXwFzY8mfVjUZBlC+oh0tSE9zdA0IaCQJe4TS8?= =?us-ascii?Q?3xs3VZauA0UfbwDO1UQuqlnCacE0bWrn6D8ID6EKXTUND57suGx9g3EmtDFt?= =?us-ascii?Q?u97DGlBJK6LYFBSW6Un5G35YDnxmI3WE+3+ppca/Me0bkQ51ZPB1xq+5lAlA?= =?us-ascii?Q?N2hMcSsfmZgMXv0NouCUvKritZ4U8NHyhKFHd+G/1HA2sx/vn03/qHY2iDMx?= =?us-ascii?Q?uivGeHtmeh0cxMqtvGRoUhUbeNH14ViYnnPu/1n7p5CrafDJJ63+Xizv+cOM?= =?us-ascii?Q?Xv5DCw0010u/xWF8nRKar0GwnE6mKwTVpMRrIoqROCX29bzqXcVzbWjmTNj1?= =?us-ascii?Q?NsLxKe69TknoErItnVn5pP0dN9R3l9wLzvcX217US9YGR2DsmMZfCtOczJf1?= =?us-ascii?Q?C5KXQ5EGpvV+tycfsiIrGiXhqe92Z2BXS6lRiiIWb4T7ehPGqUchcZQGaond?= =?us-ascii?Q?Q9pbS/J7bguifQJmdiqTOas/d+bXJD8J5EtbwI2VNr8nyOCEyKcJwkV/nIHZ?= =?us-ascii?Q?AsPAx700EFr2t8c8jNgbCzuiHNwbU8kSipphwRVnB6J6g32sx4P+rp0Dl9sm?= =?us-ascii?Q?h3Kzh3VOuYSyPAyeSVGGOqfPZi29eDqK1OLppCRK9EW1H+qienMXtMnX8ZIm?= =?us-ascii?Q?FLAjIk7x2WmQVQph0TIuA9RgyokElVdnD1vEE0QVjbJ2E6+68V2Qd01Adtl9?= =?us-ascii?Q?beGMyetZP7cZcVAW28ppS8ffuVA3hjO29AkQalqKatotiRAsNWmlwV8OrWgF?= =?us-ascii?Q?+tOyos0v4TEij0xUNTXfwgnkjSVO21cLoG8Lq46Qc8gPmO7Nhca+gvKnSAtn?= =?us-ascii?Q?xC5fGP+iiRoz1ZFUAkvIl44qvL/qdByQLghC/BGDSpnVijU61Dk7g8kvYPPp?= =?us-ascii?Q?iz4eEgpYqA+gJNmvudNCewH08kU117gkEnizUveXe8BT1Gx2UdbA5puUMKRw?= =?us-ascii?Q?A=3D?= X-Microsoft-Exchange-Diagnostics: 1; DB5PR08MB0840; 5:v6yiM2veeDgxtOg+D4MfIuWQYioOS2m6P6NpM+k7NOZzyDpqVybLukwG1/Lo0m1/ABOrkniEvyT1jjdGhf42uPGGDS4AfROscPGqldFeYrlN9W0+GlRe/CWNiVxi42ulibIzphZKvt64FGr18KkUyZ2exNQBFchQS1W0QGMd7IbP3EB1pCi5AfByth0lWXFqztllI+n6EZhEnD9+4dlEsDYsbUq+7GuM0OEbXcg1Opyu2mNiMi404tjQxGXjYkn1vniODY1K3f0ZdjEoIKTsNCcwHpO7Xw7W2aMnk7IxXIVuXAnqL+dsqncbXlASZ7RUii4Z+I6fsGYciOB8I5JcU8fp2pzY/23/m54nYnAcrZjSemzCZctwd1M+gkS07KNeE1Qhllsor/JCMuntrwghzXvOe1nTQb6F89aEpVvzL628zKy8+h+GXoejshxY4idXsqwv0RLuvGaLyKsWGnaDDdsmo6L/bFhMUGMOXSV5dL+OHFFkm53RTuWIAS1oPee3; 24:GA2PtLeKxlNUFyEN+mojFHxMgpMv7HJJbADPGlnKF64gbyDkM8aQLmBC8pfAgxAz+V0tJhqxvD357xopk74tVtUsRd2CEAxIRqALxK5KJlA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DB5PR08MB0840; 7:krsukevpgs2owEeSsMTq3YDMiGcX/BbTEVIxJiSSryKKHmnzm7Oxb3tkw8qtR0uagSQT7s8xR+YXLdQHHkgOhqHIkCYTlhGsJpehXBI3vN5ctEPjTh7iH+t10bXwhoZVY5Enrm2OUX2a8GBesummPWIixtqMzt9FZoO15vwt3NNR3guK3tW4joeCgN7LTW9mMxmp+GsDwb67kR91qAyjoDzeyF7hc4OENpofLpjybHx77gNWsAl9ssj+AQkCS5owCqquZUv2tPR6RZc3OvW3DjAB3OdRAkBrTWE/s/fMDBuemRJHzEKhZogLsYudlJgRmDVgxeou1CIPPWUUJuHWKLcL+ze0mZEyOuDBFq0vl3JQq59hv3dXy9A4l831KiMresMN4Hs6sS1mTlElHpcCh3n2vTmf4TyVwXyqamGahc3eDoWsgcVLJHSNwSz4Kk3NNAIdzzJcUX4O9PjXXMQ0WDQclJ1pTHnbqvjP4RzRfH+DCr/apVPe0f4A3OcuUc91vtVYVdhkTIUpYrJmy5Ksd80JY/DuiZ0djm8TjSM08duXOg9WZSQSPpV1+I/PnAe2Jx/mxGkbu/hNGLOrDJ0AVuQzIDCUs3HrIV7T+we9tQJgUQ9TgOXi0GijjGoykq0kXsFDki1EmmpJZ0bHTBHcva/89/TyDz+Mv3sbuu1zDg/bggsAXByptivLQG4c2T2Ii9eSKIjT3iQySFXELSdJoCwgcwq5VlTQU3vur63WySLnZY6GcB8/4rONM9gOxsHZrNOpKFtccAS+Jc3pw0Vs/39Uh4ly5qDUIK6tUFtmIL8= X-Microsoft-Exchange-Diagnostics: 1; DB5PR08MB0840; 20:4L108MbbuoCYlxYtDsVuEIy9hDnxY3dp+aSVKNGhxIc4IuOlSfN5VzENBBXbIL1CYljSTkZw9ExeiVYc2qlGd+pVS6IeUwfDqBhjDUEq9TrbJUwxrjikKbiod9kE9q+i8zVwyfvpBknCY1UtHVJmlIUiBBnyveImnaWsueWk0SQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2017 15:16:39.3146 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR08MB0840 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hyper-V identifies vCPUs by Virtual Processor Index, which can be queried via HV_X64_MSR_VP_INDEX msr. It is defined by the spec as a sequential number which can't exceed the maximum number of vCPUs per VM. APIC ids can be sparse and thus aren't a valid replacement for VP indices. Current KVM uses its internal vcpu index as VP_INDEX. However, to make it predictable and persistent across VM migrations, the userspace has to control the value of VP_INDEX. This patch achieves that, by storing vp_index explicitly on vcpu, and allowing HV_X64_MSR_VP_INDEX to be set from the host side. For compatibility it's initialized to KVM vcpu index. Also a few variables are renamed to make clear distinction betweed this Hyper-V vp_index and KVM vcpu_id (== APIC id). Signed-off-by: Roman Kagan --- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/hyperv.c | 49 +++++++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 695605e..29c14d1 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -462,6 +462,7 @@ struct kvm_vcpu_hv_synic { /* Hyper-V per vcpu emulation context */ struct kvm_vcpu_hv { + u32 vp_index; u64 hv_vapic; s64 runtime_offset; struct kvm_vcpu_hv_synic synic; diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index ebae57a..015d54a 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -106,14 +106,27 @@ static int synic_set_sint(struct kvm_vcpu_hv_synic *synic, int sint, return 0; } -static struct kvm_vcpu_hv_synic *synic_get(struct kvm *kvm, u32 vcpu_id) +static struct kvm_vcpu *get_vcpu_by_vpidx(struct kvm *kvm, u32 vpidx) +{ + struct kvm_vcpu *vcpu = NULL; + int i; + + if (vpidx < KVM_MAX_VCPUS) + vcpu = kvm_get_vcpu(kvm, vpidx); + if (vcpu && vcpu_to_hv_vcpu(vcpu)->vp_index == vpidx) + return vcpu; + kvm_for_each_vcpu(i, vcpu, kvm) + if (vcpu_to_hv_vcpu(vcpu)->vp_index == vpidx) + return vcpu; + return NULL; +} + +static struct kvm_vcpu_hv_synic *synic_get(struct kvm *kvm, u32 vpidx) { struct kvm_vcpu *vcpu; struct kvm_vcpu_hv_synic *synic; - if (vcpu_id >= atomic_read(&kvm->online_vcpus)) - return NULL; - vcpu = kvm_get_vcpu(kvm, vcpu_id); + vcpu = get_vcpu_by_vpidx(kvm, vpidx); if (!vcpu) return NULL; synic = vcpu_to_synic(vcpu); @@ -318,11 +331,11 @@ static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint) return ret; } -int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vcpu_id, u32 sint) +int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vpidx, u32 sint) { struct kvm_vcpu_hv_synic *synic; - synic = synic_get(kvm, vcpu_id); + synic = synic_get(kvm, vpidx); if (!synic) return -EINVAL; @@ -341,11 +354,11 @@ void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector) kvm_hv_notify_acked_sint(vcpu, i); } -static int kvm_hv_set_sint_gsi(struct kvm *kvm, u32 vcpu_id, u32 sint, int gsi) +static int kvm_hv_set_sint_gsi(struct kvm *kvm, u32 vpidx, u32 sint, int gsi) { struct kvm_vcpu_hv_synic *synic; - synic = synic_get(kvm, vcpu_id); + synic = synic_get(kvm, vpidx); if (!synic) return -EINVAL; @@ -680,6 +693,8 @@ void kvm_hv_vcpu_init(struct kvm_vcpu *vcpu) struct kvm_vcpu_hv *hv_vcpu = vcpu_to_hv_vcpu(vcpu); int i; + hv_vcpu->vp_index = kvm_vcpu_get_idx(vcpu); + synic_init(&hv_vcpu->synic); bitmap_zero(hv_vcpu->stimer_pending_bitmap, HV_SYNIC_STIMER_COUNT); @@ -978,6 +993,11 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host) struct kvm_vcpu_hv *hv = &vcpu->arch.hyperv; switch (msr) { + case HV_X64_MSR_VP_INDEX: + if (!host) + return 1; + hv->vp_index = (u32)data; + break; case HV_X64_MSR_APIC_ASSIST_PAGE: { u64 gfn; unsigned long addr; @@ -1089,18 +1109,9 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) struct kvm_vcpu_hv *hv = &vcpu->arch.hyperv; switch (msr) { - case HV_X64_MSR_VP_INDEX: { - int r; - struct kvm_vcpu *v; - - kvm_for_each_vcpu(r, v, vcpu->kvm) { - if (v == vcpu) { - data = r; - break; - } - } + case HV_X64_MSR_VP_INDEX: + data = hv->vp_index; break; - } case HV_X64_MSR_EOI: return kvm_hv_vapic_msr_read(vcpu, APIC_EOI, pdata); case HV_X64_MSR_ICR: