Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932919AbcDHMvP (ORCPT ); Fri, 8 Apr 2016 08:51:15 -0400 Received: from mail-by2on0090.outbound.protection.outlook.com ([207.46.100.90]:56008 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932855AbcDHMui (ORCPT ); Fri, 8 Apr 2016 08:50:38 -0400 Authentication-Results: redhat.com; dkim=none (message not signed) header.d=none;redhat.com; dmarc=none action=none header.from=amd.com; From: Suravee Suthikulpanit To: , , , , , CC: , , , , Suravee Suthikulpanit Subject: [PART2 RFC v1 9/9] svm: Update AMD IOMMU IRTE with vcpu scheduling information when enable AVIC Date: Fri, 8 Apr 2016 07:49:30 -0500 Message-ID: <1460119770-2896-10-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460119770-2896-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1460119770-2896-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [124.121.8.20] X-ClientProxiedBy: HKNPR06CA0022.apcprd06.prod.outlook.com (10.141.16.12) To SN1PR12MB0446.namprd12.prod.outlook.com (10.162.105.14) X-MS-Office365-Filtering-Correlation-Id: 7283daad-9319-4b95-787e-08d35fac5e21 X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0446;2:vverK5Qe8ZNPm4IuR5DWfg8F2/i/avC5IQUFlwQ0uFy0ANdiL2uMZ+x8+1YevlX4zhB/QNhETK8IWemNELPlZrOu5fhlm71d84KuWk3v49YIEg+C66CFLcTkrFg8FNw2i8b/ZVLIwEvplmYY+2BEZaWxr10BA4HdxQgwwfAQ/XFhTgxoyxQ/VhX1wiuzFHed;3:fwe46yJMqQTck7yrQn30+mG5Wq2BPJVzvSud9ns5dczW5uCxwIL/FdAEh4fCzILJeQVPsLPfffhbI97f3zVjHKEVNAtJ4saJDU1sfSNTebM5NOjnZqHmsuMgMgue11YO;25:qTB/ORVY5CDkZrLd+Kq2jtZhOJQSAPb8B4yAn/Txjw30mk4CnyyAdLPivELYw88ajEWOq89Vs/nfByO4OLuHF/IbdWhABoICnysO1RvfFPjqqtGVeL6l3/0QwrrrSHv7UjtOR4SGGi4I8LUrBg7NnGifbQ3Y70flT85RLNnr7FUjV5+BeNOXOmpYS3hiWe6MGGMx6nkxc4A/Xatnb+tXWBdP1UJqpMdCr1V3x3VvixyX7SLmP/3e6y6KvDo9MeD9kIZnt2rq6qthruUnsACVBr3cZxDC0JIna+eSb+bG3lGudJdIDO+wJiLd01jx1jDKkPieXUDJg/iA07uExij6CA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0446; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0446;20:L3rAW8Wo4+dZNcNIE9hd64Tnv5TkegaJkUACayzT4v9bcCkJYRjJydONG/PatZKFNy7dzGH0teC6HZ479wPts6t4UyEM7hslCVHo/3cixelmltB+avDxQekHztlKayZwEAVU2ZA0TLRvXWLyqxaq7aIjaF0ACc8PNh3N6sqc0awTO4j6Hdb4GqbS52ZdQQ5d2aMv9QArNTcXhA7i5/TJTMImhxzh7mw/+TEDBTR5rBaESUk9s8OJKGzlj35pO3VKjX8q+9YgtuTQ8W2NOR6doEcyE9mtqINkfA2RdGsyTU2+acUULAX9jP4LZnjANrPsmY0zoGRR/IbD3U2txT8gswTb24cdqawsmla1nLDMyAhvdKzWMoixEV571pqihFGs0f7AemYPiTL3WApZxoVrEzu4MIK6Fb+tNleKJYIeI1/RsclLVnUL6LHXzqLk9g652TaiFr9ku/b4FFYQqxjhg8IM0w3cFyYpDfOwkMe3irqcErMXJmsz+KZcCvPMkhai;4:OFJCPHecu5tImkiJMSitFNTIlMPCmlulXe02JU4amuU0VFHIyAvB6dvqBnM4H25UuFIrcBzulagrgji0MdGF3PZPWaHPnYZQudm0oCAYjXm9HvKTahffJKhUOaAeZF4qUS0UICCjUj4vqXZ9hnF+N6KBw0osuLikiOOv/bz0k7lZWCeMes8YRZcj1e7Cv6zlOj8wX9wbsOMjCKdvNMFspFwuhkZB9XP96+L0TehYENcpNzA/JZBBotH2Nmf46Dy7ET3nC+HIJG3reXqggHojvs4zHQ57lt3pYCYmGlCBlZfM/GMM1Db6DJrYIRKKZvGt8gyhwACTaMJwRSCFfWJTf4xRrZhRoj7D3StmXl5jUbiGvijuX/QnywXNjsAjDINM X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:SN1PR12MB0446;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0446; X-Forefront-PRVS: 0906E83A25 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6069001)(6009001)(50466002)(48376002)(77096005)(47776003)(66066001)(229853001)(36756003)(86362001)(575784001)(1096002)(42186005)(19580405001)(19580395003)(92566002)(6116002)(3846002)(586003)(5004730100002)(15650500001)(50986999)(76176999)(4326007)(189998001)(5003940100001)(2950100001)(2201001)(2906002)(5008740100001)(5001770100001)(81166005)(50226001)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0446;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR12MB0446;23:nnY/JY26b2eTo/0xz65CzxudLRexza7DuruFGODzl?= =?us-ascii?Q?Gzc2ENP09apwSkNPWzq4cI5bpRXI6l5od03T7G649LZ45NHXODutxkcu8ECD?= =?us-ascii?Q?DAAoIBmA7+VljUHSphjC6u7w9/S48Bz5Le6HiOTLSLmS1/VZiIRdab1ufIwV?= =?us-ascii?Q?NZWnOoW2NScZJparUvTEO52ess0QBFbb0Tzv59nVB4Uzcc303Tdd3w7Sl4MN?= =?us-ascii?Q?Q7wuG6qjwh5JzSK6ZQNQWZRKLvB+Pd3ftYslNxig1jnM63Gnk13SHOaM2azr?= =?us-ascii?Q?IYMsD2dsmPZQld9wEcDybLHs3O6zMb9uyd49+UPsEH7RuEU89yIJe8s+8AEb?= =?us-ascii?Q?vVXoGUhjv8gOQBEH20EVdild5E6JO2rZ+ub21Fb4KcmmYzVcv9aXr5nDjGL0?= =?us-ascii?Q?UqKH0DlqEeyMht5+FMzi1h5KdGfOKRj5dlWl6DTnEqVlw3Is9NDXW/WRxZnU?= =?us-ascii?Q?5rKRe5BIHId+3YBIXHV60TSKytB9RI3Qf1eEkzOx5rcu244jOzlgRSUqTFc6?= =?us-ascii?Q?C+F7IcG5OqPX5jFMFRuotsR0evEmAADCrTuxZ6lDbwnwdw317kILuD8Xcyw1?= =?us-ascii?Q?zAUZzNQqgUWLC+IwPqfeqfkAJwx27XBiIHktDse4KJG170edtEPVSPYOEKW6?= =?us-ascii?Q?6Rd8gZms5U/M5zZBvNL/VbBeHng5cJcBmxRJUYGu/D41egnFEa2bZVaEv4yr?= =?us-ascii?Q?pWAioKQ2Cl72EI32jGf5/Qj0dRwOkjeOOQqU0MSOHBalYRXTBLGVs+RWfp4l?= =?us-ascii?Q?eFJpGocEZdQq82XsKGOB5vi9GNtv4plIwzOc1F1mjX9sspifF5v1MPp47CRV?= =?us-ascii?Q?AmOtWxyduA8sqaYoay6DUTVPM7BGIYH1myFGFpguTeJo2blzbh9aYxcqakqU?= =?us-ascii?Q?vQtPFzaWu7ULxg/TLiiKBgfCNG/ACLjBH9S4mQrJoJiEMFb+V0aBI9ZvVSfL?= =?us-ascii?Q?yi19pXUP4VTGbWSZhOaark3dNe5DnOefdCaQCvxMA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0446;5:TvkgIFn9/uQe70vfl+ZBx3E45WVdQ3tUd8DaKBLCOvhZH1PdEOiyDea+q3Y2jmfLgYGvQjZN8mOlJrb5Jll+kleRS34u/4n9k4glRGdNeHOlcH5i0R6ivLwQ9ysZwlp+3ypGFxL3NJPs3ShDFvOqsQ==;24:rAkMy8g0UXig0f4bKLAHizvMDART2YtvfqVY4He3iarvvRDe3gJIOX85VdZxj1DxC0FhIdmwh3RpX0xar5L13wubyH2R8WPzzVFoRvyiQEk=;20:mH5h/KxauuAAuZQFPXFFWFWfBFKv9DermSRdau9m4oC8y2mbxGo1pb7CFIvzFRJtLNvfUK+Z7RQMjFy806tU9r9417F5RdrbZBgWJ3TDZjizC792QsFgBCMzzjnV5HytJ7v06SkZbPO3iUajiUZF/4KhK1pJ3+t0IK7Z+74Bh4/Hw2y45tMSYusaWUsZL7C7rEeS3/51NToy3HJqBYD4aA4rTKO0glSWeBQMfMuQ4dpovpp7jdz2CnXRJsa0b8aZ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2016 12:50:27.3261 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0446 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3578 Lines: 111 From: Suravee Suthikulpanit In case AVIC is enabled, during vcpu_load/unload, SVM needs to update IOMMU IRTE with appropriate host physical APIC ID. Also, when vcpu_blocking/unblocking, SVM needs to update the is-running bit in the IOMMU IRTE. Both are achieved via calling amd_iommu_update_ga(). However, if GA mode is not enabled for the pass-through device, IOMMU driver will simply just return when calling amd_iommu_update_ga. Signed-off-by: Suravee Suthikulpanit --- arch/x86/kvm/svm.c | 50 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 38fd7a3..3b9a0b2 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -1397,11 +1397,24 @@ free_avic: return err; } +static inline int +avic_update_iommu(struct kvm_vcpu *vcpu, int cpu, phys_addr_t pa, bool r) +{ + struct kvm_arch *vm_data = &vcpu->kvm->arch; + + if (!kvm_arch_has_assigned_device(vcpu->kvm)) + return 0; + + return amd_iommu_update_ga(vcpu->vcpu_id, cpu, vm_data->avic_tag, + (pa & AVIC_HPA_MASK), r); +} + /** * This function is called during VCPU halt/unhalt. */ static int avic_set_running(struct kvm_vcpu *vcpu, bool is_run) { + int ret = 0; u64 entry; int h_physical_id = __default_cpu_present_to_apicid(vcpu->cpu); struct vcpu_svm *svm = to_svm(vcpu); @@ -1420,17 +1433,27 @@ static int avic_set_running(struct kvm_vcpu *vcpu, bool is_run) WARN_ON((entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK) == 0); entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; - if (is_run) + if (is_run) { entry |= AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; - WRITE_ONCE(*(svm->avic_physical_id_cache), entry); + WRITE_ONCE(*(svm->avic_physical_id_cache), entry); - return 0; + ret = avic_update_iommu(vcpu, h_physical_id, + page_to_phys(svm->avic_backing_page), 1); + } else { + ret = avic_update_iommu(vcpu, h_physical_id, + page_to_phys(svm->avic_backing_page), 0); + + WRITE_ONCE(*(svm->avic_physical_id_cache), entry); + } + + return ret; } static int avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu, bool is_load) { - u64 entry; + int ret = 0; int h_physical_id = __default_cpu_present_to_apicid(cpu); + u64 entry; struct vcpu_svm *svm = to_svm(vcpu); if (!svm_vcpu_avic_enabled(svm)) @@ -1443,16 +1466,29 @@ static int avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu, bool is_load) entry = READ_ONCE(*(svm->avic_physical_id_cache)); WARN_ON(is_load && (entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK)); - entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; if (is_load) { entry &= ~AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK; entry |= (h_physical_id & AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK); + + entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; if (!svm->avic_is_blocking) entry |= AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; + WRITE_ONCE(*(svm->avic_physical_id_cache), entry); + + ret = avic_update_iommu(vcpu, h_physical_id, + page_to_phys(svm->avic_backing_page), + !svm->avic_is_blocking); + } else { + if (entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK) { + ret = avic_update_iommu(vcpu, h_physical_id, + page_to_phys(svm->avic_backing_page), 0); + + entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; + WRITE_ONCE(*(svm->avic_physical_id_cache), entry); + } } - WRITE_ONCE(*(svm->avic_physical_id_cache), entry); - return 0; + return ret; } static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) -- 1.9.1