]> xenbits.xensource.com Git - people/ssmith/netchannel2-pvops.git/commitdiff
xen-add-foreign-page-flag
authorJeremy Fitzhardinge <jeremy@goop.org>
Mon, 9 Feb 2009 20:05:52 +0000 (12:05 -0800)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Mon, 29 Jun 2009 20:39:35 +0000 (13:39 -0700)
include/linux/page-flags.h
mm/page_alloc.c

index e2e5ce543595df658b883a227fd753f9ab2a92e0..ca67e2b236330ea66e2b3fee0053731f131839e8 100644 (file)
@@ -101,6 +101,9 @@ enum pageflags {
 #endif
 #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
        PG_uncached,            /* Page has been mapped as uncached */
+#endif
+#ifdef CONFIG_XEN
+       PG_foreign,
 #endif
        __NR_PAGEFLAGS,
 
@@ -263,6 +266,21 @@ PAGEFLAG(Uncached, uncached)
 PAGEFLAG_FALSE(Uncached)
 #endif
 
+#ifdef CONFIG_XEN
+TESTPAGEFLAG(Foreign, foreign)
+__SETPAGEFLAG(Foreign, foreign)
+CLEARPAGEFLAG(Foreign, foreign)
+#define SetPageForeign(_page, dtor) do {                               \
+       __SetPageForeign(_page);                                        \
+       BUG_ON((dtor) == (void (*)(struct page *, unsigned int))0);     \
+       (_page)->index = (long)(dtor);                                  \
+} while (0)
+#define PageForeignDestructor(_page, order)    \
+       ((void (*)(struct page *, unsigned int))(_page)->index)(_page, order)
+#else
+PAGEFLAG_FALSE(Foreign)
+#endif
+
 static inline int PageUptodate(struct page *page)
 {
        int ret = test_bit(PG_uptodate, &(page)->flags);
index a5f3c278c5732f4f3c8c9258f5b95b2c86b3e490..eef99f33465f1d8ee34765aeb02ab1d0daeafbb1 100644 (file)
@@ -566,6 +566,13 @@ static void __free_pages_ok(struct page *page, unsigned int order)
        if (bad)
                return;
 
+#ifdef CONFIG_XEN
+       if (PageForeign(page)) {
+               PageForeignDestructor(page, order);
+               return;
+       }
+#endif
+
        if (!PageHighMem(page)) {
                debug_check_no_locks_freed(page_address(page),PAGE_SIZE<<order);
                debug_check_no_obj_freed(page_address(page),
@@ -1025,6 +1032,13 @@ static void free_hot_cold_page(struct page *page, int cold)
 
        kmemcheck_free_shadow(page, 0);
 
+#ifdef CONFIG_XEN
+       if (PageForeign(page)) {
+               PageForeignDestructor(page, 0);
+               return;
+       }
+#endif
+
        if (PageAnon(page))
                page->mapping = NULL;
        if (free_pages_check(page))