summaryrefslogtreecommitdiffstats
path: root/drivers/xen/biomerge.c
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2009-02-09 12:05:46 -0800
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2010-10-18 10:40:28 -0400
commitd8e0420603cf1ce9cb459c00ea0b7337de41b968 (patch)
tree10294b14b8f0a432763d2b87c38bd41538923d85 /drivers/xen/biomerge.c
parent23ace955c22cb9bdf703e4bdc9bf7379166113cd (diff)
downloadlinux-stable-d8e0420603cf1ce9cb459c00ea0b7337de41b968.tar.gz
linux-stable-d8e0420603cf1ce9cb459c00ea0b7337de41b968.tar.bz2
linux-stable-d8e0420603cf1ce9cb459c00ea0b7337de41b968.zip
xen: define BIOVEC_PHYS_MERGEABLE()
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> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen/biomerge.c')
-rw-r--r--drivers/xen/biomerge.c13
1 files changed, 13 insertions, 0 deletions
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 @@
+#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));
+}