All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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 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.