diff options
-rw-r--r-- | arch/x86/include/asm/io.h | 13 | ||||
-rw-r--r-- | drivers/xen/Makefile | 2 | ||||
-rw-r--r-- | drivers/xen/biomerge.c | 13 |
3 files changed, 27 insertions, 1 deletions
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 30a3e9776123..0ad29d401565 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
@@ -41,6 +41,8 @@ | |||
41 | #include <asm-generic/int-ll64.h> | 41 | #include <asm-generic/int-ll64.h> |
42 | #include <asm/page.h> | 42 | #include <asm/page.h> |
43 | 43 | ||
44 | #include <xen/xen.h> | ||
45 | |||
44 | #define build_mmio_read(name, size, type, reg, barrier) \ | 46 | #define build_mmio_read(name, size, type, reg, barrier) \ |
45 | static inline type name(const volatile void __iomem *addr) \ | 47 | static inline type name(const volatile void __iomem *addr) \ |
46 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ | 48 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
@@ -349,6 +351,17 @@ extern void __iomem *early_memremap(resource_size_t phys_addr, | |||
349 | extern void early_iounmap(void __iomem *addr, unsigned long size); | 351 | extern void early_iounmap(void __iomem *addr, unsigned long size); |
350 | extern void fixup_early_ioremap(void); | 352 | extern void fixup_early_ioremap(void); |
351 | 353 | ||
354 | #ifdef CONFIG_XEN | ||
355 | struct bio_vec; | ||
356 | |||
357 | extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, | ||
358 | const struct bio_vec *vec2); | ||
359 | |||
360 | #define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ | ||
361 | (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) && \ | ||
362 | (!xen_domain() || xen_biovec_phys_mergeable(vec1, vec2))) | ||
363 | #endif /* CONFIG_XEN */ | ||
364 | |||
352 | #define IO_SPACE_LIMIT 0xffff | 365 | #define IO_SPACE_LIMIT 0xffff |
353 | 366 | ||
354 | #endif /* _ASM_X86_IO_H */ | 367 | #endif /* _ASM_X86_IO_H */ |
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index fcaf838f54be..b47f5da674d3 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | obj-y += grant-table.o features.o events.o manage.o | 1 | obj-y += grant-table.o features.o events.o manage.o biomerge.o |
2 | obj-y += xenbus/ | 2 | obj-y += xenbus/ |
3 | 3 | ||
4 | nostackp := $(call cc-option, -fno-stack-protector) | 4 | nostackp := $(call cc-option, -fno-stack-protector) |
diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c new file mode 100644 index 000000000000..ba6eda4b5143 --- /dev/null +++ b/drivers/xen/biomerge.c | |||
@@ -0,0 +1,13 @@ | |||
1 | #include <linux/bio.h> | ||
2 | #include <linux/io.h> | ||
3 | #include <xen/page.h> | ||
4 | |||
5 | bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, | ||
6 | const struct bio_vec *vec2) | ||
7 | { | ||
8 | unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page)); | ||
9 | unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page)); | ||
10 | |||
11 | return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) && | ||
12 | ((mfn1 == mfn2) || ((mfn1+1) == mfn2)); | ||
13 | } | ||