From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755420AbdABHkn (ORCPT ); Mon, 2 Jan 2017 02:40:43 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51960 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750893AbdABHkk (ORCPT ); Mon, 2 Jan 2017 02:40:40 -0500 From: Baoquan He To: joro@8bytes.org Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, dyoung@redhat.com, xlpang@redhat.com, Baoquan He Subject: [PATCH v7 RESEND 12/12] iommu/amd: Clear out the GV flag when handle deferred domain attach Date: Mon, 2 Jan 2017 15:39:58 +0800 Message-Id: <1483342798-6542-13-git-send-email-bhe@redhat.com> In-Reply-To: <1483342798-6542-1-git-send-email-bhe@redhat.com> References: <1483342798-6542-1-git-send-email-bhe@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 02 Jan 2017 07:40:41 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When handle deferred domain attach, we need check if the domain is v2. If not, should try to clear out the GV flag which could be copied from the old device table entry. Signed-off-by: Baoquan He --- drivers/iommu/amd_iommu.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index bc3711e..8d00fc3 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -1841,6 +1841,11 @@ static void clear_dte_entry(u16 devid) amd_iommu_apply_erratum_63(devid); } +static void clear_dte_flag_gv(u16 devid) +{ + amd_iommu_dev_table[devid].data[0] &= (~DTE_FLAG_GV); +} + static void do_attach(struct iommu_dev_data *dev_data, struct protection_domain *domain) { @@ -2301,6 +2306,7 @@ static void queue_add(struct dma_ops_domain *dma_dom, */ static struct protection_domain *get_domain(struct device *dev) { + struct iommu_dev_data *dev_data = get_dev_data(dev); struct protection_domain *domain; struct iommu_domain *io_domain; @@ -2308,11 +2314,21 @@ static struct protection_domain *get_domain(struct device *dev) return ERR_PTR(-EINVAL); domain = get_dev_data(dev)->domain; - if (domain == NULL && get_dev_data(dev)->defer_attach) { + if (domain == NULL && dev_data->defer_attach) { + u16 alias = amd_iommu_alias_table[dev_data->devid]; get_dev_data(dev)->defer_attach = false; io_domain = iommu_get_domain_for_dev(dev); domain = to_pdomain(io_domain); attach_device(dev, domain); + /* + * If the deferred attached domain is not v2, should clear out + * the old GV flag. + */ + if (!(domain->flags & PD_IOMMUV2_MASK)) { + clear_dte_flag_gv(dev_data->devid); + if (alias != dev_data->devid) + clear_dte_flag_gv(dev_data->devid); + } } if (!dma_ops_domain(domain)) return ERR_PTR(-EBUSY); -- 2.5.5