All of lore.kernel.org
 help / color / mirror / Atom feed
From: konrad.wilk@oracle.com (Konrad Rzeszutek Wilk)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v9 10/13] xen/arm/arm64: introduce xen_arch_need_swiotlb
Date: Fri, 21 Nov 2014 11:48:08 -0500	[thread overview]
Message-ID: <20141121164808.GB6798@laptop.dumpdata.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1411211617090.2675@kaball.uk.xensource.com>

On Fri, Nov 21, 2014 at 04:31:31PM +0000, Stefano Stabellini wrote:
> On Wed, 12 Nov 2014, Stefano Stabellini wrote:
> > Introduce an arch specific function to find out whether a particular dma
> > mapping operation needs to bounce on the swiotlb buffer.
> > 
> > On ARM and ARM64, if the page involved is a foreign page and the device
> > is not coherent, we need to bounce because at unmap time we cannot
> > execute any required cache maintenance operations (we don't know how to
> > find the pfn from the mfn).
> > 
> > No change of behaviour for x86.
> > 
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Reviewed-by: David Vrabel <david.vrabel@citrix.com>
> > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > Acked-by: Ian Campbell <ian.campbell@citrix.com>
> > Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> I am thinking of asking a backport of this patch to 3.16+
> 
> The catch is that is_device_dma_coherent is not available on older
> kernels, so I'll have to change the arm implementation of
> xen_arch_need_swiotlb to:
> 
> +bool xen_arch_need_swiotlb(struct device *dev,
> +			   unsigned long pfn,
> +			   unsigned long mfn)
> +{
> +	return pfn != mfn;
> +}
> +
> 
> It is going to make things slower but it is going to fix the issue with
> cache flushing buffers for non-coherent devices.
> 
> Konrad, are you OK with that?

Looks fine.
> 
> 
> > Changes in v6:
> > - fix ts.
> > 
> > Changes in v5:
> > - fix indentation.
> > ---
> >  arch/arm/include/asm/xen/page.h |    4 ++++
> >  arch/arm/xen/mm.c               |    7 +++++++
> >  arch/x86/include/asm/xen/page.h |    7 +++++++
> >  drivers/xen/swiotlb-xen.c       |    5 ++++-
> >  4 files changed, 22 insertions(+), 1 deletion(-)
> > 
> > diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h
> > index 135c24a..68c739b 100644
> > --- a/arch/arm/include/asm/xen/page.h
> > +++ b/arch/arm/include/asm/xen/page.h
> > @@ -107,4 +107,8 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
> >  #define xen_remap(cookie, size) ioremap_cache((cookie), (size))
> >  #define xen_unmap(cookie) iounmap((cookie))
> >  
> > +bool xen_arch_need_swiotlb(struct device *dev,
> > +			   unsigned long pfn,
> > +			   unsigned long mfn);
> > +
> >  #endif /* _ASM_ARM_XEN_PAGE_H */
> > diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
> > index ab700e1..28ebf3e 100644
> > --- a/arch/arm/xen/mm.c
> > +++ b/arch/arm/xen/mm.c
> > @@ -100,6 +100,13 @@ void __xen_dma_sync_single_for_device(struct device *hwdev,
> >  	__xen_dma_page_cpu_to_dev(hwdev, handle, size, dir);
> >  }
> >  
> > +bool xen_arch_need_swiotlb(struct device *dev,
> > +			   unsigned long pfn,
> > +			   unsigned long mfn)
> > +{
> > +	return ((pfn != mfn) && !is_device_dma_coherent(dev));
> > +}
> > +
> >  int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
> >  				 unsigned int address_bits,
> >  				 dma_addr_t *dma_handle)
> > diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
> > index c949923..f58ef6c 100644
> > --- a/arch/x86/include/asm/xen/page.h
> > +++ b/arch/x86/include/asm/xen/page.h
> > @@ -236,4 +236,11 @@ void make_lowmem_page_readwrite(void *vaddr);
> >  #define xen_remap(cookie, size) ioremap((cookie), (size));
> >  #define xen_unmap(cookie) iounmap((cookie))
> >  
> > +static inline bool xen_arch_need_swiotlb(struct device *dev,
> > +					 unsigned long pfn,
> > +					 unsigned long mfn)
> > +{
> > +	return false;
> > +}
> > +
> >  #endif /* _ASM_X86_XEN_PAGE_H */
> > diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
> > index ad2c5eb..3725ee4 100644
> > --- a/drivers/xen/swiotlb-xen.c
> > +++ b/drivers/xen/swiotlb-xen.c
> > @@ -399,7 +399,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
> >  	 * buffering it.
> >  	 */
> >  	if (dma_capable(dev, dev_addr, size) &&
> > -	    !range_straddles_page_boundary(phys, size) && !swiotlb_force) {
> > +	    !range_straddles_page_boundary(phys, size) &&
> > +		!xen_arch_need_swiotlb(dev, PFN_DOWN(phys), PFN_DOWN(dev_addr)) &&
> > +		!swiotlb_force) {
> >  		/* we are not interested in the dma_addr returned by
> >  		 * xen_dma_map_page, only in the potential cache flushes executed
> >  		 * by the function. */
> > @@ -557,6 +559,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
> >  		dma_addr_t dev_addr = xen_phys_to_bus(paddr);
> >  
> >  		if (swiotlb_force ||
> > +		    xen_arch_need_swiotlb(hwdev, PFN_DOWN(paddr), PFN_DOWN(dev_addr)) ||
> >  		    !dma_capable(hwdev, dev_addr, sg->length) ||
> >  		    range_straddles_page_boundary(paddr, sg->length)) {
> >  			phys_addr_t map = swiotlb_tbl_map_single(hwdev,
> > -- 
> > 1.7.10.4
> > 

WARNING: multiple messages have this Message-ID (diff)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: xen-devel@lists.xensource.com,
	Ian Campbell <Ian.Campbell@citrix.com>,
	david.vrabel@citrix.com, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Catalin Marinas <catalin.marinas@arm.com>
Subject: Re: [PATCH v9 10/13] xen/arm/arm64: introduce xen_arch_need_swiotlb
Date: Fri, 21 Nov 2014 11:48:08 -0500	[thread overview]
Message-ID: <20141121164808.GB6798@laptop.dumpdata.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1411211617090.2675@kaball.uk.xensource.com>

On Fri, Nov 21, 2014 at 04:31:31PM +0000, Stefano Stabellini wrote:
> On Wed, 12 Nov 2014, Stefano Stabellini wrote:
> > Introduce an arch specific function to find out whether a particular dma
> > mapping operation needs to bounce on the swiotlb buffer.
> > 
> > On ARM and ARM64, if the page involved is a foreign page and the device
> > is not coherent, we need to bounce because at unmap time we cannot
> > execute any required cache maintenance operations (we don't know how to
> > find the pfn from the mfn).
> > 
> > No change of behaviour for x86.
> > 
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Reviewed-by: David Vrabel <david.vrabel@citrix.com>
> > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > Acked-by: Ian Campbell <ian.campbell@citrix.com>
> > Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> I am thinking of asking a backport of this patch to 3.16+
> 
> The catch is that is_device_dma_coherent is not available on older
> kernels, so I'll have to change the arm implementation of
> xen_arch_need_swiotlb to:
> 
> +bool xen_arch_need_swiotlb(struct device *dev,
> +			   unsigned long pfn,
> +			   unsigned long mfn)
> +{
> +	return pfn != mfn;
> +}
> +
> 
> It is going to make things slower but it is going to fix the issue with
> cache flushing buffers for non-coherent devices.
> 
> Konrad, are you OK with that?

Looks fine.
> 
> 
> > Changes in v6:
> > - fix ts.
> > 
> > Changes in v5:
> > - fix indentation.
> > ---
> >  arch/arm/include/asm/xen/page.h |    4 ++++
> >  arch/arm/xen/mm.c               |    7 +++++++
> >  arch/x86/include/asm/xen/page.h |    7 +++++++
> >  drivers/xen/swiotlb-xen.c       |    5 ++++-
> >  4 files changed, 22 insertions(+), 1 deletion(-)
> > 
> > diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h
> > index 135c24a..68c739b 100644
> > --- a/arch/arm/include/asm/xen/page.h
> > +++ b/arch/arm/include/asm/xen/page.h
> > @@ -107,4 +107,8 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
> >  #define xen_remap(cookie, size) ioremap_cache((cookie), (size))
> >  #define xen_unmap(cookie) iounmap((cookie))
> >  
> > +bool xen_arch_need_swiotlb(struct device *dev,
> > +			   unsigned long pfn,
> > +			   unsigned long mfn);
> > +
> >  #endif /* _ASM_ARM_XEN_PAGE_H */
> > diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
> > index ab700e1..28ebf3e 100644
> > --- a/arch/arm/xen/mm.c
> > +++ b/arch/arm/xen/mm.c
> > @@ -100,6 +100,13 @@ void __xen_dma_sync_single_for_device(struct device *hwdev,
> >  	__xen_dma_page_cpu_to_dev(hwdev, handle, size, dir);
> >  }
> >  
> > +bool xen_arch_need_swiotlb(struct device *dev,
> > +			   unsigned long pfn,
> > +			   unsigned long mfn)
> > +{
> > +	return ((pfn != mfn) && !is_device_dma_coherent(dev));
> > +}
> > +
> >  int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
> >  				 unsigned int address_bits,
> >  				 dma_addr_t *dma_handle)
> > diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
> > index c949923..f58ef6c 100644
> > --- a/arch/x86/include/asm/xen/page.h
> > +++ b/arch/x86/include/asm/xen/page.h
> > @@ -236,4 +236,11 @@ void make_lowmem_page_readwrite(void *vaddr);
> >  #define xen_remap(cookie, size) ioremap((cookie), (size));
> >  #define xen_unmap(cookie) iounmap((cookie))
> >  
> > +static inline bool xen_arch_need_swiotlb(struct device *dev,
> > +					 unsigned long pfn,
> > +					 unsigned long mfn)
> > +{
> > +	return false;
> > +}
> > +
> >  #endif /* _ASM_X86_XEN_PAGE_H */
> > diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
> > index ad2c5eb..3725ee4 100644
> > --- a/drivers/xen/swiotlb-xen.c
> > +++ b/drivers/xen/swiotlb-xen.c
> > @@ -399,7 +399,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
> >  	 * buffering it.
> >  	 */
> >  	if (dma_capable(dev, dev_addr, size) &&
> > -	    !range_straddles_page_boundary(phys, size) && !swiotlb_force) {
> > +	    !range_straddles_page_boundary(phys, size) &&
> > +		!xen_arch_need_swiotlb(dev, PFN_DOWN(phys), PFN_DOWN(dev_addr)) &&
> > +		!swiotlb_force) {
> >  		/* we are not interested in the dma_addr returned by
> >  		 * xen_dma_map_page, only in the potential cache flushes executed
> >  		 * by the function. */
> > @@ -557,6 +559,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
> >  		dma_addr_t dev_addr = xen_phys_to_bus(paddr);
> >  
> >  		if (swiotlb_force ||
> > +		    xen_arch_need_swiotlb(hwdev, PFN_DOWN(paddr), PFN_DOWN(dev_addr)) ||
> >  		    !dma_capable(hwdev, dev_addr, sg->length) ||
> >  		    range_straddles_page_boundary(paddr, sg->length)) {
> >  			phys_addr_t map = swiotlb_tbl_map_single(hwdev,
> > -- 
> > 1.7.10.4
> > 

  reply	other threads:[~2014-11-21 16:48 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-12 11:39 [PATCH v9 0/13] introduce GNTTABOP_cache_flush Stefano Stabellini
2014-11-12 11:39 ` Stefano Stabellini
2014-11-12 11:39 ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 01/13] xen/arm: remove handling of XENFEAT_grant_map_identity Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 02/13] xen/arm: remove outer_*_range call Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 03/13] xen/arm: if(pfn_valid(pfn)) call native dma_ops Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 04/13] arm64: introduce is_device_dma_coherent Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 05/13] arm: " Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-14 11:59   ` Stefano Stabellini
2014-11-14 11:59     ` Stefano Stabellini
2014-11-14 11:59     ` Stefano Stabellini
2014-11-18 16:49     ` Stefano Stabellini
2014-11-18 16:49       ` Stefano Stabellini
2014-11-18 16:49       ` Stefano Stabellini
2014-11-20  0:07       ` Russell King - ARM Linux
2014-11-20  0:07         ` Russell King - ARM Linux
2014-11-20 10:39         ` Stefano Stabellini
2014-11-20 10:39           ` Stefano Stabellini
2014-11-20 10:39           ` Stefano Stabellini
2014-11-21 15:29           ` Russell King - ARM Linux
2014-11-21 15:29             ` Russell King - ARM Linux
2014-11-12 11:40 ` [PATCH v9 06/13] xen/arm: use is_device_dma_coherent Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 07/13] xen: add a dma_addr_t dev_addr argument to xen_dma_map_page Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 08/13] xen/arm: use hypercall to flush caches in map_page Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 09/13] xen/arm/arm64: merge xen/mm32.c into xen/mm.c Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 10/13] xen/arm/arm64: introduce xen_arch_need_swiotlb Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-21 16:31   ` Stefano Stabellini
2014-11-21 16:31     ` Stefano Stabellini
2014-11-21 16:31     ` Stefano Stabellini
2014-11-21 16:48     ` Konrad Rzeszutek Wilk [this message]
2014-11-21 16:48       ` Konrad Rzeszutek Wilk
2014-11-12 11:40 ` [PATCH v9 11/13] xen/arm: introduce GNTTABOP_cache_flush Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40 ` [PATCH v9 12/13] swiotlb-xen: pass dev_addr to xen_dma_unmap_page and xen_dma_sync_single_for_cpu Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-19 21:07   ` Konrad Rzeszutek Wilk
2014-11-19 21:07     ` Konrad Rzeszutek Wilk
2014-11-20 10:33     ` Stefano Stabellini
2014-11-20 10:33       ` Stefano Stabellini
2014-11-20 10:33       ` Stefano Stabellini
2014-11-20 10:47       ` Stefano Stabellini
2014-11-20 10:47         ` Stefano Stabellini
2014-11-20 10:47         ` Stefano Stabellini
2014-11-20 20:30         ` Konrad Rzeszutek Wilk
2014-11-20 20:30           ` Konrad Rzeszutek Wilk
2014-11-12 11:40 ` [PATCH v9 13/13] swiotlb-xen: remove BUG_ON in xen_bus_to_phys Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-12 11:40   ` Stefano Stabellini
2014-11-19 21:06   ` Konrad Rzeszutek Wilk
2014-11-19 21:06     ` Konrad Rzeszutek Wilk
2014-11-12 14:22 ` [Xen-devel] [PATCH v9 0/13] introduce GNTTABOP_cache_flush Julien Grall
2014-11-12 14:22   ` Julien Grall

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=20141121164808.GB6798@laptop.dumpdata.com \
    --to=konrad.wilk@oracle.com \
    --cc=linux-arm-kernel@lists.infradead.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.