iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>
To: Joerg Roedel <jroedel-l3A5Bk7waGM@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 02/13] iommu: Introduce Interface for IOMMU TLB Flushing
Date: Thu, 17 Aug 2017 18:17:05 +0100	[thread overview]
Message-ID: <20170817171704.GD30719@arm.com> (raw)
In-Reply-To: <20170817165040.GK2853-l3A5Bk7waGM@public.gmane.org>

Hi Joerg,

On Thu, Aug 17, 2017 at 06:50:40PM +0200, Joerg Roedel wrote:
> On Thu, Aug 17, 2017 at 05:32:35PM +0100, Will Deacon wrote:
> > I really like the idea of this, but I have a couple of questions and
> > comments below.
> 
> Great, this together with the common iova-flush it should make it
> possible to solve the performance problems of the dma-iommu code.
> 
> > > +int iommu_map_sync(struct iommu_domain *domain, unsigned long iova,
> > > +		   phys_addr_t paddr, size_t size, int prot)
> > > +{
> > > +	int ret = iommu_map(domain, iova, paddr, size, prot);
> > > +
> > > +	iommu_tlb_range_add(domain, iova, size);
> > > +	iommu_tlb_sync(domain);
> > 
> > Many IOMMUs don't need these callbacks on ->map operations, but they won't
> > be able to distinguish them easily with this API. Could you add a flags
> > parameter or something to the iommu_tlb_* functions, please?
> 
> Yeah, this is only needed for virtualized IOMMUs that have a non-present
> cache. My idea was to let the iommu-drivers tell the common code whether
> the iommu needs it and the code above just checks a flag and omits the
> calls to the flush-functions then.
> 
> Problem currently is how to get this information from
> 'struct iommu_device' to 'struct iommu_domain'. As a workaround I
> consider a per-domain flag in the iommu drivers which checks whether any
> unmap has happened and just do nothing on the flush-call-back if there
> were none.

Given that this can all happen concurrently, I really don't like the idea of
having to track things with a flag. We'd end up introducing atomics and/or
over-invalidating the TLBs.

> > I think we will struggle to implement this efficiently on ARM SMMUv3. The
> > way invalidation works there is that there is a single in-memory command
> > queue into which we can put TLB invalidation commands (they are inserted
> > under a lock). These are then processed asynchronously by the hardware, and
> > you can complete them by inserting a SYNC command and waiting for that to
> > be consumed by the SMMU. Sounds like a perfect fit, right?
> 
> Yes, its basically the same as way as it works on AMD-Vi and Intel VT-d.
> 
> > The problem is that we want to add those invalidation commands as early
> > as possible, so that they can be processed by the hardware concurrently
> > with us unmapping other pages.
> 
> I think that's a bad idea, because then you re-introduce the performance
> problems again because everyone will spin on the cmd-queue lock in the
> unmap path of the dma-api.

We don't actually tend to see issues adding the TLB invalidation commands
under the lock -- the vast majority of the overhead comes from the SYNC.
Besides, I don't see how adding the commands in the ->iotlb_range_add
callback is any better: it still happens on unmap and it still needs to
take the lock.

If we had something like an ->unmap_all_sync callback, we could incorporate
the TLB invalidation into that.

> > That means adding the invalidation commands in the ->unmap callback
> > and not bothering to implement ->iotlb_range_add callback at all.
> > Then, we will do the sync in ->iotlb_sync. This falls apart if
> > somebody decides to use iommu_flush_tlb_all(), where we would prefer
> > not to insert all of the invalidation commands in unmap and instead
> > insert a single invalidate-all command, followed up with a SYNC.
> 
> This problem can be solved with the deferred iova flushing code I posted
> to the ML. When a queue fills up, iommu_flush_tlb_all() is called and
> every entry that was unmapped before can be released. This works well on
> x86, are there reasons it wouldn't on ARM?

There are a few reasons I'm not rushing to move to the deferred flushing
code for ARM:

  1. The performance numbers we have suggest that we can achieve near-native
     performance without needing to do that.

  2. We can free page-table pages in unmap, but that's not safe if we defer
     flushing

  3. Flushing the whole TLB is undesirable and not something we currently
     need to do

  4. There are security implications of deferring the unmap and I'm aware
     of a security research group that use this to gain root privileges.

  5. *If* performance figures end up showing that deferring the flush is
     worthwhile, I would rather use an RCU-based approach for protecting
     the page tables, like we do on the CPU.

Will

  parent reply	other threads:[~2017-08-17 17:17 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-17 12:56 [PATCH 00/13] Introduce IOMMU-API TLB Flushing Interface Joerg Roedel
2017-08-17 12:56 ` [PATCH 07/13] drm/msm: Use sychronized interface of the IOMMU-API Joerg Roedel
2017-08-19 15:39   ` Rob Clark
2017-08-17 12:56 ` [PATCH 09/13] drm/rockchip: " Joerg Roedel
     [not found] ` <1502974596-23835-1-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 12:56   ` [PATCH 01/13] iommu/amd: Rename a few flush functions Joerg Roedel
2017-08-17 12:56   ` [PATCH 02/13] iommu: Introduce Interface for IOMMU TLB Flushing Joerg Roedel
     [not found]     ` <1502974596-23835-3-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 16:32       ` Will Deacon
     [not found]         ` <20170817163234.GB30719-5wv7dgnIgG8@public.gmane.org>
2017-08-17 16:50           ` Joerg Roedel
     [not found]             ` <20170817165040.GK2853-l3A5Bk7waGM@public.gmane.org>
2017-08-17 17:17               ` Will Deacon [this message]
2017-08-17 21:20                 ` Joerg Roedel
     [not found]                   ` <20170817212054.GL2853-l3A5Bk7waGM@public.gmane.org>
2017-08-18 15:16                     ` Will Deacon
2017-08-17 12:56   ` [PATCH 03/13] vfio/type1: Use sychronized interface of the IOMMU-API Joerg Roedel
2017-08-17 12:56   ` [PATCH 04/13] iommu/dma: " Joerg Roedel
2017-08-17 12:56   ` [PATCH 05/13] arm: dma-mapping: " Joerg Roedel
2017-08-17 12:56   ` [PATCH 06/13] drm/etnaviv: " Joerg Roedel
     [not found]     ` <1502974596-23835-7-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 13:32       ` Lucas Stach
     [not found]         ` <1502976758.19806.25.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-08-17 13:45           ` Joerg Roedel
2017-08-17 14:03             ` Lucas Stach
     [not found]               ` <1502978634.19806.27.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-08-17 14:18                 ` Joerg Roedel
     [not found]                   ` <20170817141858.GG16908-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 14:30                     ` Lucas Stach
2017-08-17 14:35                       ` Joerg Roedel
2017-08-17 12:56   ` [PATCH 08/13] drm/nouveau/imem/gk20a: " Joerg Roedel
2017-08-17 12:56   ` [PATCH 10/13] drm/tegra: " Joerg Roedel
2017-08-17 13:28     ` Thierry Reding
2017-08-17 12:56   ` [PATCH 11/13] gpu: host1x: " Joerg Roedel
     [not found]     ` <1502974596-23835-12-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 13:29       ` Thierry Reding
2017-08-17 14:35   ` [PATCH 00/13] Introduce IOMMU-API TLB Flushing Interface Alex Williamson
2017-08-17 14:43     ` Joerg Roedel
     [not found]       ` <20170817144308.GI16908-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 14:54         ` Alex Williamson
     [not found]           ` <20170817085407.3de4e755-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-08-17 15:22             ` Joerg Roedel
     [not found]               ` <20170817152220.GK16908-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-23 12:09                 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 12/13] IB/usnic: Use sychronized interface of the IOMMU-API Joerg Roedel
2017-08-17 12:56 ` [PATCH 13/13] remoteproc: " Joerg Roedel
2017-08-24 19:06   ` Bjorn Andersson

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=20170817171704.GD30719@arm.com \
    --to=will.deacon-5wv7dgnigg8@public.gmane.org \
    --cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=jroedel-l3A5Bk7waGM@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).