]> xenbits.xensource.com Git - people/ssmith/netchannel2-pvops.git/commitdiff
xen: define BIOVEC_PHYS_MERGEABLE()
authorJeremy Fitzhardinge <jeremy@goop.org>
Mon, 9 Feb 2009 20:05:46 +0000 (12:05 -0800)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Mon, 29 Jun 2009 20:29:26 +0000 (13:29 -0700)
Impact: allow Xen control of bio merging

When running in Xen domain with device access, we need to make sure
the block subsystem doesn't merge requests across pages which aren't
machine physically contiguous.  To do this, we define our own
BIOVEC_PHYS_MERGEABLE.  When CONFIG_XEN isn't enabled, or we're not
running in a Xen domain, this has identical behaviour to the normal
implementation.  When running under Xen, we also make sure the
underlying machine pages are the same or adjacent.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
arch/x86/include/asm/io.h
drivers/xen/Makefile
drivers/xen/biomerge.c [new file with mode: 0644]

index 73739322b6d05675ca8155aac9f5126a5e701460..bd702cd58c69ab36c98e16f73534da8b4042799a 100644 (file)
@@ -7,6 +7,8 @@
 #include <asm-generic/int-ll64.h>
 #include <asm/page.h>
 
+#include <asm/xen/hypervisor.h>
+
 #define build_mmio_read(name, size, type, reg, barrier) \
 static inline type name(const volatile void __iomem *addr) \
 { type ret; asm volatile("mov" size " %1,%0":reg (ret) \
@@ -199,6 +201,17 @@ extern void __iomem *early_memremap(resource_size_t phys_addr,
                                    unsigned long size);
 extern void early_iounmap(void __iomem *addr, unsigned long size);
 
+#ifdef CONFIG_XEN
+struct bio_vec;
+
+extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
+                                     const struct bio_vec *vec2);
+
+#define BIOVEC_PHYS_MERGEABLE(vec1, vec2)                              \
+       (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&                         \
+        (!xen_domain() || xen_biovec_phys_mergeable(vec1, vec2)))
+#endif /* CONFIG_XEN */
+
 #define IO_SPACE_LIMIT 0xffff
 
 #endif /* _ASM_X86_IO_H */
index ec2a39b1e26f0438f6a2266cd77ff6173fd7bbc7..e6c8b85f7a22dd3c65a21cf4931a1ac98d406a46 100644 (file)
@@ -1,4 +1,4 @@
-obj-y  += grant-table.o features.o events.o manage.o
+obj-y  += grant-table.o features.o events.o manage.o biomerge.o
 obj-y  += xenbus/
 
 obj-$(CONFIG_HOTPLUG_CPU)      += cpu_hotplug.o
diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c
new file mode 100644 (file)
index 0000000..d40f534
--- /dev/null
@@ -0,0 +1,14 @@
+#include <linux/bio.h>
+#include <asm/io.h>
+#include <xen/page.h>
+
+bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
+                              const struct bio_vec *vec2)
+{
+       unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page));
+       unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page));
+
+       return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&
+               ((mfn1 == mfn2) || ((mfn1+1) == mfn2));
+}
+