From patchwork Mon Jun 13 22:06:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 69954 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp1759796qgf; Mon, 13 Jun 2016 15:24:49 -0700 (PDT) X-Received: by 10.66.66.234 with SMTP id i10mr24696889pat.114.1465856689654; Mon, 13 Jun 2016 15:24:49 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 8si34458828pfc.245.2016.06.13.15.24.49; Mon, 13 Jun 2016 15:24:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@amdcloud.onmicrosoft.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1424307AbcFMWY0 (ORCPT + 30 others); Mon, 13 Jun 2016 18:24:26 -0400 Received: from mail-bn1on0061.outbound.protection.outlook.com ([157.56.110.61]:14821 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1422907AbcFMWWS (ORCPT ); Mon, 13 Jun 2016 18:22:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=+VETR+H2qNN3Lk/2AwVlaIAL42wC9XqsrzdCrMDks6M=; b=giaVi9T9rDVVmbfpkVZWQJDsBCqeaph/nx09BGkBwtudD0SZpXvngWJRRacWg8FAA/K5h0USaA0D3HuhczTOApCvBHi+FfR6Rd8OS8HZ356RqFOq801Xofi6tksdjXFYBzXhXr78IkqSrRdnWeme/ZaHN2ApCFz6IVhWiuzZbcQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from ssuthiku-cz-dev.amd.com (165.204.77.1) by BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) with Microsoft SMTP Server (TLS) id 15.1.517.8; Mon, 13 Jun 2016 22:07:04 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 RFC v2 05/10] iommu/amd: Introduce amd_iommu_update_ga() Date: Mon, 13 Jun 2016 17:06:45 -0500 Message-ID: <1465855611-10092-6-git-send-email-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1465855611-10092-1-git-send-email-suravee.suthikulpanit@amd.com> References: <1465855611-10092-1-git-send-email-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN1PR0701CA0005.namprd07.prod.outlook.com (10.162.96.15) To BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) X-MS-Office365-Filtering-Correlation-Id: 3eaa5834-f7fd-499c-7e15-08d393d70db9 X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 2:KUFXm5owhf5kGNJ5yTOeBTzweJG7h4ua4JDIqNy14WTxM93fLRGs2guP6nRBOO5GYFRE+BSearxwDRkcinktkNSV3ee9GXdukzCG85OxOCWmunLcAFO1zaGKax8YhJz0pgGig2mlW1wUbXrSY//oZGhe7ey8eCzKw6/YQVZYDLvjmKFLdd6D82o55htXO1/r; 3:WhndjrzACPtL4zjzJ+K6GDde6S0EZ5PPqE0R9ys0Dewjlzgu74QKhlAEsYvZRoYqiVBPeXvn2/0dAjciocOFiPtBDgki6NHXzdxXGXi/QA7v8pbY0unyLP7UnoPDJL5A; 25:Ccl7Tq0lLJp+vT/lm4X+Bl7ECuptyg5IB/GEwwT49MsweFbJFPk0xa66LucCPyBaGXKYBmpf2/9OR7vAxNqcfLfpoFShdriMT0q/P7xzR9wySTovLA5nc7b1p6Y2s2DlIXPVYoJuVf9Kyr/E2gfTlxKQxb7xw9KvdbcbHdAwUJhRsJFSBdHmTELIul0w0urfJFLuji1ZZURopMym4uO7zYp8eEXXevJ6PwtJnbYfpz/zIyOG28Bns9z9m6vQAZzFHpNLK4bjP7tj+8our97JVUYWMzn+lvbotS9ntqN/hCK8W5kca+ON8PONTJbGb1bZbS6YfVKPdpFlf1YjIqf7BdldsPnb7e06ZzHtZhIHotRHhpO7ZoLfY91LBgexQzm915MP1OaVy1MJ1c1XU2j+aGE3CH8EzmpwSEpA0tTQhTE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:Sn3N0/N/bIGvdsSg9ldyJdlDXHel2r3uQp01VPAGjD/xHAKtPmxKwLBBri+/9ZNl5XePgaAoBenwBsj1wsSk0S/lIMoDybRInXIdHtMbaAv48UOJpfDB6WctGd2aJYa1FeOhZ0VlbSHC0ptcNljwH8mA1Dd4ymYy+ANsNjfOquO1Cr3D+Cws8Sy3nML332CJm7DZm+ArniMc5Vwn8Uwzbe3h/XgwUUkAWXMlQfQvi51zTdkXm+H+uP6C81ePwp+Aq+JCDj9irSarZurFE7wuCF+eWgjoAlViCNyVTiB01yIF/Q/qcztqfC/HZ9P0IMqTK5y+YBndy/4m1St1qQGX6k/W3aKT3+sZsVLYow5ve3VXkb34AFc5K8qpCeMwwdNeQ2OnK1dByXu3TrEY4BvRH/1kYggqmQlF/Yu45at8h6TBxQL4UwdwrKCFIIxDe1l+XrLszOkZbg9N3SyXVJw9Rgmv9wx+GLi1moq0kfrAg5wc7+L+t/h2DpHa5fepiYEX; 4:6LqA5P98A+KtFgujBWed2pw6meJzWk+Mpc6bCixMBnZGgssLkPSbntJHrQ5v40p/45Dp4GlVHuONL0UmMks51PxgHsIs885ub5xffP02sJJK8EoubK+68n92sVulwQKamPFqUyP0OHCpK4Fkhsib0M+iAx+c4PO15iGyh5EAQoS0JfKcQCGR/8B0dTrmsVg0B9UAqOsVoevfInd8mx5DUWboLZPs/t0cB3oq89P+ymgoyxbtjsmXfJJS0LRUtB6oPd2CS8wZ2SnO0JUBqpJm23uTmv8z84ORCpB/7TZUHzbcuHiOZ3UbVFIGkLoqj2Kc3UNELWgkxqs+eje/oTvO9EJgR5miipM+1PqSahAZRYFHu4CfPph6N5nUBx+CjC6UyxVfas3rF92MziyBeKTbpnGlmIcUy7JPL9Af0LFI5n2CaTTuedwagLjzOSjrHDHa X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026); SRVR:BLUPR12MB0434; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0434; X-Forefront-PRVS: 0972DEC1D9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(53416004)(50226002)(5008740100001)(50466002)(36756003)(19580405001)(19580395003)(106356001)(189998001)(68736007)(105586002)(42186005)(2906002)(586003)(5001770100001)(101416001)(50986999)(4326007)(8676002)(81156014)(2950100001)(3846002)(6116002)(76176999)(77096005)(81166006)(97736004)(5003940100001)(5004730100002)(47776003)(86362001)(48376002)(92566002)(229853001)(33646002)(2201001)(66066001); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0434; H:ssuthiku-cz-dev.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; CAT:NONE; LANG:en; CAT:NONE; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR12MB0434; 23:MNUOx3go6t5FPkCmr4M4rpFFH5Eq+0AwvGos0LaG/?= =?us-ascii?Q?hwqmXgMTpCFmQ0I+tUKBi+kAAml0WOys9W05CYAqScWMZp/U1O1w9gBWPjNg?= =?us-ascii?Q?aUomR9+zae7dxfX/hayu73m2vojuEos5yq9jpXSek0fz4fB3uismZoNhKxhS?= =?us-ascii?Q?uVB68dcg1BXUVJKGFvW74in6HHhzZulOpxfFdQm0jw3mzaqM6FO7575HnOlm?= =?us-ascii?Q?6yELmEb6Ts3np/Piucb3BbIGaAKD/w571st7QahpoCWFCaeF4Yc2RZdBE819?= =?us-ascii?Q?QImc/GFiBg1wGNKIj/o30jXFivAQI02vRMhBmBWFY8aA81k9C0cegZA2SCQU?= =?us-ascii?Q?hSmElZNhMMnxVGaLYctrlNOEABbteu/d/x8XsNTGd79ccLlsPx9ux2+zOAJH?= =?us-ascii?Q?J2VpPwkzs7NkUZmhJnIiC5rE+frGs+Zwt6WBmmqnRjaKcknpR0I6kGoJCa4Y?= =?us-ascii?Q?DHqD5Wgb0gukni5c3gZS3ZzMDcuqgqvl+0I7G5VLNOqct8Pfzu20n4DTXXJY?= =?us-ascii?Q?otwrBhyRNF61d/ym/g3IjkR/kfvZUN/CVmNx9X5Mx+oDC2qBrPA85+uMx1s7?= =?us-ascii?Q?G9W4KmPK4XDT6b6iwMK5ObIQvJlObEDH4oPXNQyBvDz+FI3wxGHUFZehwmUN?= =?us-ascii?Q?CGvFYOIxzSDzav0dO7v8hp0N1GO1AM/x9WlS19wWEs9CaI77rYbmdDO2kKuV?= =?us-ascii?Q?WuDBAnXc0vzzygXCunhL/WZ+EZwykDA4TrY8rFumgT9cGHuaQViqcAPLxkKC?= =?us-ascii?Q?WtcL2uAWloSp0vcGTvfAgX9F42GTC00W8s2JK2fcKWj19Cv8w4ZvHcR99I7r?= =?us-ascii?Q?BBvlCdpo5y6JvpM03HVc5RlyQRTR82dyax9cx3fHmzkr6lAeTUuwOs9UaCbe?= =?us-ascii?Q?uW7Nve2KsJ2/2rdzrIId6jE8DP9yhc2nAgrDSstvVFLCt13YF6tQaypneS0z?= =?us-ascii?Q?M+KjMPBphBCf+eYzQK1eILivERyU47AwdKZwfSrn1Fi5SP3BfWtzroa33a+0?= =?us-ascii?Q?J+0nZ15hWPLManl4k1/WVu4TfF1OOjGf5VAdmKexMvST7l6Xc4/y1v5REOem?= =?us-ascii?Q?LHG+TsuA+MlHuPWQU1rECsCKCHU5oGf9DOTGxdQUT1GDIgmgQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 6:ml1HQUOJ9SfmZpIeeeoGFT0wmxbHOXnoOFx3VeTA7BU8AS2tHqiATJqGdAnxEpfx8XnoDBmxcpFNRuyZw30jivgrkTIHGF/AJoL4PY/C2n4ymwiMNgpTzHuF26D3N4f9ISo32h8teZCrklCjuxCCsNiSLB0SXJuzYORiPuP+Ekf5Y0OGFBcmx5BZ2FRR91odeogF+/UuOW62x8sM2R0hXb7yIBYcv4lxauNGAG6GUlAdL5fYiyCy5UrJw1QlL47+X3827i44A0yMdqJtih1ElgbhIkHNXKZeiQgRRuLfEeiEyX7jSRbwZTcE8kxWT3c+; 5:PAQsDu40XcCef+TjEHPX7xYpHvKpzGgMGDzJjqbJDHMROlcIC6PtC06ZnX5IvDJTbi+9MohJUhzyE/BecGq4S6Sa/NE9O8ltJ1QVjo4MSxSov2l3Jyg2BfK2xUeZK2Ww1RKWfIehdx+PZKi19YisKg==; 24:4lQZP38oSHlEA/cy87X8WYJus8V4FnNMCthWejEatvJAclzUOYQYaflDUGObvCLH9rWWhzjTy3uNGXZMX5fzE5BZZnj8Af2Zo8cWSRACGJc=; 7:CKzvCwfVOUfOqZGDZrZbK2VRNu+4G14DFudDcgEHdmu1lAOqXBvcs50OX0eCjXX8JMcobFgrEWHM4X8XmSIYwS05B6VjKIEQTxN5Kzhv0BbiMcg1I42XbKL0DitYDx3/s+nLhvEcpjvSaquV5exrg+fap0ZZ48AwHwP37xSbTgkszzEPHAhRno2vNRyW/mT+JWnry2YDZfSHYQpnWEOl9Q== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:wkw3Eu9t/IgOqmtD7keo6YhxGXTUvk4VI3t0MGOcucDqNCouD6NK/wkavuX74bvJYa8bRC80AKw/kSuaAtneCPx61cdJDzdRxWmcxLDXtVeYnH3R2iqs+O9WxkbcrKGDmJZ361IKJSzXR/rIy6G1f133//DxCmaRBHsboQuhvK0ajt7Su5NJgZBATRlIbd12jbnOz5nePhf+AWCRWg7vESPi6FeHogsLbVksVFWfh4k2T4HFyxW1ysOVvV2LGJlo X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jun 2016 22:07:04.1883 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR12MB0434 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Introduces a new IOMMU API, amd_iommu_update_ga(), which allows KVM (SVM) to update existing posted interrupt IOMMU IRTE when load/unload vcpu. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu.c | 67 +++++++++++++++++++++++++++++++++++++++++ drivers/iommu/amd_iommu_types.h | 1 + include/linux/amd-iommu.h | 8 +++++ 3 files changed, 76 insertions(+) -- 1.9.1 diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index ae339c5..d6a56ac 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -3979,6 +3979,7 @@ static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) unsigned long flags; struct irte_ga *entry; struct irte_ga tmp; + struct amd_ir_data *data; iommu = amd_iommu_rlookup_table[devid]; if (iommu == NULL) @@ -3988,6 +3989,8 @@ static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) if (!table) return -ENOMEM; + data = container_of(irte, struct amd_ir_data, irte_ga_entry); + spin_lock_irqsave(&table->lock, flags); entry = amd_iommu_get_irte(table, index); @@ -4000,6 +4003,7 @@ static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) spin_unlock_irqrestore(&table->lock, flags); + data->ref = entry; iommu_flush_irt(iommu, devid); iommu_completion_wait(iommu); @@ -4137,6 +4141,7 @@ static void irq_remapping_prepare_irte(struct amd_ir_data *data, struct irq_2_irte *irte_info = &data->irq_2_irte; struct msi_msg *msg = &data->msi_entry; struct IO_APIC_route_entry *entry; + struct iommu_dev_data *dev_data = search_dev_data(devid); data->irq_2_irte.devid = devid; data->irq_2_irte.index = index + sub_handle; @@ -4394,4 +4399,66 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu) return 0; } + +static int +update_irte_ga(struct irte_ga *irte, unsigned int devid, u64 base, int cpu, bool is_run) +{ + struct irq_remap_table *irt = get_irq_table(devid, false); + unsigned long flags; + + if (!irt) + return -ENODEV; + + spin_lock_irqsave(&irt->lock, flags); + + if (irte->lo.fields_vapic.guest_mode) { + irte->hi.fields.ga_root_ptr = (base >> 12); + if (cpu >= 0) + irte->lo.fields_vapic.destination = cpu; + irte->lo.fields_vapic.is_run = is_run; + barrier(); + } + + spin_unlock_irqrestore(&irt->lock, flags); + + return 0; +} + +int amd_iommu_update_ga(u32 vcpu_id, u32 cpu, u32 ga_tag, + u64 base, bool is_run) +{ + unsigned long flags; + struct amd_iommu *iommu; + + if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) + return 0; + + for_each_iommu(iommu) { + struct amd_ir_data *ir_data; + + spin_lock_irqsave(&iommu->ga_hash_lock, flags); + + /* Note: Update all possible ir_data for a particular + * vcpu in a particular vm. + */ + hash_for_each_possible(iommu->ga_hash, ir_data, hnode, + AMD_IOMMU_GATAG(ga_tag, vcpu_id)) { + struct irte_ga *irte = &ir_data->irte_ga_entry; + + if (!irte->lo.fields_vapic.guest_mode) + continue; + + update_irte_ga((struct irte_ga *)ir_data->ref, + ir_data->irq_2_irte.devid, + base, cpu, is_run); + iommu_flush_irt(iommu, ir_data->irq_2_irte.devid); + iommu_completion_wait(iommu); + } + + spin_unlock_irqrestore(&iommu->ga_hash_lock, flags); + } + + return 0; +} +EXPORT_SYMBOL(amd_iommu_update_ga); #endif diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 390e7b2..d8ae6dd 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -811,6 +811,7 @@ struct irq_2_irte { struct amd_ir_data { struct hlist_node hnode; + void *ref; struct irq_2_irte irq_2_irte; union irte irte_entry; struct irte_ga irte_ga_entry; diff --git a/include/linux/amd-iommu.h b/include/linux/amd-iommu.h index 36648fe..e52cee5 100644 --- a/include/linux/amd-iommu.h +++ b/include/linux/amd-iommu.h @@ -173,6 +173,9 @@ extern int amd_iommu_set_invalidate_ctx_cb(struct pci_dev *pdev, extern int amd_iommu_register_ga_log_notifier(int (*notifier)(int, int, int)); +extern int +amd_iommu_update_ga(u32 vcpu_id, u32 cpu, u32 ga_tag, u64 base, bool is_run); + #else static inline int amd_iommu_detect(void) { return -ENODEV; } @@ -183,6 +186,11 @@ amd_iommu_register_ga_log_notifier(int (*notifier)(int, int, int)) return 0; } +static inline int +amd_iommu_update_ga(u32 vcpu_id, u32 cpu, u32 ga_tag, u64 base, bool is_run) +{ + return 0; +} #endif #endif /* _ASM_X86_AMD_IOMMU_H */