xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [Linux PATCH] Mark hugepages to the hypervisor to speed up mapping
@ 2010-06-09 15:49 Dave McCracken
  0 siblings, 0 replies; only message in thread
From: Dave McCracken @ 2010-06-09 15:49 UTC (permalink / raw)
  To: Jeremy Fitzhardinge; +Cc: Xen Developers List

--- next/arch/x86/xen/mmu.c	2010-06-01 11:41:54.000000000 -0500
+++ next-fh//arch/x86/xen/mmu.c	2010-06-02 08:45:01.000000000 -0500
@@ -2531,3 +2531,51 @@ static int __init xen_mmu_debugfs(void)
 fs_initcall(xen_mmu_debugfs);
 
 #endif	/* CONFIG_XEN_DEBUG_FS */
+
+static int mark_ok = 1;
+
+int arch_prepare_hugepage(struct page *page)
+{
+	struct mmuext_op op;
+	unsigned long pfn, mfn, m;
+	int i;
+	int rc;
+
+	pfn = page_to_pfn(page);
+	mfn = pfn_to_mfn(pfn);
+	if (mfn & ((HPAGE_SIZE/PAGE_SIZE)-1)) {
+		printk("Guest pages are not properly aligned to use hugepages\n");
+		return 1;
+	}
+	for (i = 0, m = mfn; i < HPAGE_SIZE/PAGE_SIZE; i++, pfn++, m++) {
+		if (pfn_to_mfn(pfn) != m) {
+			printk("Guest pages are not properly aligned to use hugepages\n");
+			return 1;
+		}
+	}
+	/* It's ok if this fails.  We just fall back to the slow refcounting */
+	if (mark_ok) {
+		op.cmd = MMUEXT_MARK_SUPER;
+		op.arg1.mfn = mfn;
+		rc = HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF);
+		if (rc) {
+			if (rc == -ENOSYS) {
+				mark_ok = 0;
+				return 0;
+			}
+			return 1;
+		}
+	}
+	return 0;
+}
+
+void arch_release_hugepage(struct page *page)
+{
+	struct mmuext_op op;
+
+	if (mark_ok) {
+		op.cmd = MMUEXT_UNMARK_SUPER;
+		op.arg1.mfn = pfn_to_mfn(page_to_pfn(page));
+		HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF);
+	}
+}
--- next/arch/x86/include/asm/hugetlb.h	2010-06-01 11:41:54.000000000 -0500
+++ next-fh//arch/x86/include/asm/hugetlb.h	2010-06-02 08:37:58.000000000 -0500
@@ -95,6 +95,10 @@ static inline int huge_ptep_set_access_f
 	return changed;
 }
 
+#ifdef CONFIG_XEN
+int arch_prepare_hugepage(struct page *page);
+void arch_release_hugepage(struct page *page);
+#else
 static inline int arch_prepare_hugepage(struct page *page)
 {
 	return 0;
@@ -103,5 +107,6 @@ static inline int arch_prepare_hugepage(
 static inline void arch_release_hugepage(struct page *page)
 {
 }
+#endif
 
 #endif /* _ASM_X86_HUGETLB_H */
--- next/include/xen/interface/xen.h	2010-06-01 11:41:59.000000000 -0500
+++ next-fh//include/xen/interface/xen.h	2010-06-02 08:38:50.000000000 -0500
@@ -167,6 +167,19 @@
  * cmd: MMUEXT_SET_LDT
  * linear_addr: Linear address of LDT base (NB. must be page-aligned).
  * nr_ents: Number of entries in LDT.
+ *
+ * cmd: MMUEXT_CLEAR_PAGE
+ * mfn: Machine frame number to be cleared.
+ *
+ * cmd: MMUEXT_COPY_PAGE
+ * mfn: Machine frame number of the destination page.
+ * src_mfn: Machine frame number of the source page.
+ *
+ * cmd: MMUEXT_MARK_SUPER
+ * mfn: Machine frame number of head of superpage to be marked.
+ *
+ * cmd: MMUEXT_UNMARK_SUPER
+ * mfn: Machine frame number of head of superpage to be cleared.
  */
 #define MMUEXT_PIN_L1_TABLE      0
 #define MMUEXT_PIN_L2_TABLE      1
@@ -183,6 +196,10 @@
 #define MMUEXT_FLUSH_CACHE      12
 #define MMUEXT_SET_LDT          13
 #define MMUEXT_NEW_USER_BASEPTR 15
+#define MMUEXT_CLEAR_PAGE       16
+#define MMUEXT_COPY_PAGE        17
+#define MMUEXT_MARK_SUPER       19
+#define MMUEXT_UNMARK_SUPER     20
 
 #ifndef __ASSEMBLY__
 #include <linux/types.h>

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2010-06-09 15:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-09 15:49 [Linux PATCH] Mark hugepages to the hypervisor to speed up mapping Dave McCracken

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).