From: Joerg Roedel <jroedel@suse.de>
To: Will Deacon <will.deacon@arm.com>
Cc: Joerg Roedel <joro@8bytes.org>,
iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>,
Alex Williamson <alex.williamson@redhat.com>,
Robin Murphy <robin.murphy@arm.com>
Subject: Re: [PATCH 02/13] iommu: Introduce Interface for IOMMU TLB Flushing
Date: Thu, 17 Aug 2017 23:20:54 +0200 [thread overview]
Message-ID: <20170817212054.GL2853@suse.de> (raw)
In-Reply-To: <20170817171704.GD30719@arm.com>
Hi Will,
On Thu, Aug 17, 2017 at 06:17:05PM +0100, Will Deacon wrote:
> On Thu, Aug 17, 2017 at 06:50:40PM +0200, Joerg Roedel wrote:
> > 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.
Okay, I look into a better solution for that.
> 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.
With the deferred flushing you don't flush anything in the unmap path in
most cases. All you do there is to add the unmapped iova-range to a
per-cpu list (its actually a ring-buffer). Only when that buffer is full
you do a flush_tlb_all() on the domain and then free all the iova
ranges.
With the flush-counters you can also see which entries in your buffer
have already been flushed from the IO/TLB by another CPU, so that you
can release them right away without any further flush. This way its less
likely that the buffer fills up.
In my tests on x86 I got the flush-rate down to ~1800 flushes/sec at a
network packet rate of 1.45 million pps.
> 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.
Hard to believe when all CPUs fight for the cmd-buffer lock, especially
when you have around 96 CPUs :) Can you share the performance numbers
you have and what you measured?
> 2. We can free page-table pages in unmap, but that's not safe if we defer
> flushing
Right, VT-d has the same problem and solved it with a free-list of pages
that is passed to the deferred flushing code. When the IO/TLB is flushed
it calls back into the driver which then frees the pages.
> 3. Flushing the whole TLB is undesirable and not something we currently
> need to do
Is the TLB-refill cost higher than the time needed to add a
flush-command for every unmapped range?
> 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.
Interesting, can you share more about that?
> 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.
Yeah, I don't like the entry_dtor_cb() I introduced for that very much, so if
there are better solutions I am all ears.
Regards,
Joerg
next prev parent reply other threads:[~2017-08-17 21:20 UTC|newest]
Thread overview: 59+ 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 ` 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
[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 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 02/13] iommu: Introduce Interface for IOMMU TLB Flushing Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
[not found] ` <1502974596-23835-3-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 16:32 ` Will Deacon
2017-08-17 16:32 ` Will Deacon
[not found] ` <20170817163234.GB30719-5wv7dgnIgG8@public.gmane.org>
2017-08-17 16:50 ` Joerg Roedel
2017-08-17 16:50 ` Joerg Roedel
[not found] ` <20170817165040.GK2853-l3A5Bk7waGM@public.gmane.org>
2017-08-17 17:17 ` Will Deacon
2017-08-17 17:17 ` Will Deacon
2017-08-17 21:20 ` Joerg Roedel [this message]
[not found] ` <20170817212054.GL2853-l3A5Bk7waGM@public.gmane.org>
2017-08-18 15:16 ` Will Deacon
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 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 04/13] iommu/dma: " Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 05/13] arm: dma-mapping: " Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 06/13] drm/etnaviv: " Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
[not found] ` <1502974596-23835-7-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-17 13:32 ` Lucas Stach
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 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
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: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 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 10/13] drm/tegra: " Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
2017-08-17 13:28 ` Thierry Reding
2017-08-17 12:56 ` [PATCH 11/13] gpu: host1x: " Joerg Roedel
2017-08-17 12:56 ` 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 13:29 ` Thierry Reding
2017-08-17 14:35 ` [PATCH 00/13] Introduce IOMMU-API TLB Flushing Interface Alex Williamson
2017-08-17 14:35 ` 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
2017-08-17 14:54 ` Alex Williamson
[not found] ` <20170817085407.3de4e755-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-08-17 15:22 ` Joerg Roedel
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-23 12:09 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 09/13] drm/rockchip: Use sychronized interface of the IOMMU-API Joerg Roedel
2017-08-17 12:56 ` Joerg Roedel
2017-08-17 12:56 ` [PATCH 12/13] IB/usnic: " 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=20170817212054.GL2853@suse.de \
--to=jroedel@suse.de \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=alex.williamson@redhat.com \
--cc=iommu@lists.linux-foundation.org \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=will.deacon@arm.com \
/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 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.