All of lore.kernel.org
 help / color / mirror / Atom feed
* backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
@ 2015-01-12 18:09 ` Stefano Stabellini
  0 siblings, 0 replies; 7+ messages in thread
From: Stefano Stabellini @ 2015-01-12 18:09 UTC (permalink / raw)
  To: stable
  Cc: linux-kernel, Stefano Stabellini, Konrad Rzeszutek Wilk,
	David Vrabel, xen-devel, catalin.marinas, Ian Campbell

Hi all,
I would like to request a backport of the following commit:


commit a4dba130891271084344c12537731542ec77cb85
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:   Fri Nov 21 11:07:39 2014 +0000

    xen/arm/arm64: introduce xen_arch_need_swiotlb


to stable trees from 3.16 onward (3.16 included).


The commit needs to be slightly modified because is_device_dma_coherent
is not available on kernels < 3.19, so I just removed the call,
thus assuming that the device is not coherent on arm (slower but safe):

 diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
-index ab700e1..28ebf3e 100644
+index b0e77de..f8a576b 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);
- }
+@@ -16,6 +16,13 @@
+ #include <asm/xen/hypercall.h>
+ #include <asm/xen/interface.h>
  
 +bool xen_arch_need_swiotlb(struct device *dev,
 +			   unsigned long pfn,
 +			   unsigned long mfn)
 +{
-+	return ((pfn != mfn) && !is_device_dma_coherent(dev));
++	return (pfn != mfn);
 +}
 +
  int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,


The modified patch follows.


---

xen/arm/arm64: introduce xen_arch_need_swiotlb

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

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>

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 b0e77de..f8a576b 100644
--- a/arch/arm/xen/mm.c
+++ b/arch/arm/xen/mm.c
@@ -16,6 +16,13 @@
 #include <asm/xen/hypercall.h>
 #include <asm/xen/interface.h>
 
+bool xen_arch_need_swiotlb(struct device *dev,
+			   unsigned long pfn,
+			   unsigned long mfn)
+{
+	return (pfn != mfn);
+}
+
 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 ebd8f21..ac5d41b 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,

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
@ 2015-01-12 18:09 ` Stefano Stabellini
  0 siblings, 0 replies; 7+ messages in thread
From: Stefano Stabellini @ 2015-01-12 18:09 UTC (permalink / raw)
  To: stable
  Cc: linux-kernel, Stefano Stabellini, Konrad Rzeszutek Wilk,
	David Vrabel, xen-devel, catalin.marinas, Ian Campbell

Hi all,
I would like to request a backport of the following commit:


commit a4dba130891271084344c12537731542ec77cb85
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:   Fri Nov 21 11:07:39 2014 +0000

    xen/arm/arm64: introduce xen_arch_need_swiotlb


to stable trees from 3.16 onward (3.16 included).


The commit needs to be slightly modified because is_device_dma_coherent
is not available on kernels < 3.19, so I just removed the call,
thus assuming that the device is not coherent on arm (slower but safe):

 diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
-index ab700e1..28ebf3e 100644
+index b0e77de..f8a576b 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);
- }
+@@ -16,6 +16,13 @@
+ #include <asm/xen/hypercall.h>
+ #include <asm/xen/interface.h>
  
 +bool xen_arch_need_swiotlb(struct device *dev,
 +			   unsigned long pfn,
 +			   unsigned long mfn)
 +{
-+	return ((pfn != mfn) && !is_device_dma_coherent(dev));
++	return (pfn != mfn);
 +}
 +
  int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,


The modified patch follows.


---

xen/arm/arm64: introduce xen_arch_need_swiotlb

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

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>

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 b0e77de..f8a576b 100644
--- a/arch/arm/xen/mm.c
+++ b/arch/arm/xen/mm.c
@@ -16,6 +16,13 @@
 #include <asm/xen/hypercall.h>
 #include <asm/xen/interface.h>
 
+bool xen_arch_need_swiotlb(struct device *dev,
+			   unsigned long pfn,
+			   unsigned long mfn)
+{
+	return (pfn != mfn);
+}
+
 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 ebd8f21..ac5d41b 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,

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
  2015-01-12 18:09 ` Stefano Stabellini
@ 2015-01-15 11:04   ` Luis Henriques
  -1 siblings, 0 replies; 7+ messages in thread
From: Luis Henriques @ 2015-01-15 11:04 UTC (permalink / raw)
  To: Stefano Stabellini
  Cc: stable, linux-kernel, Konrad Rzeszutek Wilk, David Vrabel,
	xen-devel, catalin.marinas, Ian Campbell

On Mon, Jan 12, 2015 at 06:09:33PM +0000, Stefano Stabellini wrote:
> Hi all,
> I would like to request a backport of the following commit:
> 
> 
> commit a4dba130891271084344c12537731542ec77cb85
> Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Date:   Fri Nov 21 11:07:39 2014 +0000
> 
>     xen/arm/arm64: introduce xen_arch_need_swiotlb
> 
> 
> to stable trees from 3.16 onward (3.16 included).
> 
> 
> The commit needs to be slightly modified because is_device_dma_coherent
> is not available on kernels < 3.19, so I just removed the call,
> thus assuming that the device is not coherent on arm (slower but safe):
> 
>  diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
> -index ab700e1..28ebf3e 100644
> +index b0e77de..f8a576b 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);
> - }
> +@@ -16,6 +16,13 @@
> + #include <asm/xen/hypercall.h>
> + #include <asm/xen/interface.h>
>   
>  +bool xen_arch_need_swiotlb(struct device *dev,
>  +			   unsigned long pfn,
>  +			   unsigned long mfn)
>  +{
> -+	return ((pfn != mfn) && !is_device_dma_coherent(dev));
> ++	return (pfn != mfn);
>  +}
>  +
>   int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
> 
> 
> The modified patch follows.
> 
>

Thank you Stefano, I will queue this for the next 3.16 kernel.

Cheers,
--
Luís

> ---
> 
> xen/arm/arm64: introduce xen_arch_need_swiotlb
> 
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> 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>
> 
> 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 b0e77de..f8a576b 100644
> --- a/arch/arm/xen/mm.c
> +++ b/arch/arm/xen/mm.c
> @@ -16,6 +16,13 @@
>  #include <asm/xen/hypercall.h>
>  #include <asm/xen/interface.h>
>  
> +bool xen_arch_need_swiotlb(struct device *dev,
> +			   unsigned long pfn,
> +			   unsigned long mfn)
> +{
> +	return (pfn != mfn);
> +}
> +
>  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 ebd8f21..ac5d41b 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,
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
@ 2015-01-15 11:04   ` Luis Henriques
  0 siblings, 0 replies; 7+ messages in thread
From: Luis Henriques @ 2015-01-15 11:04 UTC (permalink / raw)
  To: Stefano Stabellini
  Cc: stable, linux-kernel, Konrad Rzeszutek Wilk, David Vrabel,
	xen-devel, catalin.marinas, Ian Campbell

On Mon, Jan 12, 2015 at 06:09:33PM +0000, Stefano Stabellini wrote:
> Hi all,
> I would like to request a backport of the following commit:
> 
> 
> commit a4dba130891271084344c12537731542ec77cb85
> Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Date:   Fri Nov 21 11:07:39 2014 +0000
> 
>     xen/arm/arm64: introduce xen_arch_need_swiotlb
> 
> 
> to stable trees from 3.16 onward (3.16 included).
> 
> 
> The commit needs to be slightly modified because is_device_dma_coherent
> is not available on kernels < 3.19, so I just removed the call,
> thus assuming that the device is not coherent on arm (slower but safe):
> 
>  diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
> -index ab700e1..28ebf3e 100644
> +index b0e77de..f8a576b 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);
> - }
> +@@ -16,6 +16,13 @@
> + #include <asm/xen/hypercall.h>
> + #include <asm/xen/interface.h>
>   
>  +bool xen_arch_need_swiotlb(struct device *dev,
>  +			   unsigned long pfn,
>  +			   unsigned long mfn)
>  +{
> -+	return ((pfn != mfn) && !is_device_dma_coherent(dev));
> ++	return (pfn != mfn);
>  +}
>  +
>   int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
> 
> 
> The modified patch follows.
> 
>

Thank you Stefano, I will queue this for the next 3.16 kernel.

Cheers,
--
Lu�s

> ---
> 
> xen/arm/arm64: introduce xen_arch_need_swiotlb
> 
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> 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>
> 
> 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 b0e77de..f8a576b 100644
> --- a/arch/arm/xen/mm.c
> +++ b/arch/arm/xen/mm.c
> @@ -16,6 +16,13 @@
>  #include <asm/xen/hypercall.h>
>  #include <asm/xen/interface.h>
>  
> +bool xen_arch_need_swiotlb(struct device *dev,
> +			   unsigned long pfn,
> +			   unsigned long mfn)
> +{
> +	return (pfn != mfn);
> +}
> +
>  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 ebd8f21..ac5d41b 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,
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
  2015-01-12 18:09 ` Stefano Stabellini
  (?)
  (?)
@ 2015-01-28  0:10 ` Greg KH
  2015-01-28 12:01     ` Stefano Stabellini
  -1 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2015-01-28  0:10 UTC (permalink / raw)
  To: Stefano Stabellini
  Cc: stable, linux-kernel, Konrad Rzeszutek Wilk, David Vrabel,
	xen-devel, catalin.marinas, Ian Campbell

On Mon, Jan 12, 2015 at 06:09:33PM +0000, Stefano Stabellini wrote:
> Hi all,
> I would like to request a backport of the following commit:
> 
> 
> commit a4dba130891271084344c12537731542ec77cb85
> Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Date:   Fri Nov 21 11:07:39 2014 +0000
> 
>     xen/arm/arm64: introduce xen_arch_need_swiotlb
> 
> 
> to stable trees from 3.16 onward (3.16 included).
> 
> 
> The commit needs to be slightly modified because is_device_dma_coherent
> is not available on kernels < 3.19, so I just removed the call,
> thus assuming that the device is not coherent on arm (slower but safe):

A diff of a diff is hard to apply, please send the reworked patch in a
format that I can apply it in.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
  2015-01-28  0:10 ` Greg KH
@ 2015-01-28 12:01     ` Stefano Stabellini
  0 siblings, 0 replies; 7+ messages in thread
From: Stefano Stabellini @ 2015-01-28 12:01 UTC (permalink / raw)
  To: Greg KH
  Cc: Stefano Stabellini, stable, linux-kernel, Konrad Rzeszutek Wilk,
	David Vrabel, xen-devel, catalin.marinas, Ian Campbell

On Tue, 27 Jan 2015, Greg KH wrote:
> On Mon, Jan 12, 2015 at 06:09:33PM +0000, Stefano Stabellini wrote:
> > Hi all,
> > I would like to request a backport of the following commit:
> > 
> > 
> > commit a4dba130891271084344c12537731542ec77cb85
> > Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Date:   Fri Nov 21 11:07:39 2014 +0000
> > 
> >     xen/arm/arm64: introduce xen_arch_need_swiotlb
> > 
> > 
> > to stable trees from 3.16 onward (3.16 included).
> > 
> > 
> > The commit needs to be slightly modified because is_device_dma_coherent
> > is not available on kernels < 3.19, so I just removed the call,
> > thus assuming that the device is not coherent on arm (slower but safe):
> 
> A diff of a diff is hard to apply, please send the reworked patch in a
> format that I can apply it in.
 
The full patch was just below, in the original email.
Also appended here, for convenience.


---

xen/arm/arm64: introduce xen_arch_need_swiotlb

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

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>

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 b0e77de..f8a576b 100644
--- a/arch/arm/xen/mm.c
+++ b/arch/arm/xen/mm.c
@@ -16,6 +16,13 @@
 #include <asm/xen/hypercall.h>
 #include <asm/xen/interface.h>
 
+bool xen_arch_need_swiotlb(struct device *dev,
+			   unsigned long pfn,
+			   unsigned long mfn)
+{
+	return (pfn != mfn);
+}
+
 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 ebd8f21..ac5d41b 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,

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: backport a4dba130891271084344c12537731542ec77cb85 to 3.16+
@ 2015-01-28 12:01     ` Stefano Stabellini
  0 siblings, 0 replies; 7+ messages in thread
From: Stefano Stabellini @ 2015-01-28 12:01 UTC (permalink / raw)
  To: Greg KH
  Cc: xen-devel, Ian Campbell, catalin.marinas, Stefano Stabellini,
	linux-kernel, stable, David Vrabel

On Tue, 27 Jan 2015, Greg KH wrote:
> On Mon, Jan 12, 2015 at 06:09:33PM +0000, Stefano Stabellini wrote:
> > Hi all,
> > I would like to request a backport of the following commit:
> > 
> > 
> > commit a4dba130891271084344c12537731542ec77cb85
> > Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Date:   Fri Nov 21 11:07:39 2014 +0000
> > 
> >     xen/arm/arm64: introduce xen_arch_need_swiotlb
> > 
> > 
> > to stable trees from 3.16 onward (3.16 included).
> > 
> > 
> > The commit needs to be slightly modified because is_device_dma_coherent
> > is not available on kernels < 3.19, so I just removed the call,
> > thus assuming that the device is not coherent on arm (slower but safe):
> 
> A diff of a diff is hard to apply, please send the reworked patch in a
> format that I can apply it in.
 
The full patch was just below, in the original email.
Also appended here, for convenience.


---

xen/arm/arm64: introduce xen_arch_need_swiotlb

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

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>

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 b0e77de..f8a576b 100644
--- a/arch/arm/xen/mm.c
+++ b/arch/arm/xen/mm.c
@@ -16,6 +16,13 @@
 #include <asm/xen/hypercall.h>
 #include <asm/xen/interface.h>
 
+bool xen_arch_need_swiotlb(struct device *dev,
+			   unsigned long pfn,
+			   unsigned long mfn)
+{
+	return (pfn != mfn);
+}
+
 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 ebd8f21..ac5d41b 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,

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-01-28 20:44 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-12 18:09 backport a4dba130891271084344c12537731542ec77cb85 to 3.16+ Stefano Stabellini
2015-01-12 18:09 ` Stefano Stabellini
2015-01-15 11:04 ` Luis Henriques
2015-01-15 11:04   ` Luis Henriques
2015-01-28  0:10 ` Greg KH
2015-01-28 12:01   ` Stefano Stabellini
2015-01-28 12:01     ` Stefano Stabellini

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.