Skip to contentSkip to conversation

Added xen_is_contiguous_region

PATCH New Jambunathan K 1 participant 1 message Apr 13, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Added xen_is_contiguous_region

Continuation of the following thread
http://lists.xensource.com/archives/html/xen-devel/2007-04/msg00135.html

I haven't compiled the changes for IA64. Consider the changes as indicative.

Added xen_is_contiguous_region

linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Thu Apr 12 13:13:04 2007 +1 -1
diff -r a839e331f06f linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c
@@ -327,7 +327,7 @@
                dma = swiotlb_map_single(dev, ptr, size, direction);
        } else {
                dma = virt_to_bus(ptr);
-               IOMMU_BUG_ON(range_straddles_page_boundary(ptr, size));
+               IOMMU_BUG_ON(!xen_is_contiguous_region(ptr, size));
                IOMMU_BUG_ON(address_needs_mapping(dev, dma));
        }
 
linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Thu Apr 12 13:13:04 2007 +1 -1
diff -r a839e331f06f linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c
@@ -479,7 +479,7 @@
         * we can safely return the device addr and not worry about bounce
         * buffering it.
         */
-       if (!range_straddles_page_boundary(ptr, size) &&
+       if (xen_is_contiguous_region(ptr, size) &&
            !address_needs_mapping(hwdev, dev_addr))
                return dev_addr;
 
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Thu Apr 12 13:13:04 2007 +7 -0
diff -r a839e331f06f linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c
@@ -440,6 +440,13 @@
 }
 EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
 
+int xen_is_contiguous_region(void *vaddr, size_t size)
+{
+       return (((((unsigned long)vaddr & ~PAGE_MASK) + size) <= PAGE_SIZE) ||
+               test_bit(__pa(vaddr) >> PAGE_SHIFT, contiguous_bitmap));
+}
+EXPORT_SYMBOL_GPL(xen_is_contiguous_region);
+
 #ifdef __i386__
 int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b)
 {
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h Thu Apr 12 13:13:04 2007 +1 -3
diff -r a839e331f06f linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h
@@ -25,9 +25,7 @@
 static inline int
 range_straddles_page_boundary(void *p, size_t size)
 {
-       extern unsigned long *contiguous_bitmap;
-       return (((((unsigned long)p & ~PAGE_MASK) + size) > PAGE_SIZE) &&
-               !test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap));
+       return !xen_is_contiguous_region(p, size);
 }
 
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Thu Apr 12 13:13:04 2007 +1 -0
diff -r a839e331f06f linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
@@ -118,6 +118,7 @@
     unsigned long vstart, unsigned int order, unsigned int address_bits);
 void xen_destroy_contiguous_region(
     unsigned long vstart, unsigned int order);
+int xen_is_contiguous_region(void *vaddr, size_t size);
 
 /* Turn jiffies into Xen system time. */
 u64 jiffies_to_st(unsigned long jiffies);
linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h Thu Apr 12 13:13:04 2007 +1 -3
diff -r a839e331f06f linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h
@@ -127,9 +127,7 @@
 static inline int
 range_straddles_page_boundary(void *p, size_t size)
 {
-       extern unsigned long *contiguous_bitmap;
-       return (((((unsigned long)p & ~PAGE_MASK) + size) > PAGE_SIZE) &&
-               !test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap));
+       return !xen_is_contiguous_region(p, size);
 }
 #endif
 
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Fri Apr 13 23:16:15 2007 renamed from linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Thu Apr 12 13:13:04 2007 +12 -2
diff -r a839e331f06f linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
@@ -146,7 +146,7 @@
 
 #ifndef CONFIG_VMX_GUEST
 int __xen_create_contiguous_region(unsigned long vstart, unsigned int order, unsigned int address_bits);
-static inline int
+int
 xen_create_contiguous_region(unsigned long vstart,
                              unsigned int order, unsigned int address_bits)
 {
@@ -157,14 +157,24 @@
        }
        return ret;
 }
+EXPORT_SYMBOL_GPL(xen_create_contiguous_region);
 
 void __xen_destroy_contiguous_region(unsigned long vstart, unsigned int order);
-static inline void
+void
 xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
 {
        if (is_running_on_xen())
                __xen_destroy_contiguous_region(vstart, order);
 }
+EXPORT_SYMBOL_GPL(xen_create_contiguous_region);
+
+int xen_is_contiguous_region(void *vaddr, size_t size)
+{
+       return (((((unsigned long)vaddr & ~PAGE_MASK) + size) <= PAGE_SIZE) ||
+               test_bit(__pa(vaddr) >> PAGE_SHIFT, contiguous_bitmap));
+}
+EXPORT_SYMBOL_GPL(xen_create_contiguous_region);
+
 
 #endif /* !CONFIG_VMX_GUEST */