[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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@xxxxxxxxxx)?
> 
> 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@xxxxxxxxxxx>
> >>>   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@xxxxxxxxxx>
> >>> Tested-by: Julien Grall <julien.grall@xxxxxxx>
> >>> Suggested-by: Catalin Marinas <catalin.marinas@xxxxxxx>
> >>> CC: linux@xxxxxxxxxxxxxxx
> >>> CC: catalin.marinas@xxxxxxx
> >>> CC: will.deacon@xxxxxxx
> >>> CC: boris.ostrovsky@xxxxxxxxxx
> >>> CC: jgross@xxxxxxxx
> >>> CC: Julien Grall <julien.grall@xxxxxxx>
> >>
> >> Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx>
> >>
> >>
> >>> 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);
> > 
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.