From: "Leizhen (ThunderTown)" <thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>,
Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Cc: Joerg Roedel <jroedel-l3A5Bk7waGM@public.gmane.org>,
Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>
Subject: Re: [PATCH 2/2] iommu: Introduce Interface for IOMMU TLB Flushing
Date: Tue, 29 Aug 2017 20:04:45 +0800 [thread overview]
Message-ID: <59A5585D.7000007@huawei.com> (raw)
In-Reply-To: <837fc6a8-4b9b-7ae3-5c74-6f3c202a38fb-5wv7dgnIgG8@public.gmane.org>
On 2017/8/29 19:19, Robin Murphy wrote:
> On 29/08/17 03:53, Leizhen (ThunderTown) wrote:
> [...]
>>> -size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
>>> +static size_t __iommu_unmap(struct iommu_domain *domain,
>>> + unsigned long iova, size_t size,
>>> + bool sync)
>>> {
>>> + const struct iommu_ops *ops = domain->ops;
>>> size_t unmapped_page, unmapped = 0;
>>> - unsigned int min_pagesz;
>>> unsigned long orig_iova = iova;
>>> + unsigned int min_pagesz;
>>>
>>> - if (unlikely(domain->ops->unmap == NULL ||
>>> + if (unlikely(ops->unmap == NULL ||
>>> domain->pgsize_bitmap == 0UL))
>>> return -ENODEV;
>>>
>>> @@ -1592,10 +1597,13 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
>>> while (unmapped < size) {
>>> size_t pgsize = iommu_pgsize(domain, iova, size - unmapped);
>>>
>>> - unmapped_page = domain->ops->unmap(domain, iova, pgsize);
>>> + unmapped_page = ops->unmap(domain, iova, pgsize);
>>> if (!unmapped_page)
>>> break;
>>>
>>> + if (sync && ops->iotlb_range_add)
>>> + ops->iotlb_range_add(domain, iova, pgsize);
>>> +
>>> pr_debug("unmapped: iova 0x%lx size 0x%zx\n",
>>> iova, unmapped_page);
>>>
>>> @@ -1603,11 +1611,27 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
>>> unmapped += unmapped_page;
>>> }
>>>
>>> + if (sync && ops->iotlb_sync)
>>> + ops->iotlb_sync(domain);
>>> +
>>> trace_unmap(orig_iova, size, unmapped);
>>> return unmapped;
>>> }
>>> +
>>> +size_t iommu_unmap(struct iommu_domain *domain,
>>> + unsigned long iova, size_t size)
>>> +{
>>> + return __iommu_unmap(domain, iova, size, true);
>>> +}
>>> EXPORT_SYMBOL_GPL(iommu_unmap);
>>>
>>> +size_t iommu_unmap_fast(struct iommu_domain *domain,
>>> + unsigned long iova, size_t size)
>>> +{
>> Do we need to add a check "if (!domain->ops->iotlb_sync)". Suppose the new added three hooks are not
>> registered, we should fallback to iommu_unmap.
>
> If those callbacks don't exist, then iommu_unmap() isn't going to be
> able to call them either, so I don't see what difference that makes :/
Yes, you're right, I see.
>
>>> + return __iommu_unmap(domain, iova, size, false);
>>> +}
>>> +EXPORT_SYMBOL_GPL(iommu_unmap_fast);
>>> +
>>> size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
>>> struct scatterlist *sg, unsigned int nents, int prot)
>>> {
>>> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
>>> index 2cb54ad..67fa954 100644
>>> --- a/include/linux/iommu.h
>>> +++ b/include/linux/iommu.h
>>> @@ -167,6 +167,10 @@ struct iommu_resv_region {
>>> * @map: map a physically contiguous memory region to an iommu domain
>>> * @unmap: unmap a physically contiguous memory region from an iommu domain
>>> * @map_sg: map a scatter-gather list of physically contiguous memory chunks
>>> + * @flush_tlb_all: Synchronously flush all hardware TLBs for this domain
>>> + * @tlb_range_add: Add a given iova range to the flush queue for this domain
>>> + * @tlb_sync: Flush all queued ranges from the hardware TLBs and empty flush
>>> + * queue
>>> * to an iommu domain
>>> * @iova_to_phys: translate iova to physical address
>>> * @add_device: add device to iommu grouping
>>> @@ -199,6 +203,10 @@ struct iommu_ops {
>>> size_t size);
>>> size_t (*map_sg)(struct iommu_domain *domain, unsigned long iova,
>>> struct scatterlist *sg, unsigned int nents, int prot);
>>> + void (*flush_iotlb_all)(struct iommu_domain *domain);
>>> + void (*iotlb_range_add)(struct iommu_domain *domain,
>>> + unsigned long iova, size_t size);
>>> + void (*iotlb_sync)(struct iommu_domain *domain);
>> I think we'd better to make sure all these three hooks are registered or all are not, in
>> function __iommu_domain_alloc or some other suitable place.
>
> I'd prefer for them to be individually optional than for drivers to have
> to implement no-op callbacks - e.g. for SMMUv2 where issuing TLBIs is
> relatively cheap, but latency-sensitive, we're probably better off not
> bothering with with .iotlb_range_add (leaving the TLBIs implicit in
> .unmap) only implementing .iotlb_sync.
OK, so that the arch iommu can free to do so.
>
> Robin.
>
> .
>
--
Thanks!
BestRegards
next prev parent reply other threads:[~2017-08-29 12:04 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-23 13:50 [PATCH 0/2 v2] Introduce IOMMU-API TLB Flushing Interface Joerg Roedel
[not found] ` <1503496204-2527-1-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-23 13:50 ` [PATCH 1/2] iommu/amd: Rename a few flush functions Joerg Roedel
2017-08-23 13:50 ` [PATCH 2/2] iommu: Introduce Interface for IOMMU TLB Flushing Joerg Roedel
[not found] ` <1503496204-2527-3-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2017-08-29 2:53 ` Leizhen (ThunderTown)
[not found] ` <59A4D72F.9040600-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-08-29 11:19 ` Robin Murphy
[not found] ` <837fc6a8-4b9b-7ae3-5c74-6f3c202a38fb-5wv7dgnIgG8@public.gmane.org>
2017-08-29 12:04 ` Leizhen (ThunderTown) [this message]
2017-08-29 11:23 ` Robin Murphy
[not found] ` <811dfba8-097c-0deb-c283-a7b1e0c6ee38-5wv7dgnIgG8@public.gmane.org>
2017-08-29 12:12 ` Joerg Roedel
2017-09-01 17:20 ` Will Deacon
[not found] ` <20170901172044.GB20817-5wv7dgnIgG8@public.gmane.org>
2017-09-01 21:45 ` Joerg Roedel
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=59A5585D.7000007@huawei.com \
--to=thunder.leizhen-hv44wf8li93qt0dzr+alfa@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=jroedel-l3A5Bk7waGM@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@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).