diff mbox

[v8,08/19] arm/xen: get_dma_ops: return xen_dma_ops if we are running as xen_initial_domain

Message ID 1382031814-8782-8-git-send-email-stefano.stabellini@eu.citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Stefano Stabellini Oct. 17, 2013, 5:43 p.m. UTC
We can't simply override arm_dma_ops with xen_dma_ops because devices
are allowed to have their own dma_ops and they take precedence over
arm_dma_ops. When running on Xen as initial domain, we always want
xen_dma_ops to be the one in use.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
CC: will.deacon@arm.com
CC: linux@arm.linux.org.uk

Changes in v7:
- return xen_dma_ops only if we are the initial domain;
- rename __get_dma_ops to __generic_dma_ops.
---
 arch/arm/include/asm/dma-mapping.h |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

Comments

Stefano Stabellini Oct. 18, 2013, 12:22 p.m. UTC | #1
Russell,
are you OK with this patch?


On Thu, 17 Oct 2013, Stefano Stabellini wrote:
> We can't simply override arm_dma_ops with xen_dma_ops because devices
> are allowed to have their own dma_ops and they take precedence over
> arm_dma_ops. When running on Xen as initial domain, we always want
> xen_dma_ops to be the one in use.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
> CC: will.deacon@arm.com
> CC: linux@arm.linux.org.uk
> 
> Changes in v7:
> - return xen_dma_ops only if we are the initial domain;
> - rename __get_dma_ops to __generic_dma_ops.
> ---
>  arch/arm/include/asm/dma-mapping.h |   13 ++++++++++++-
>  1 files changed, 12 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
> index 01b5a3d..f5945d4 100644
> --- a/arch/arm/include/asm/dma-mapping.h
> +++ b/arch/arm/include/asm/dma-mapping.h
> @@ -12,17 +12,28 @@
>  #include <asm/memory.h>
>  #include <asm/cacheflush.h>
>  
> +#include <xen/xen.h>
> +#include <asm/xen/hypervisor.h>
> +
>  #define DMA_ERROR_CODE	(~0)
>  extern struct dma_map_ops arm_dma_ops;
>  extern struct dma_map_ops arm_coherent_dma_ops;
>  
> -static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> +static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
>  {
>  	if (dev && dev->archdata.dma_ops)
>  		return dev->archdata.dma_ops;
>  	return &arm_dma_ops;
>  }
>  
> +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> +{
> +	if (xen_initial_domain())
> +		return xen_dma_ops;
> +	else
> +		return __generic_dma_ops(dev);
> +}
> +
>  static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)
>  {
>  	BUG_ON(!dev);
> -- 
> 1.7.2.5
>
Russell King - ARM Linux Oct. 18, 2013, 3:42 p.m. UTC | #2
On Fri, Oct 18, 2013 at 01:22:18PM +0100, Stefano Stabellini wrote:
> Russell,
> are you OK with this patch?

Only concern is why the change is soo large.

> > -static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > +static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> >  {
> >  	if (dev && dev->archdata.dma_ops)
> >  		return dev->archdata.dma_ops;
> >  	return &arm_dma_ops;
> >  }
> >  
> > +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > +{
> > +	if (xen_initial_domain())
> > +		return xen_dma_ops;
> > +	else
> > +		return __generic_dma_ops(dev);
> > +}
> > +

What's wrong with:

 static inline struct dma_map_ops *get_dma_ops(struct device *dev)
 {
+	if (xen_initial_domain())
+		return xen_dma_ops;
 	if (dev && dev->archdata.dma_ops)
 		return dev->archdata.dma_ops;
 	return &arm_dma_ops;
 }
Stefano Stabellini Oct. 18, 2013, 3:46 p.m. UTC | #3
On Fri, 18 Oct 2013, Russell King - ARM Linux wrote:
> On Fri, Oct 18, 2013 at 01:22:18PM +0100, Stefano Stabellini wrote:
> > Russell,
> > are you OK with this patch?
> 
> Only concern is why the change is soo large.
> 
> > > -static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > +static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > >  {
> > >  	if (dev && dev->archdata.dma_ops)
> > >  		return dev->archdata.dma_ops;
> > >  	return &arm_dma_ops;
> > >  }
> > >  
> > > +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > +{
> > > +	if (xen_initial_domain())
> > > +		return xen_dma_ops;
> > > +	else
> > > +		return __generic_dma_ops(dev);
> > > +}
> > > +
> 
> What's wrong with:
> 
>  static inline struct dma_map_ops *get_dma_ops(struct device *dev)
>  {
> +	if (xen_initial_domain())
> +		return xen_dma_ops;
>  	if (dev && dev->archdata.dma_ops)
>  		return dev->archdata.dma_ops;
>  	return &arm_dma_ops;
>  }


xen_dma_ops functions might have to call back the native implementation.
With the above there is no way for a xen_dma_ops function to get to
archdata.dma_ops or arm_dma_ops.
This is the reason why this patch introduces __generic_dma_ops.
Russell King - ARM Linux Oct. 18, 2013, 3:48 p.m. UTC | #4
On Fri, Oct 18, 2013 at 04:46:00PM +0100, Stefano Stabellini wrote:
> On Fri, 18 Oct 2013, Russell King - ARM Linux wrote:
> > On Fri, Oct 18, 2013 at 01:22:18PM +0100, Stefano Stabellini wrote:
> > > Russell,
> > > are you OK with this patch?
> > 
> > Only concern is why the change is soo large.
> > 
> > > > -static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > > +static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > > >  {
> > > >  	if (dev && dev->archdata.dma_ops)
> > > >  		return dev->archdata.dma_ops;
> > > >  	return &arm_dma_ops;
> > > >  }
> > > >  
> > > > +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > > +{
> > > > +	if (xen_initial_domain())
> > > > +		return xen_dma_ops;
> > > > +	else
> > > > +		return __generic_dma_ops(dev);
> > > > +}
> > > > +
> > 
> > What's wrong with:
> > 
> >  static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> >  {
> > +	if (xen_initial_domain())
> > +		return xen_dma_ops;
> >  	if (dev && dev->archdata.dma_ops)
> >  		return dev->archdata.dma_ops;
> >  	return &arm_dma_ops;
> >  }
> 
> 
> xen_dma_ops functions might have to call back the native implementation.
> With the above there is no way for a xen_dma_ops function to get to
> archdata.dma_ops or arm_dma_ops.
> This is the reason why this patch introduces __generic_dma_ops.

Ah, that's fine then, but having that described in the commit message
would be useful.

Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>

Thanks.
Stefano Stabellini Oct. 18, 2013, 3:59 p.m. UTC | #5
On Fri, 18 Oct 2013, Russell King - ARM Linux wrote:
> On Fri, Oct 18, 2013 at 04:46:00PM +0100, Stefano Stabellini wrote:
> > On Fri, 18 Oct 2013, Russell King - ARM Linux wrote:
> > > On Fri, Oct 18, 2013 at 01:22:18PM +0100, Stefano Stabellini wrote:
> > > > Russell,
> > > > are you OK with this patch?
> > > 
> > > Only concern is why the change is soo large.
> > > 
> > > > > -static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > > > +static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> > > > >  {
> > > > >  	if (dev && dev->archdata.dma_ops)
> > > > >  		return dev->archdata.dma_ops;
> > > > >  	return &arm_dma_ops;
> > > > >  }
> > > > >  
> > > > > +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > > > > +{
> > > > > +	if (xen_initial_domain())
> > > > > +		return xen_dma_ops;
> > > > > +	else
> > > > > +		return __generic_dma_ops(dev);
> > > > > +}
> > > > > +
> > > 
> > > What's wrong with:
> > > 
> > >  static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> > >  {
> > > +	if (xen_initial_domain())
> > > +		return xen_dma_ops;
> > >  	if (dev && dev->archdata.dma_ops)
> > >  		return dev->archdata.dma_ops;
> > >  	return &arm_dma_ops;
> > >  }
> > 
> > 
> > xen_dma_ops functions might have to call back the native implementation.
> > With the above there is no way for a xen_dma_ops function to get to
> > archdata.dma_ops or arm_dma_ops.
> > This is the reason why this patch introduces __generic_dma_ops.
> 
> Ah, that's fine then, but having that described in the commit message
> would be useful.
> 
> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
> 
> Thanks.

Thank you. I'll add a note to the commit message.
diff mbox

Patch

diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
index 01b5a3d..f5945d4 100644
--- a/arch/arm/include/asm/dma-mapping.h
+++ b/arch/arm/include/asm/dma-mapping.h
@@ -12,17 +12,28 @@ 
 #include <asm/memory.h>
 #include <asm/cacheflush.h>
 
+#include <xen/xen.h>
+#include <asm/xen/hypervisor.h>
+
 #define DMA_ERROR_CODE	(~0)
 extern struct dma_map_ops arm_dma_ops;
 extern struct dma_map_ops arm_coherent_dma_ops;
 
-static inline struct dma_map_ops *get_dma_ops(struct device *dev)
+static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
 {
 	if (dev && dev->archdata.dma_ops)
 		return dev->archdata.dma_ops;
 	return &arm_dma_ops;
 }
 
+static inline struct dma_map_ops *get_dma_ops(struct device *dev)
+{
+	if (xen_initial_domain())
+		return xen_dma_ops;
+	else
+		return __generic_dma_ops(dev);
+}
+
 static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)
 {
 	BUG_ON(!dev);