Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1623355 > unrolled thread

[PATCH 1/2] xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

Started byStefano Stabellini <sstabellini@kernel.org>
First post2017-04-13 23:10 +0200
Last post2017-04-24 21:20 +0200
Articles 6 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/2] xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..." Stefano Stabellini <sstabellini@kernel.org> - 2017-04-13 23:10 +0200
    Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18  "Consolidate get_dma_ops..." Catalin Marinas <catalin.marinas@arm.com> - 2017-04-18 16:30 +0200
      Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18  "Consolidate get_dma_ops..." Stefano Stabellini <sstabellini@kernel.org> - 2017-04-19 19:30 +0200
        Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18  "Consolidate get_dma_ops..." Juergen Gross <jgross@suse.com> - 2017-04-19 20:30 +0200
          Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18  "Consolidate get_dma_ops..." Stefano Stabellini <sstabellini@kernel.org> - 2017-04-19 20:40 +0200
        Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18  "Consolidate get_dma_ops..." Stefano Stabellini <sstabellini@kernel.org> - 2017-04-24 21:20 +0200

#1623355 — [PATCH 1/2] xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromStefano Stabellini <sstabellini@kernel.org>
Date2017-04-13 23:10 +0200
Subject[PATCH 1/2] xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<tvUa6-b9-9@gated-at.bofh.it>
The following commit:

  commit 815dd18788fe0d41899f51b91d0560279cf16b0d
  Author: Bart Van Assche <bart.vanassche@sandisk.com>
  Date:   Fri Jan 20 13:04:04 2017 -0800

      treewide: Consolidate get_dma_ops() implementations

rearranges get_dma_ops in a way that xen_dma_ops are not returned when
running on Xen anymore, dev->dma_ops is returned instead (see
arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
include/linux/dma-mapping.h:get_dma_ops).

Fix the problem by storing dev->dma_ops in dev_archdata, and setting
dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
dev_archdata when needed. It also allows us to remove __generic_dma_ops
from common headers.

Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
Tested-by: Julien Grall <julien.grall@arm.com>
Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
CC: linux@armlinux.org.uk
CC: catalin.marinas@arm.com
CC: will.deacon@arm.com
CC: boris.ostrovsky@oracle.com
CC: jgross@suse.com
CC: Julien Grall <julien.grall@arm.com>
---
 arch/arm/include/asm/device.h        |  3 +++
 arch/arm/include/asm/dma-mapping.h   | 12 +-----------
 arch/arm/mm/dma-mapping.c            |  7 +++++++
 arch/arm64/include/asm/device.h      |  3 +++
 arch/arm64/include/asm/dma-mapping.h | 13 +------------
 arch/arm64/mm/dma-mapping.c          |  7 +++++++
 include/xen/arm/page-coherent.h      |  8 ++++++++
 7 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h
index 220ba20..36ec9c8 100644
--- a/arch/arm/include/asm/device.h
+++ b/arch/arm/include/asm/device.h
@@ -16,6 +16,9 @@ struct dev_archdata {
 #ifdef CONFIG_ARM_DMA_USE_IOMMU
 	struct dma_iommu_mapping	*mapping;
 #endif
+#ifdef CONFIG_XEN
+	const struct dma_map_ops *dev_dma_ops;
+#endif
 	bool dma_coherent;
 };
 
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
index 7166569..680d3f3 100644
--- a/arch/arm/include/asm/dma-mapping.h
+++ b/arch/arm/include/asm/dma-mapping.h
@@ -16,19 +16,9 @@
 extern const struct dma_map_ops arm_dma_ops;
 extern const struct dma_map_ops arm_coherent_dma_ops;
 
-static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
-{
-	if (dev && dev->dma_ops)
-		return dev->dma_ops;
-	return &arm_dma_ops;
-}
-
 static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
 {
-	if (xen_initial_domain())
-		return xen_dma_ops;
-	else
-		return __generic_dma_ops(NULL);
+	return &arm_dma_ops;
 }
 
 #define HAVE_ARCH_DMA_SUPPORTED 1
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 63eabb0..a614459 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -2396,6 +2396,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
 		dma_ops = arm_get_dma_map_ops(coherent);
 
 	set_dma_ops(dev, dma_ops);
+
+#ifdef CONFIG_XEN
+	if (xen_initial_domain()) {
+		dev->archdata.dev_dma_ops = dev->dma_ops;
+		dev->dma_ops = xen_dma_ops;
+	}
+#endif
 }
 
 void arch_teardown_dma_ops(struct device *dev)
diff --git a/arch/arm64/include/asm/device.h b/arch/arm64/include/asm/device.h
index 73d5bab..5a5fa47 100644
--- a/arch/arm64/include/asm/device.h
+++ b/arch/arm64/include/asm/device.h
@@ -20,6 +20,9 @@ struct dev_archdata {
 #ifdef CONFIG_IOMMU_API
 	void *iommu;			/* private IOMMU data */
 #endif
+#ifdef CONFIG_XEN
+	const struct dma_map_ops *dev_dma_ops;
+#endif
 	bool dma_coherent;
 };
 
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
index 505756c..5392dbe 100644
--- a/arch/arm64/include/asm/dma-mapping.h
+++ b/arch/arm64/include/asm/dma-mapping.h
@@ -27,11 +27,8 @@
 #define DMA_ERROR_CODE	(~(dma_addr_t)0)
 extern const struct dma_map_ops dummy_dma_ops;
 
-static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
+static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
 {
-	if (dev && dev->dma_ops)
-		return dev->dma_ops;
-
 	/*
 	 * We expect no ISA devices, and all other DMA masters are expected to
 	 * have someone call arch_setup_dma_ops at device creation time.
@@ -39,14 +36,6 @@ static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
 	return &dummy_dma_ops;
 }
 
-static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
-{
-	if (xen_initial_domain())
-		return xen_dma_ops;
-	else
-		return __generic_dma_ops(NULL);
-}
-
 void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
 			const struct iommu_ops *iommu, bool coherent);
 #define arch_setup_dma_ops	arch_setup_dma_ops
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 81cdb2e..7f8b37e 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
 
 	dev->archdata.dma_coherent = coherent;
 	__iommu_setup_dma_ops(dev, dma_base, size, iommu);
+
+#ifdef CONFIG_XEN
+	if (xen_initial_domain()) {
+		dev->archdata.dev_dma_ops = dev->dma_ops;
+		dev->dma_ops = xen_dma_ops;
+	}
+#endif
 }
diff --git a/include/xen/arm/page-coherent.h b/include/xen/arm/page-coherent.h
index 95ce6ac..b0a2bfc 100644
--- a/include/xen/arm/page-coherent.h
+++ b/include/xen/arm/page-coherent.h
@@ -2,8 +2,16 @@
 #define _ASM_ARM_XEN_PAGE_COHERENT_H
 
 #include <asm/page.h>
+#include <asm/dma-mapping.h>
 #include <linux/dma-mapping.h>
 
+static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
+{
+	if (dev && dev->archdata.dev_dma_ops)
+		return dev->archdata.dev_dma_ops;
+	return get_arch_dma_ops(NULL);
+}
+
 void __xen_dma_map_page(struct device *hwdev, struct page *page,
 	     dma_addr_t dev_addr, unsigned long offset, size_t size,
 	     enum dma_data_direction dir, unsigned long attrs);
-- 
1.9.1

[toc] | [next] | [standalone]


#1625359 — Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromCatalin Marinas <catalin.marinas@arm.com>
Date2017-04-18 16:30 +0200
SubjectRe: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<txCiK-7dQ-13@gated-at.bofh.it>
In reply to#1623355
On Thu, Apr 13, 2017 at 02:04:21PM -0700, Stefano Stabellini wrote:
> The following commit:
> 
>   commit 815dd18788fe0d41899f51b91d0560279cf16b0d
>   Author: Bart Van Assche <bart.vanassche@sandisk.com>
>   Date:   Fri Jan 20 13:04:04 2017 -0800
> 
>       treewide: Consolidate get_dma_ops() implementations
> 
> rearranges get_dma_ops in a way that xen_dma_ops are not returned when
> running on Xen anymore, dev->dma_ops is returned instead (see
> arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
> include/linux/dma-mapping.h:get_dma_ops).
> 
> Fix the problem by storing dev->dma_ops in dev_archdata, and setting
> dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
> by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
> dev_archdata when needed. It also allows us to remove __generic_dma_ops
> from common headers.
> 
> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
> Tested-by: Julien Grall <julien.grall@arm.com>
> Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
> CC: linux@armlinux.org.uk
> CC: catalin.marinas@arm.com
> CC: will.deacon@arm.com
> CC: boris.ostrovsky@oracle.com
> CC: jgross@suse.com
> CC: Julien Grall <julien.grall@arm.com>

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

[toc] | [prev] | [next] | [standalone]


#1626628 — Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromStefano Stabellini <sstabellini@kernel.org>
Date2017-04-19 19:30 +0200
SubjectRe: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<ty1At-6ev-13@gated-at.bofh.it>
In reply to#1625359
Hello Russell,

Can I have your acked-by on the following fix (original patch is
1492117462-19886-1-git-send-email-sstabellini@kernel.org)?

Thanks,

Stefano


On Tue, 18 Apr 2017, Catalin Marinas wrote:
> On Thu, Apr 13, 2017 at 02:04:21PM -0700, Stefano Stabellini wrote:
> > The following commit:
> > 
> >   commit 815dd18788fe0d41899f51b91d0560279cf16b0d
> >   Author: Bart Van Assche <bart.vanassche@sandisk.com>
> >   Date:   Fri Jan 20 13:04:04 2017 -0800
> > 
> >       treewide: Consolidate get_dma_ops() implementations
> > 
> > rearranges get_dma_ops in a way that xen_dma_ops are not returned when
> > running on Xen anymore, dev->dma_ops is returned instead (see
> > arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
> > include/linux/dma-mapping.h:get_dma_ops).
> > 
> > Fix the problem by storing dev->dma_ops in dev_archdata, and setting
> > dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
> > by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
> > dev_archdata when needed. It also allows us to remove __generic_dma_ops
> > from common headers.
> > 
> > Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
> > Tested-by: Julien Grall <julien.grall@arm.com>
> > Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
> > CC: linux@armlinux.org.uk
> > CC: catalin.marinas@arm.com
> > CC: will.deacon@arm.com
> > CC: boris.ostrovsky@oracle.com
> > CC: jgross@suse.com
> > CC: Julien Grall <julien.grall@arm.com>
> 
> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> 
> 
> > diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h
> > index 220ba20..36ec9c8 100644
> > --- a/arch/arm/include/asm/device.h
> > +++ b/arch/arm/include/asm/device.h
> > @@ -16,6 +16,9 @@ struct dev_archdata {
> >  #ifdef CONFIG_ARM_DMA_USE_IOMMU
> >  	struct dma_iommu_mapping	*mapping;
> >  #endif
> > +#ifdef CONFIG_XEN
> > +	const struct dma_map_ops *dev_dma_ops;
> > +#endif
> >  	bool dma_coherent;
> >  };
> >  
> > diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
> > index 7166569..680d3f3 100644
> > --- a/arch/arm/include/asm/dma-mapping.h
> > +++ b/arch/arm/include/asm/dma-mapping.h
> > @@ -16,19 +16,9 @@
> >  extern const struct dma_map_ops arm_dma_ops;
> >  extern const struct dma_map_ops arm_coherent_dma_ops;
> >  
> > -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > -{
> > -	if (dev && dev->dma_ops)
> > -		return dev->dma_ops;
> > -	return &arm_dma_ops;
> > -}
> > -
> >  static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> >  {
> > -	if (xen_initial_domain())
> > -		return xen_dma_ops;
> > -	else
> > -		return __generic_dma_ops(NULL);
> > +	return &arm_dma_ops;
> >  }
> >  
> >  #define HAVE_ARCH_DMA_SUPPORTED 1
> > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> > index 63eabb0..a614459 100644
> > --- a/arch/arm/mm/dma-mapping.c
> > +++ b/arch/arm/mm/dma-mapping.c
> > @@ -2396,6 +2396,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >  		dma_ops = arm_get_dma_map_ops(coherent);
> >  
> >  	set_dma_ops(dev, dma_ops);
> > +
> > +#ifdef CONFIG_XEN
> > +	if (xen_initial_domain()) {
> > +		dev->archdata.dev_dma_ops = dev->dma_ops;
> > +		dev->dma_ops = xen_dma_ops;
> > +	}
> > +#endif
> >  }
> >  
> >  void arch_teardown_dma_ops(struct device *dev)
> > diff --git a/arch/arm64/include/asm/device.h b/arch/arm64/include/asm/device.h
> > index 73d5bab..5a5fa47 100644
> > --- a/arch/arm64/include/asm/device.h
> > +++ b/arch/arm64/include/asm/device.h
> > @@ -20,6 +20,9 @@ struct dev_archdata {
> >  #ifdef CONFIG_IOMMU_API
> >  	void *iommu;			/* private IOMMU data */
> >  #endif
> > +#ifdef CONFIG_XEN
> > +	const struct dma_map_ops *dev_dma_ops;
> > +#endif
> >  	bool dma_coherent;
> >  };
> >  
> > diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
> > index 505756c..5392dbe 100644
> > --- a/arch/arm64/include/asm/dma-mapping.h
> > +++ b/arch/arm64/include/asm/dma-mapping.h
> > @@ -27,11 +27,8 @@
> >  #define DMA_ERROR_CODE	(~(dma_addr_t)0)
> >  extern const struct dma_map_ops dummy_dma_ops;
> >  
> > -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > +static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> >  {
> > -	if (dev && dev->dma_ops)
> > -		return dev->dma_ops;
> > -
> >  	/*
> >  	 * We expect no ISA devices, and all other DMA masters are expected to
> >  	 * have someone call arch_setup_dma_ops at device creation time.
> > @@ -39,14 +36,6 @@ static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >  	return &dummy_dma_ops;
> >  }
> >  
> > -static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> > -{
> > -	if (xen_initial_domain())
> > -		return xen_dma_ops;
> > -	else
> > -		return __generic_dma_ops(NULL);
> > -}
> > -
> >  void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >  			const struct iommu_ops *iommu, bool coherent);
> >  #define arch_setup_dma_ops	arch_setup_dma_ops
> > diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> > index 81cdb2e..7f8b37e 100644
> > --- a/arch/arm64/mm/dma-mapping.c
> > +++ b/arch/arm64/mm/dma-mapping.c
> > @@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >  
> >  	dev->archdata.dma_coherent = coherent;
> >  	__iommu_setup_dma_ops(dev, dma_base, size, iommu);
> > +
> > +#ifdef CONFIG_XEN
> > +	if (xen_initial_domain()) {
> > +		dev->archdata.dev_dma_ops = dev->dma_ops;
> > +		dev->dma_ops = xen_dma_ops;
> > +	}
> > +#endif
> >  }
> > diff --git a/include/xen/arm/page-coherent.h b/include/xen/arm/page-coherent.h
> > index 95ce6ac..b0a2bfc 100644
> > --- a/include/xen/arm/page-coherent.h
> > +++ b/include/xen/arm/page-coherent.h
> > @@ -2,8 +2,16 @@
> >  #define _ASM_ARM_XEN_PAGE_COHERENT_H
> >  
> >  #include <asm/page.h>
> > +#include <asm/dma-mapping.h>
> >  #include <linux/dma-mapping.h>
> >  
> > +static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > +{
> > +	if (dev && dev->archdata.dev_dma_ops)
> > +		return dev->archdata.dev_dma_ops;
> > +	return get_arch_dma_ops(NULL);
> > +}
> > +
> >  void __xen_dma_map_page(struct device *hwdev, struct page *page,
> >  	     dma_addr_t dev_addr, unsigned long offset, size_t size,
> >  	     enum dma_data_direction dir, unsigned long attrs);

[toc] | [prev] | [next] | [standalone]


#1626680 — Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromJuergen Gross <jgross@suse.com>
Date2017-04-19 20:30 +0200
SubjectRe: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<ty2wy-6N4-7@gated-at.bofh.it>
In reply to#1626628
On 19/04/17 19:25, Stefano Stabellini wrote:
> Hello Russell,
> 
> Can I have your acked-by on the following fix (original patch is
> 1492117462-19886-1-git-send-email-sstabellini@kernel.org)?

Stefano, through which tree should this go? ARM or Xen or other?


Juergen

> 
> Thanks,
> 
> Stefano
> 
> 
> On Tue, 18 Apr 2017, Catalin Marinas wrote:
>> On Thu, Apr 13, 2017 at 02:04:21PM -0700, Stefano Stabellini wrote:
>>> The following commit:
>>>
>>>   commit 815dd18788fe0d41899f51b91d0560279cf16b0d
>>>   Author: Bart Van Assche <bart.vanassche@sandisk.com>
>>>   Date:   Fri Jan 20 13:04:04 2017 -0800
>>>
>>>       treewide: Consolidate get_dma_ops() implementations
>>>
>>> rearranges get_dma_ops in a way that xen_dma_ops are not returned when
>>> running on Xen anymore, dev->dma_ops is returned instead (see
>>> arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
>>> include/linux/dma-mapping.h:get_dma_ops).
>>>
>>> Fix the problem by storing dev->dma_ops in dev_archdata, and setting
>>> dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
>>> by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
>>> dev_archdata when needed. It also allows us to remove __generic_dma_ops
>>> from common headers.
>>>
>>> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
>>> Tested-by: Julien Grall <julien.grall@arm.com>
>>> Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
>>> CC: linux@armlinux.org.uk
>>> CC: catalin.marinas@arm.com
>>> CC: will.deacon@arm.com
>>> CC: boris.ostrovsky@oracle.com
>>> CC: jgross@suse.com
>>> CC: Julien Grall <julien.grall@arm.com>
>>
>> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
>>
>>
>>> diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h
>>> index 220ba20..36ec9c8 100644
>>> --- a/arch/arm/include/asm/device.h
>>> +++ b/arch/arm/include/asm/device.h
>>> @@ -16,6 +16,9 @@ struct dev_archdata {
>>>  #ifdef CONFIG_ARM_DMA_USE_IOMMU
>>>  	struct dma_iommu_mapping	*mapping;
>>>  #endif
>>> +#ifdef CONFIG_XEN
>>> +	const struct dma_map_ops *dev_dma_ops;
>>> +#endif
>>>  	bool dma_coherent;
>>>  };
>>>  
>>> diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
>>> index 7166569..680d3f3 100644
>>> --- a/arch/arm/include/asm/dma-mapping.h
>>> +++ b/arch/arm/include/asm/dma-mapping.h
>>> @@ -16,19 +16,9 @@
>>>  extern const struct dma_map_ops arm_dma_ops;
>>>  extern const struct dma_map_ops arm_coherent_dma_ops;
>>>  
>>> -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
>>> -{
>>> -	if (dev && dev->dma_ops)
>>> -		return dev->dma_ops;
>>> -	return &arm_dma_ops;
>>> -}
>>> -
>>>  static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
>>>  {
>>> -	if (xen_initial_domain())
>>> -		return xen_dma_ops;
>>> -	else
>>> -		return __generic_dma_ops(NULL);
>>> +	return &arm_dma_ops;
>>>  }
>>>  
>>>  #define HAVE_ARCH_DMA_SUPPORTED 1
>>> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
>>> index 63eabb0..a614459 100644
>>> --- a/arch/arm/mm/dma-mapping.c
>>> +++ b/arch/arm/mm/dma-mapping.c
>>> @@ -2396,6 +2396,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
>>>  		dma_ops = arm_get_dma_map_ops(coherent);
>>>  
>>>  	set_dma_ops(dev, dma_ops);
>>> +
>>> +#ifdef CONFIG_XEN
>>> +	if (xen_initial_domain()) {
>>> +		dev->archdata.dev_dma_ops = dev->dma_ops;
>>> +		dev->dma_ops = xen_dma_ops;
>>> +	}
>>> +#endif
>>>  }
>>>  
>>>  void arch_teardown_dma_ops(struct device *dev)
>>> diff --git a/arch/arm64/include/asm/device.h b/arch/arm64/include/asm/device.h
>>> index 73d5bab..5a5fa47 100644
>>> --- a/arch/arm64/include/asm/device.h
>>> +++ b/arch/arm64/include/asm/device.h
>>> @@ -20,6 +20,9 @@ struct dev_archdata {
>>>  #ifdef CONFIG_IOMMU_API
>>>  	void *iommu;			/* private IOMMU data */
>>>  #endif
>>> +#ifdef CONFIG_XEN
>>> +	const struct dma_map_ops *dev_dma_ops;
>>> +#endif
>>>  	bool dma_coherent;
>>>  };
>>>  
>>> diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
>>> index 505756c..5392dbe 100644
>>> --- a/arch/arm64/include/asm/dma-mapping.h
>>> +++ b/arch/arm64/include/asm/dma-mapping.h
>>> @@ -27,11 +27,8 @@
>>>  #define DMA_ERROR_CODE	(~(dma_addr_t)0)
>>>  extern const struct dma_map_ops dummy_dma_ops;
>>>  
>>> -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
>>> +static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
>>>  {
>>> -	if (dev && dev->dma_ops)
>>> -		return dev->dma_ops;
>>> -
>>>  	/*
>>>  	 * We expect no ISA devices, and all other DMA masters are expected to
>>>  	 * have someone call arch_setup_dma_ops at device creation time.
>>> @@ -39,14 +36,6 @@ static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
>>>  	return &dummy_dma_ops;
>>>  }
>>>  
>>> -static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
>>> -{
>>> -	if (xen_initial_domain())
>>> -		return xen_dma_ops;
>>> -	else
>>> -		return __generic_dma_ops(NULL);
>>> -}
>>> -
>>>  void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
>>>  			const struct iommu_ops *iommu, bool coherent);
>>>  #define arch_setup_dma_ops	arch_setup_dma_ops
>>> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
>>> index 81cdb2e..7f8b37e 100644
>>> --- a/arch/arm64/mm/dma-mapping.c
>>> +++ b/arch/arm64/mm/dma-mapping.c
>>> @@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
>>>  
>>>  	dev->archdata.dma_coherent = coherent;
>>>  	__iommu_setup_dma_ops(dev, dma_base, size, iommu);
>>> +
>>> +#ifdef CONFIG_XEN
>>> +	if (xen_initial_domain()) {
>>> +		dev->archdata.dev_dma_ops = dev->dma_ops;
>>> +		dev->dma_ops = xen_dma_ops;
>>> +	}
>>> +#endif
>>>  }
>>> diff --git a/include/xen/arm/page-coherent.h b/include/xen/arm/page-coherent.h
>>> index 95ce6ac..b0a2bfc 100644
>>> --- a/include/xen/arm/page-coherent.h
>>> +++ b/include/xen/arm/page-coherent.h
>>> @@ -2,8 +2,16 @@
>>>  #define _ASM_ARM_XEN_PAGE_COHERENT_H
>>>  
>>>  #include <asm/page.h>
>>> +#include <asm/dma-mapping.h>
>>>  #include <linux/dma-mapping.h>
>>>  
>>> +static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
>>> +{
>>> +	if (dev && dev->archdata.dev_dma_ops)
>>> +		return dev->archdata.dev_dma_ops;
>>> +	return get_arch_dma_ops(NULL);
>>> +}
>>> +
>>>  void __xen_dma_map_page(struct device *hwdev, struct page *page,
>>>  	     dma_addr_t dev_addr, unsigned long offset, size_t size,
>>>  	     enum dma_data_direction dir, unsigned long attrs);
> 

[toc] | [prev] | [next] | [standalone]


#1626694 — Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromStefano Stabellini <sstabellini@kernel.org>
Date2017-04-19 20:40 +0200
SubjectRe: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<ty2Gf-6Qx-61@gated-at.bofh.it>
In reply to#1626680
On Wed, 19 Apr 2017, Juergen Gross wrote:
> On 19/04/17 19:25, Stefano Stabellini wrote:
> > Hello Russell,
> > 
> > Can I have your acked-by on the following fix (original patch is
> > 1492117462-19886-1-git-send-email-sstabellini@kernel.org)?
> 
> Stefano, through which tree should this go? ARM or Xen or other?

I think it could go via the Xen tree, but we still need an ack from the
ARM maintainer for changes to code under arch/arm.

 
> Juergen
> 
> > 
> > Thanks,
> > 
> > Stefano
> > 
> > 
> > On Tue, 18 Apr 2017, Catalin Marinas wrote:
> >> On Thu, Apr 13, 2017 at 02:04:21PM -0700, Stefano Stabellini wrote:
> >>> The following commit:
> >>>
> >>>   commit 815dd18788fe0d41899f51b91d0560279cf16b0d
> >>>   Author: Bart Van Assche <bart.vanassche@sandisk.com>
> >>>   Date:   Fri Jan 20 13:04:04 2017 -0800
> >>>
> >>>       treewide: Consolidate get_dma_ops() implementations
> >>>
> >>> rearranges get_dma_ops in a way that xen_dma_ops are not returned when
> >>> running on Xen anymore, dev->dma_ops is returned instead (see
> >>> arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
> >>> include/linux/dma-mapping.h:get_dma_ops).
> >>>
> >>> Fix the problem by storing dev->dma_ops in dev_archdata, and setting
> >>> dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
> >>> by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
> >>> dev_archdata when needed. It also allows us to remove __generic_dma_ops
> >>> from common headers.
> >>>
> >>> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
> >>> Tested-by: Julien Grall <julien.grall@arm.com>
> >>> Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
> >>> CC: linux@armlinux.org.uk
> >>> CC: catalin.marinas@arm.com
> >>> CC: will.deacon@arm.com
> >>> CC: boris.ostrovsky@oracle.com
> >>> CC: jgross@suse.com
> >>> CC: Julien Grall <julien.grall@arm.com>
> >>
> >> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> >>
> >>
> >>> diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h
> >>> index 220ba20..36ec9c8 100644
> >>> --- a/arch/arm/include/asm/device.h
> >>> +++ b/arch/arm/include/asm/device.h
> >>> @@ -16,6 +16,9 @@ struct dev_archdata {
> >>>  #ifdef CONFIG_ARM_DMA_USE_IOMMU
> >>>  	struct dma_iommu_mapping	*mapping;
> >>>  #endif
> >>> +#ifdef CONFIG_XEN
> >>> +	const struct dma_map_ops *dev_dma_ops;
> >>> +#endif
> >>>  	bool dma_coherent;
> >>>  };
> >>>  
> >>> diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
> >>> index 7166569..680d3f3 100644
> >>> --- a/arch/arm/include/asm/dma-mapping.h
> >>> +++ b/arch/arm/include/asm/dma-mapping.h
> >>> @@ -16,19 +16,9 @@
> >>>  extern const struct dma_map_ops arm_dma_ops;
> >>>  extern const struct dma_map_ops arm_coherent_dma_ops;
> >>>  
> >>> -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >>> -{
> >>> -	if (dev && dev->dma_ops)
> >>> -		return dev->dma_ops;
> >>> -	return &arm_dma_ops;
> >>> -}
> >>> -
> >>>  static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> >>>  {
> >>> -	if (xen_initial_domain())
> >>> -		return xen_dma_ops;
> >>> -	else
> >>> -		return __generic_dma_ops(NULL);
> >>> +	return &arm_dma_ops;
> >>>  }
> >>>  
> >>>  #define HAVE_ARCH_DMA_SUPPORTED 1
> >>> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> >>> index 63eabb0..a614459 100644
> >>> --- a/arch/arm/mm/dma-mapping.c
> >>> +++ b/arch/arm/mm/dma-mapping.c
> >>> @@ -2396,6 +2396,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >>>  		dma_ops = arm_get_dma_map_ops(coherent);
> >>>  
> >>>  	set_dma_ops(dev, dma_ops);
> >>> +
> >>> +#ifdef CONFIG_XEN
> >>> +	if (xen_initial_domain()) {
> >>> +		dev->archdata.dev_dma_ops = dev->dma_ops;
> >>> +		dev->dma_ops = xen_dma_ops;
> >>> +	}
> >>> +#endif
> >>>  }
> >>>  
> >>>  void arch_teardown_dma_ops(struct device *dev)
> >>> diff --git a/arch/arm64/include/asm/device.h b/arch/arm64/include/asm/device.h
> >>> index 73d5bab..5a5fa47 100644
> >>> --- a/arch/arm64/include/asm/device.h
> >>> +++ b/arch/arm64/include/asm/device.h
> >>> @@ -20,6 +20,9 @@ struct dev_archdata {
> >>>  #ifdef CONFIG_IOMMU_API
> >>>  	void *iommu;			/* private IOMMU data */
> >>>  #endif
> >>> +#ifdef CONFIG_XEN
> >>> +	const struct dma_map_ops *dev_dma_ops;
> >>> +#endif
> >>>  	bool dma_coherent;
> >>>  };
> >>>  
> >>> diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
> >>> index 505756c..5392dbe 100644
> >>> --- a/arch/arm64/include/asm/dma-mapping.h
> >>> +++ b/arch/arm64/include/asm/dma-mapping.h
> >>> @@ -27,11 +27,8 @@
> >>>  #define DMA_ERROR_CODE	(~(dma_addr_t)0)
> >>>  extern const struct dma_map_ops dummy_dma_ops;
> >>>  
> >>> -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >>> +static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> >>>  {
> >>> -	if (dev && dev->dma_ops)
> >>> -		return dev->dma_ops;
> >>> -
> >>>  	/*
> >>>  	 * We expect no ISA devices, and all other DMA masters are expected to
> >>>  	 * have someone call arch_setup_dma_ops at device creation time.
> >>> @@ -39,14 +36,6 @@ static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >>>  	return &dummy_dma_ops;
> >>>  }
> >>>  
> >>> -static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> >>> -{
> >>> -	if (xen_initial_domain())
> >>> -		return xen_dma_ops;
> >>> -	else
> >>> -		return __generic_dma_ops(NULL);
> >>> -}
> >>> -
> >>>  void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >>>  			const struct iommu_ops *iommu, bool coherent);
> >>>  #define arch_setup_dma_ops	arch_setup_dma_ops
> >>> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> >>> index 81cdb2e..7f8b37e 100644
> >>> --- a/arch/arm64/mm/dma-mapping.c
> >>> +++ b/arch/arm64/mm/dma-mapping.c
> >>> @@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> >>>  
> >>>  	dev->archdata.dma_coherent = coherent;
> >>>  	__iommu_setup_dma_ops(dev, dma_base, size, iommu);
> >>> +
> >>> +#ifdef CONFIG_XEN
> >>> +	if (xen_initial_domain()) {
> >>> +		dev->archdata.dev_dma_ops = dev->dma_ops;
> >>> +		dev->dma_ops = xen_dma_ops;
> >>> +	}
> >>> +#endif
> >>>  }
> >>> diff --git a/include/xen/arm/page-coherent.h b/include/xen/arm/page-coherent.h
> >>> index 95ce6ac..b0a2bfc 100644
> >>> --- a/include/xen/arm/page-coherent.h
> >>> +++ b/include/xen/arm/page-coherent.h
> >>> @@ -2,8 +2,16 @@
> >>>  #define _ASM_ARM_XEN_PAGE_COHERENT_H
> >>>  
> >>>  #include <asm/page.h>
> >>> +#include <asm/dma-mapping.h>
> >>>  #include <linux/dma-mapping.h>
> >>>  
> >>> +static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >>> +{
> >>> +	if (dev && dev->archdata.dev_dma_ops)
> >>> +		return dev->archdata.dev_dma_ops;
> >>> +	return get_arch_dma_ops(NULL);
> >>> +}
> >>> +
> >>>  void __xen_dma_map_page(struct device *hwdev, struct page *page,
> >>>  	     dma_addr_t dev_addr, unsigned long offset, size_t size,
> >>>  	     enum dma_data_direction dir, unsigned long attrs);
> > 
> 

[toc] | [prev] | [next] | [standalone]


#1629902 — Re: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."

FromStefano Stabellini <sstabellini@kernel.org>
Date2017-04-24 21:20 +0200
SubjectRe: [PATCH 1/2] xen/arm, arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
Message-ID<tzRGF-2y4-7@gated-at.bofh.it>
In reply to#1626628
Hi Russell,

Given the outstanding regression we need to fix as soon as possible,
I'll queue these patches on the xentip tree for 4.12.

Please shout if you disagree.

Thank you.

- Stefano


On Wed, 19 Apr 2017, Stefano Stabellini wrote:
> Hello Russell,
> 
> Can I have your acked-by on the following fix (original patch is
> 1492117462-19886-1-git-send-email-sstabellini@kernel.org)?
> 
> Thanks,
> 
> Stefano
> 
> 
> On Tue, 18 Apr 2017, Catalin Marinas wrote:
> > On Thu, Apr 13, 2017 at 02:04:21PM -0700, Stefano Stabellini wrote:
> > > The following commit:
> > > 
> > >   commit 815dd18788fe0d41899f51b91d0560279cf16b0d
> > >   Author: Bart Van Assche <bart.vanassche@sandisk.com>
> > >   Date:   Fri Jan 20 13:04:04 2017 -0800
> > > 
> > >       treewide: Consolidate get_dma_ops() implementations
> > > 
> > > rearranges get_dma_ops in a way that xen_dma_ops are not returned when
> > > running on Xen anymore, dev->dma_ops is returned instead (see
> > > arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and
> > > include/linux/dma-mapping.h:get_dma_ops).
> > > 
> > > Fix the problem by storing dev->dma_ops in dev_archdata, and setting
> > > dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally
> > > by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from
> > > dev_archdata when needed. It also allows us to remove __generic_dma_ops
> > > from common headers.
> > > 
> > > Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
> > > Tested-by: Julien Grall <julien.grall@arm.com>
> > > Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
> > > CC: linux@armlinux.org.uk
> > > CC: catalin.marinas@arm.com
> > > CC: will.deacon@arm.com
> > > CC: boris.ostrovsky@oracle.com
> > > CC: jgross@suse.com
> > > CC: Julien Grall <julien.grall@arm.com>
> > 
> > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > 
> > 
> > > diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h
> > > index 220ba20..36ec9c8 100644
> > > --- a/arch/arm/include/asm/device.h
> > > +++ b/arch/arm/include/asm/device.h
> > > @@ -16,6 +16,9 @@ struct dev_archdata {
> > >  #ifdef CONFIG_ARM_DMA_USE_IOMMU
> > >  	struct dma_iommu_mapping	*mapping;
> > >  #endif
> > > +#ifdef CONFIG_XEN
> > > +	const struct dma_map_ops *dev_dma_ops;
> > > +#endif
> > >  	bool dma_coherent;
> > >  };
> > >  
> > > diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
> > > index 7166569..680d3f3 100644
> > > --- a/arch/arm/include/asm/dma-mapping.h
> > > +++ b/arch/arm/include/asm/dma-mapping.h
> > > @@ -16,19 +16,9 @@
> > >  extern const struct dma_map_ops arm_dma_ops;
> > >  extern const struct dma_map_ops arm_coherent_dma_ops;
> > >  
> > > -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > > -{
> > > -	if (dev && dev->dma_ops)
> > > -		return dev->dma_ops;
> > > -	return &arm_dma_ops;
> > > -}
> > > -
> > >  static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> > >  {
> > > -	if (xen_initial_domain())
> > > -		return xen_dma_ops;
> > > -	else
> > > -		return __generic_dma_ops(NULL);
> > > +	return &arm_dma_ops;
> > >  }
> > >  
> > >  #define HAVE_ARCH_DMA_SUPPORTED 1
> > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> > > index 63eabb0..a614459 100644
> > > --- a/arch/arm/mm/dma-mapping.c
> > > +++ b/arch/arm/mm/dma-mapping.c
> > > @@ -2396,6 +2396,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> > >  		dma_ops = arm_get_dma_map_ops(coherent);
> > >  
> > >  	set_dma_ops(dev, dma_ops);
> > > +
> > > +#ifdef CONFIG_XEN
> > > +	if (xen_initial_domain()) {
> > > +		dev->archdata.dev_dma_ops = dev->dma_ops;
> > > +		dev->dma_ops = xen_dma_ops;
> > > +	}
> > > +#endif
> > >  }
> > >  
> > >  void arch_teardown_dma_ops(struct device *dev)
> > > diff --git a/arch/arm64/include/asm/device.h b/arch/arm64/include/asm/device.h
> > > index 73d5bab..5a5fa47 100644
> > > --- a/arch/arm64/include/asm/device.h
> > > +++ b/arch/arm64/include/asm/device.h
> > > @@ -20,6 +20,9 @@ struct dev_archdata {
> > >  #ifdef CONFIG_IOMMU_API
> > >  	void *iommu;			/* private IOMMU data */
> > >  #endif
> > > +#ifdef CONFIG_XEN
> > > +	const struct dma_map_ops *dev_dma_ops;
> > > +#endif
> > >  	bool dma_coherent;
> > >  };
> > >  
> > > diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
> > > index 505756c..5392dbe 100644
> > > --- a/arch/arm64/include/asm/dma-mapping.h
> > > +++ b/arch/arm64/include/asm/dma-mapping.h
> > > @@ -27,11 +27,8 @@
> > >  #define DMA_ERROR_CODE	(~(dma_addr_t)0)
> > >  extern const struct dma_map_ops dummy_dma_ops;
> > >  
> > > -static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > > +static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> > >  {
> > > -	if (dev && dev->dma_ops)
> > > -		return dev->dma_ops;
> > > -
> > >  	/*
> > >  	 * We expect no ISA devices, and all other DMA masters are expected to
> > >  	 * have someone call arch_setup_dma_ops at device creation time.
> > > @@ -39,14 +36,6 @@ static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > >  	return &dummy_dma_ops;
> > >  }
> > >  
> > > -static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> > > -{
> > > -	if (xen_initial_domain())
> > > -		return xen_dma_ops;
> > > -	else
> > > -		return __generic_dma_ops(NULL);
> > > -}
> > > -
> > >  void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> > >  			const struct iommu_ops *iommu, bool coherent);
> > >  #define arch_setup_dma_ops	arch_setup_dma_ops
> > > diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> > > index 81cdb2e..7f8b37e 100644
> > > --- a/arch/arm64/mm/dma-mapping.c
> > > +++ b/arch/arm64/mm/dma-mapping.c
> > > @@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> > >  
> > >  	dev->archdata.dma_coherent = coherent;
> > >  	__iommu_setup_dma_ops(dev, dma_base, size, iommu);
> > > +
> > > +#ifdef CONFIG_XEN
> > > +	if (xen_initial_domain()) {
> > > +		dev->archdata.dev_dma_ops = dev->dma_ops;
> > > +		dev->dma_ops = xen_dma_ops;
> > > +	}
> > > +#endif
> > >  }
> > > diff --git a/include/xen/arm/page-coherent.h b/include/xen/arm/page-coherent.h
> > > index 95ce6ac..b0a2bfc 100644
> > > --- a/include/xen/arm/page-coherent.h
> > > +++ b/include/xen/arm/page-coherent.h
> > > @@ -2,8 +2,16 @@
> > >  #define _ASM_ARM_XEN_PAGE_COHERENT_H
> > >  
> > >  #include <asm/page.h>
> > > +#include <asm/dma-mapping.h>
> > >  #include <linux/dma-mapping.h>
> > >  
> > > +static inline const struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > > +{
> > > +	if (dev && dev->archdata.dev_dma_ops)
> > > +		return dev->archdata.dev_dma_ops;
> > > +	return get_arch_dma_ops(NULL);
> > > +}
> > > +
> > >  void __xen_dma_map_page(struct device *hwdev, struct page *page,
> > >  	     dma_addr_t dev_addr, unsigned long offset, size_t size,
> > >  	     enum dma_data_direction dir, unsigned long attrs);
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web