Re: [Xen-devel] [PATCH 4/4] x86/xen: use the maximum MFN to calculate the required DMA mask

2014-11-20 Thread Jan Beulich
 On 19.11.14 at 17:02, david.vra...@citrix.com wrote:
 On a Xen PV guest the DMA addresses and physical addresses are not 1:1
 (such as Xen PV guests) and the generic dma_get_required_mask() does
 not return the correct mask (since it uses max_pfn).
 
 Some device drivers (such as mptsas, mpt2sas) use
 dma_get_required_mask() to set the device's DMA mask to allow them to
 use only 32-bit DMA addresses in hardware structures.  This results in
 unnecessary use of the SWIOTLB if DMA addresses are more than 32-bits,
 impacting performance significantly.
 
 Provide a get_required_mask op that uses the maximum MFN to calculate
 the DMA mask.
 
 Signed-off-by: David Vrabel david.vra...@citrix.com

Reviewed-by: Jan Beulich jbeul...@suse.com


___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


Re: [Xen-devel] [PATCH 4/4] x86/xen: use the maximum MFN to calculate the required DMA mask

2014-11-20 Thread David Vrabel
On 19/11/14 17:51, Stefano Stabellini wrote:
 On Wed, 19 Nov 2014, David Vrabel wrote:
 
 +u64
 +xen_swiotlb_get_required_mask(struct device *dev)
 +{
 +unsigned long max_mfn;
 +
 +max_mfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
 
 As Jan pointed out, I think you need to change the prototype of
 HYPERVISOR_memory_op to return long. Please do consistently across all
 relevant archs.

This doesn't help since 32-bit guests will still truncate.  A new
hypercall op that returns the result in a uint64_t parameter is required.

There is another reason why max_mfn isn't suitable -- IOMMU usage so I
think we should assume a 64-bit DMA mask is required (this is actually
the change I put into XenServer's kernel).

David

___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


Re: [Xen-devel] [PATCH 4/4] x86/xen: use the maximum MFN to calculate the required DMA mask

2014-11-19 Thread Stefano Stabellini
On Wed, 19 Nov 2014, David Vrabel wrote:
 On a Xen PV guest the DMA addresses and physical addresses are not 1:1
 (such as Xen PV guests) and the generic dma_get_required_mask() does
 not return the correct mask (since it uses max_pfn).
 
 Some device drivers (such as mptsas, mpt2sas) use
 dma_get_required_mask() to set the device's DMA mask to allow them to
 use only 32-bit DMA addresses in hardware structures.  This results in
 unnecessary use of the SWIOTLB if DMA addresses are more than 32-bits,
 impacting performance significantly.
 
 Provide a get_required_mask op that uses the maximum MFN to calculate
 the DMA mask.
 
 Signed-off-by: David Vrabel david.vra...@citrix.com
 ---
  arch/x86/xen/pci-swiotlb-xen.c |1 +
  drivers/xen/swiotlb-xen.c  |   13 +
  include/xen/swiotlb-xen.h  |4 
  3 files changed, 18 insertions(+)
 
 diff --git a/arch/x86/xen/pci-swiotlb-xen.c b/arch/x86/xen/pci-swiotlb-xen.c
 index 0e98e5d..a5d180a 100644
 --- a/arch/x86/xen/pci-swiotlb-xen.c
 +++ b/arch/x86/xen/pci-swiotlb-xen.c
 @@ -31,6 +31,7 @@ static struct dma_map_ops xen_swiotlb_dma_ops = {
   .map_page = xen_swiotlb_map_page,
   .unmap_page = xen_swiotlb_unmap_page,
   .dma_supported = xen_swiotlb_dma_supported,
 + .get_required_mask = xen_swiotlb_get_required_mask,
  };
  
  /*
 diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
 index ebd8f21..654587d 100644
 --- a/drivers/xen/swiotlb-xen.c
 +++ b/drivers/xen/swiotlb-xen.c
 @@ -42,9 +42,11 @@
  #include xen/page.h
  #include xen/xen-ops.h
  #include xen/hvc-console.h
 +#include xen/interface/memory.h
  
  #include asm/dma-mapping.h
  #include asm/xen/page-coherent.h
 +#include asm/xen/hypercall.h
  
  #include trace/events/swiotlb.h
  /*
 @@ -683,3 +685,14 @@ xen_swiotlb_set_dma_mask(struct device *dev, u64 
 dma_mask)
   return 0;
  }
  EXPORT_SYMBOL_GPL(xen_swiotlb_set_dma_mask);
 +
 +u64
 +xen_swiotlb_get_required_mask(struct device *dev)
 +{
 + unsigned long max_mfn;
 +
 + max_mfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);

As Jan pointed out, I think you need to change the prototype of
HYPERVISOR_memory_op to return long. Please do consistently across all
relevant archs.


 + return DMA_BIT_MASK(fls_long(max_mfn - 1) + PAGE_SHIFT);
 +}
 +EXPORT_SYMBOL_GPL(xen_swiotlb_get_required_mask);
 diff --git a/include/xen/swiotlb-xen.h b/include/xen/swiotlb-xen.h
 index 8b2eb93..640 100644
 --- a/include/xen/swiotlb-xen.h
 +++ b/include/xen/swiotlb-xen.h
 @@ -58,4 +58,8 @@ xen_swiotlb_dma_supported(struct device *hwdev, u64 mask);
  
  extern int
  xen_swiotlb_set_dma_mask(struct device *dev, u64 dma_mask);
 +
 +extern u64
 +xen_swiotlb_get_required_mask(struct device *dev);
 +
  #endif /* __LINUX_SWIOTLB_XEN_H */
 -- 
 1.7.10.4
 
 
 ___
 Xen-devel mailing list
 Xen-devel@lists.xen.org
 http://lists.xen.org/xen-devel
 

___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel