From: Nadav Amit <nadav.amit@gmail.com> To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org> Cc: Nadav Amit <namit@vmware.com>, Jiajun Cao <caojiajun@vmware.com>, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] iommu/amd: Selective flush on unmap Date: Sat, 1 May 2021 23:59:58 -0700 [thread overview] Message-ID: <20210502070001.1559127-4-namit@vmware.com> (raw) In-Reply-To: <20210502070001.1559127-1-namit@vmware.com> From: Nadav Amit <namit@vmware.com> Recent patch attempted to enable selective page flushes on AMD IOMMU but neglected to adapt amd_iommu_iotlb_sync() to use the selective flushes. Adapt amd_iommu_iotlb_sync() to use selective flushes and change amd_iommu_unmap() to collect the flushes. As a defensive measure, to avoid potential issues as those that the Intel IOMMU driver encountered recently, flush the page-walk caches by always setting the "pde" parameter. This can be removed later. Cc: Joerg Roedel <joro@8bytes.org> Cc: Will Deacon <will@kernel.org> Cc: Jiajun Cao <caojiajun@vmware.com> Cc: iommu@lists.linux-foundation.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Nadav Amit <namit@vmware.com> --- drivers/iommu/amd/iommu.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 6723cbcf4030..b8cabbbeed71 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2057,12 +2057,17 @@ static size_t amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova, { struct protection_domain *domain = to_pdomain(dom); struct io_pgtable_ops *ops = &domain->iop.iop.ops; + size_t r; if ((amd_iommu_pgtable == AMD_IOMMU_V1) && (domain->iop.mode == PAGE_MODE_NONE)) return 0; - return (ops->unmap) ? ops->unmap(ops, iova, page_size, gather) : 0; + r = (ops->unmap) ? ops->unmap(ops, iova, page_size, gather) : 0; + + iommu_iotlb_gather_add_page(dom, gather, iova, page_size); + + return r; } static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, @@ -2165,7 +2170,13 @@ static void amd_iommu_flush_iotlb_all(struct iommu_domain *domain) static void amd_iommu_iotlb_sync(struct iommu_domain *domain, struct iommu_iotlb_gather *gather) { - amd_iommu_flush_iotlb_all(domain); + struct protection_domain *dom = to_pdomain(domain); + unsigned long flags; + + spin_lock_irqsave(&dom->lock, flags); + __domain_flush_pages(dom, gather->start, gather->end - gather->start, 1); + amd_iommu_domain_flush_complete(dom); + spin_unlock_irqrestore(&dom->lock, flags); } static int amd_iommu_def_domain_type(struct device *dev) -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Nadav Amit <nadav.amit@gmail.com> To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org> Cc: iommu@lists.linux-foundation.org, Nadav Amit <namit@vmware.com>, Jiajun Cao <caojiajun@vmware.com>, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] iommu/amd: Selective flush on unmap Date: Sat, 1 May 2021 23:59:58 -0700 [thread overview] Message-ID: <20210502070001.1559127-4-namit@vmware.com> (raw) In-Reply-To: <20210502070001.1559127-1-namit@vmware.com> From: Nadav Amit <namit@vmware.com> Recent patch attempted to enable selective page flushes on AMD IOMMU but neglected to adapt amd_iommu_iotlb_sync() to use the selective flushes. Adapt amd_iommu_iotlb_sync() to use selective flushes and change amd_iommu_unmap() to collect the flushes. As a defensive measure, to avoid potential issues as those that the Intel IOMMU driver encountered recently, flush the page-walk caches by always setting the "pde" parameter. This can be removed later. Cc: Joerg Roedel <joro@8bytes.org> Cc: Will Deacon <will@kernel.org> Cc: Jiajun Cao <caojiajun@vmware.com> Cc: iommu@lists.linux-foundation.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Nadav Amit <namit@vmware.com> --- drivers/iommu/amd/iommu.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 6723cbcf4030..b8cabbbeed71 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2057,12 +2057,17 @@ static size_t amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova, { struct protection_domain *domain = to_pdomain(dom); struct io_pgtable_ops *ops = &domain->iop.iop.ops; + size_t r; if ((amd_iommu_pgtable == AMD_IOMMU_V1) && (domain->iop.mode == PAGE_MODE_NONE)) return 0; - return (ops->unmap) ? ops->unmap(ops, iova, page_size, gather) : 0; + r = (ops->unmap) ? ops->unmap(ops, iova, page_size, gather) : 0; + + iommu_iotlb_gather_add_page(dom, gather, iova, page_size); + + return r; } static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, @@ -2165,7 +2170,13 @@ static void amd_iommu_flush_iotlb_all(struct iommu_domain *domain) static void amd_iommu_iotlb_sync(struct iommu_domain *domain, struct iommu_iotlb_gather *gather) { - amd_iommu_flush_iotlb_all(domain); + struct protection_domain *dom = to_pdomain(domain); + unsigned long flags; + + spin_lock_irqsave(&dom->lock, flags); + __domain_flush_pages(dom, gather->start, gather->end - gather->start, 1); + amd_iommu_domain_flush_complete(dom); + spin_unlock_irqrestore(&dom->lock, flags); } static int amd_iommu_def_domain_type(struct device *dev) -- 2.25.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2021-05-02 7:05 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-05-02 6:59 [PATCH 0/4] iommu/amd: Enable page-selective flushes Nadav Amit 2021-05-02 6:59 ` Nadav Amit 2021-05-02 6:59 ` [PATCH 1/4] iommu/amd: Fix wrong parentheses on page-specific invalidations Nadav Amit 2021-05-02 6:59 ` Nadav Amit 2021-05-18 9:23 ` Joerg Roedel 2021-05-18 9:23 ` Joerg Roedel 2021-05-31 20:11 ` Nadav Amit 2021-05-31 20:11 ` Nadav Amit 2021-05-02 6:59 ` [PATCH 2/4] iommu/amd: Do not sync on page size changes Nadav Amit 2021-05-02 6:59 ` Nadav Amit 2021-05-02 6:59 ` Nadav Amit [this message] 2021-05-02 6:59 ` [PATCH 2/4] iommu/amd: Selective flush on unmap Nadav Amit 2021-05-02 6:59 ` [PATCH 3/4] iommu/amd: Do not sync on page size changes Nadav Amit 2021-05-02 6:59 ` Nadav Amit 2021-06-01 15:59 ` Robin Murphy 2021-06-01 15:59 ` Robin Murphy 2021-06-01 16:39 ` Nadav Amit 2021-06-01 16:39 ` Nadav Amit 2021-06-01 17:27 ` Robin Murphy 2021-06-01 17:27 ` Robin Murphy 2021-06-01 18:56 ` Nadav Amit 2021-06-01 18:56 ` Nadav Amit 2021-05-02 7:00 ` [PATCH 3/4] iommu/amd: Selective flush on unmap Nadav Amit 2021-05-02 7:00 ` Nadav Amit 2021-05-02 7:00 ` [PATCH 4/4] iommu/amd: Do not use flush-queue when NpCache is on Nadav Amit 2021-05-02 7:00 ` Nadav Amit
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210502070001.1559127-4-namit@vmware.com \ --to=nadav.amit@gmail.com \ --cc=caojiajun@vmware.com \ --cc=iommu@lists.linux-foundation.org \ --cc=joro@8bytes.org \ --cc=linux-kernel@vger.kernel.org \ --cc=namit@vmware.com \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.