Skip to content

Commit

Permalink
xen: define BIOVEC_PHYS_MERGEABLE()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Konrad Rzeszutek Wilk <[email protected]>
  • Loading branch information
Jeremy Fitzhardinge authored and konradwilk committed Oct 18, 2010
1 parent 23ace95 commit d8e0420
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
13 changes: 13 additions & 0 deletions arch/x86/include/asm/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
#include <asm-generic/int-ll64.h>
#include <asm/page.h>

#include <xen/xen.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) \
Expand Down Expand Up @@ -349,6 +351,17 @@ extern void __iomem *early_memremap(resource_size_t phys_addr,
extern void early_iounmap(void __iomem *addr, unsigned long size);
extern void fixup_early_ioremap(void);

#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 */
2 changes: 1 addition & 1 deletion drivers/xen/Makefile
Original file line number Diff line number Diff line change
@@ -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/

nostackp := $(call cc-option, -fno-stack-protector)
Expand Down
13 changes: 13 additions & 0 deletions drivers/xen/biomerge.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include <linux/bio.h>
#include <linux/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));
}

0 comments on commit d8e0420

Please sign in to comment.