Re: [PATCH 4/4 alternative userspace] add ksm kernel shared memory driver

2009-04-02 Thread Bert Wesarg
On Thu, Apr 2, 2009 at 07:59, Chris Wright chr...@redhat.com wrote:
 * Bert Wesarg (bert.wes...@googlemail.com) wrote:
  Unregister a shareable memory region (not currently implemented):
                                          ^
  madvise(void *addr, size_t len, MADV_UNSHAREABLE)
 I can't find a definition for MADV_UNSHAREABLE!

 It's not there ;-)

Thanks ;-)
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/4 alternative userspace] add ksm kernel shared memory driver

2009-04-02 Thread Avi Kivity

Chris Wright wrote:

I can't find a definition for MADV_UNSHAREABLE!



It's not there ;-)
  


You were not able to share it with us?

--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/4 alternative userspace] add ksm kernel shared memory driver

2009-04-01 Thread Chris Wright
Here's ksm w/ a user interface built around madvise for registering and
sysfs for controlling (should just drop config tristate and make it bool,
CONFIG_KSM= y or n).

#include Izik's changelog

  Ksm is driver that allow merging identical pages between one or more
  applications in way unvisible to the application that use it.
  Pages that are merged are marked as readonly and are COWed when any
  application try to change them.

  Ksm is used for cases where using fork() is not suitable,
  one of this cases is where the pages of the application keep changing
  dynamicly and the application cannot know in advance what pages are
  going to be identical.

  Ksm works by walking over the memory pages of the applications it
  scan in order to find identical pages.
  It uses a two sorted data strctures called stable and unstable trees
  to find in effective way the identical pages.

  When ksm finds two identical pages, it marks them as readonly and merges
  them into single one page,
  after the pages are marked as readonly and merged into one page, linux
  will treat this pages as normal copy_on_write pages and will fork them
  when write access will happen to them.

  Ksm scan just memory areas that were registred to be scanned by it.

Ksm api (for users to register region):

Register a memory region as shareable:

madvise(void *addr, size_t len, MADV_SHAREABLE)

Unregister a shareable memory region (not currently implemented):

madvise(void *addr, size_t len, MADV_UNSHAREABLE)

Ksm api (for users to control ksm scanning daemon):
/sys/kernel/mm/ksm
|-- pages_shared-- RO, attribute showing number of pages shared
|-- pages_to_scan   -- RW, number of pages to scan per scan loop
|-- run -- RW, whether scanning daemon should scan
`-- sleep   -- RW, number of usecs to sleep between scan loops

Signed-off-by: Izik Eidus iei...@redhat.com
Signed-off-by: Chris Wright chr...@redhat.com
---
 include/asm-generic/mman.h |1 +
 include/linux/ksm.h|8 +
 mm/Kconfig |6 +
 mm/Makefile|1 +
 mm/ksm.c   | 1337 
 mm/madvise.c   |   18 +
 6 files changed, 1371 insertions(+), 0 deletions(-)

diff --git a/include/asm-generic/mman.h b/include/asm-generic/mman.h
index 5e3dde2..a1c1d5c 100644
--- a/include/asm-generic/mman.h
+++ b/include/asm-generic/mman.h
@@ -34,6 +34,7 @@
 #define MADV_REMOVE9   /* remove these pages  resources */
 #define MADV_DONTFORK  10  /* don't inherit across fork */
 #define MADV_DOFORK11  /* do inherit across fork */
+#define MADV_SHAREABLE 12  /* can share identical pages */
 
 /* compatibility flags */
 #define MAP_FILE   0
diff --git a/include/linux/ksm.h b/include/linux/ksm.h
new file mode 100644
index 000..e032f6f
--- /dev/null
+++ b/include/linux/ksm.h
@@ -0,0 +1,8 @@
+#ifndef __LINUX_KSM_H
+#define __LINUX_KSM_H
+
+#define ksm_control_flags_run 1
+
+long ksm_register_memory(struct vm_area_struct *, unsigned long, unsigned 
long);
+
+#endif
diff --git a/mm/Kconfig b/mm/Kconfig
index b53427a..3f3fd04 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -223,3 +223,9 @@ config HAVE_MLOCKED_PAGE_BIT
 
 config MMU_NOTIFIER
bool
+
+config KSM
+   tristate Enable KSM for page sharing
+   help
+ Enable the KSM kernel module to allow page sharing of equal pages
+ among different tasks.
diff --git a/mm/Makefile b/mm/Makefile
index ec73c68..b885513 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o
 obj-$(CONFIG_TMPFS_POSIX_ACL) += shmem_acl.o
 obj-$(CONFIG_SLOB) += slob.o
 obj-$(CONFIG_MMU_NOTIFIER) += mmu_notifier.o
+obj-$(CONFIG_KSM) += ksm.o
 obj-$(CONFIG_PAGE_POISONING) += debug-pagealloc.o
 obj-$(CONFIG_SLAB) += slab.o
 obj-$(CONFIG_SLUB) += slub.o
diff --git a/mm/ksm.c b/mm/ksm.c
new file mode 100644
index 000..fcbf76e
--- /dev/null
+++ b/mm/ksm.c
@@ -0,0 +1,1337 @@
+/*
+ * Memory merging driver for Linux
+ *
+ * This module enables dynamic sharing of identical pages found in different
+ * memory areas, even if they are not shared by fork()
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ * Authors:
+ * Izik Eidus
+ * Andrea Arcangeli
+ * Chris Wright
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ */
+
+#include linux/module.h
+#include linux/errno.h
+#include linux/mm.h
+#include linux/fs.h
+#include linux/vmalloc.h
+#include linux/file.h
+#include linux/mman.h
+#include linux/sched.h
+#include linux/rwsem.h
+#include linux/pagemap.h
+#include linux/sched.h
+#include linux/rmap.h
+#include linux/spinlock.h
+#include linux/jhash.h
+#include linux/delay.h
+#include linux/kthread.h
+#include linux/wait.h
+#include linux/scatterlist.h
+#include linux/random.h
+#include linux/slab.h
+#include linux/swap.h
+#include linux/rbtree.h
+#include linux/anon_inodes.h

Re: [PATCH 4/4 alternative userspace] add ksm kernel shared memory driver

2009-04-01 Thread Bert Wesarg
On Thu, Apr 2, 2009 at 07:48, Chris Wright chr...@redhat.com wrote:
 Ksm api (for users to register region):

 Register a memory region as shareable:

 madvise(void *addr, size_t len, MADV_SHAREABLE)

 Unregister a shareable memory region (not currently implemented):

 madvise(void *addr, size_t len, MADV_UNSHAREABLE)
I can't find a definition for MADV_UNSHAREABLE!

Bert
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html