--- linux-2.6.30/mm/Kconfig 2009-06-09 21:05:27.000000000 -0600 +++ linux-2.6.30-tmem/mm/Kconfig 2009-06-19 09:36:41.000000000 -0600 @@ -253,3 +253,30 @@ of 1 says that all excess pages should be trimmed. See Documentation/nommu-mmap.txt for more information. + +# +# support for transcendent memory +# +config TMEM + bool "Transcendent memory support" + depends on XEN # but in future may work without XEN + help + In a virtualized environment, allows unused and underutilized + system physical memory to be made accessible through a narrow + well-defined page-copy-based API. If unsure, say Y. + +config PRECACHE + bool "Cache clean pages in transcendent memory" + depends on TMEM + help + Allows the transcendent memory pool to be used to store clean + page-cache pages which, under some circumstances, will greatly + reduce paging and thus improve performance. If unsure, say Y. + +config PRESWAP + bool "Swap pages to transcendent memory" + depends on TMEM + help + Allows the transcendent memory pool to be used as a pseudo-swap + device which, under some circumstances, will greatly reduce + swapping and thus improve performance. If unsure, say Y. --- linux-2.6.30/mm/Makefile 2009-06-09 21:05:27.000000000 -0600 +++ linux-2.6.30-tmem/mm/Makefile 2009-06-19 09:33:59.000000000 -0600 @@ -16,6 +16,8 @@ obj-$(CONFIG_PROC_PAGE_MONITOR) += pagewalk.o obj-$(CONFIG_BOUNCE) += bounce.o obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o thrash.o +obj-$(CONFIG_PRESWAP) += preswap.o +obj-$(CONFIG_PRECACHE) += precache.o obj-$(CONFIG_HAS_DMA) += dmapool.o obj-$(CONFIG_HUGETLBFS) += hugetlb.o obj-$(CONFIG_NUMA) += mempolicy.o --- linux-2.6.30/include/linux/tmem.h 1969-12-31 17:00:00.000000000 -0700 +++ linux-2.6.30-tmem/include/linux/tmem.h 2009-06-19 11:21:58.000000000 -0600 @@ -0,0 +1,22 @@ +/* + * linux/tmem.h + * + * Interface to transcendent memory, used by mm/precache.c and mm/preswap.c + * + * Copyright (C) 2008,2009 Dan Magenheimer, Oracle Corp. + */ + +struct tmem_ops { + int (*new_pool)(u64 uuid_lo, u64 uuid_hi, u32 flags); + int (*put_page)(u32 pool_id, u64 object, u32 index, unsigned long gmfn); + int (*get_page)(u32 pool_id, u64 object, u32 index, unsigned long gmfn); + int (*flush_page)(u32 pool_id, u64 object, u32 index); + int (*flush_object)(u32 pool_id, u64 object); + int (*destroy_pool)(u32 pool_id); +}; + +extern struct tmem_ops *tmem_ops; + +/* flags for tmem_ops.new_pool */ +#define TMEM_POOL_PERSIST 1 +#define TMEM_POOL_SHARED 2