|
@@ -30,6 +30,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/mmu_notifier.h>
|
|
#include <linux/mmu_notifier.h>
|
|
|
|
+#include <linux/swap.h>
|
|
#include <linux/ksm.h>
|
|
#include <linux/ksm.h>
|
|
|
|
|
|
#include <asm/tlbflush.h>
|
|
#include <asm/tlbflush.h>
|
|
@@ -162,10 +163,10 @@ static unsigned long ksm_pages_unshared;
|
|
static unsigned long ksm_rmap_items;
|
|
static unsigned long ksm_rmap_items;
|
|
|
|
|
|
/* Limit on the number of unswappable pages used */
|
|
/* Limit on the number of unswappable pages used */
|
|
-static unsigned long ksm_max_kernel_pages = 2000;
|
|
|
|
|
|
+static unsigned long ksm_max_kernel_pages;
|
|
|
|
|
|
/* Number of pages ksmd should scan in one batch */
|
|
/* Number of pages ksmd should scan in one batch */
|
|
-static unsigned int ksm_thread_pages_to_scan = 200;
|
|
|
|
|
|
+static unsigned int ksm_thread_pages_to_scan = 100;
|
|
|
|
|
|
/* Milliseconds ksmd should sleep between batches */
|
|
/* Milliseconds ksmd should sleep between batches */
|
|
static unsigned int ksm_thread_sleep_millisecs = 20;
|
|
static unsigned int ksm_thread_sleep_millisecs = 20;
|
|
@@ -173,7 +174,7 @@ static unsigned int ksm_thread_sleep_millisecs = 20;
|
|
#define KSM_RUN_STOP 0
|
|
#define KSM_RUN_STOP 0
|
|
#define KSM_RUN_MERGE 1
|
|
#define KSM_RUN_MERGE 1
|
|
#define KSM_RUN_UNMERGE 2
|
|
#define KSM_RUN_UNMERGE 2
|
|
-static unsigned int ksm_run = KSM_RUN_MERGE;
|
|
|
|
|
|
+static unsigned int ksm_run = KSM_RUN_STOP;
|
|
|
|
|
|
static DECLARE_WAIT_QUEUE_HEAD(ksm_thread_wait);
|
|
static DECLARE_WAIT_QUEUE_HEAD(ksm_thread_wait);
|
|
static DEFINE_MUTEX(ksm_thread_mutex);
|
|
static DEFINE_MUTEX(ksm_thread_mutex);
|
|
@@ -183,6 +184,11 @@ static DEFINE_SPINLOCK(ksm_mmlist_lock);
|
|
sizeof(struct __struct), __alignof__(struct __struct),\
|
|
sizeof(struct __struct), __alignof__(struct __struct),\
|
|
(__flags), NULL)
|
|
(__flags), NULL)
|
|
|
|
|
|
|
|
+static void __init ksm_init_max_kernel_pages(void)
|
|
|
|
+{
|
|
|
|
+ ksm_max_kernel_pages = nr_free_buffer_pages() / 4;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init ksm_slab_init(void)
|
|
static int __init ksm_slab_init(void)
|
|
{
|
|
{
|
|
rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0);
|
|
rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0);
|
|
@@ -1667,6 +1673,8 @@ static int __init ksm_init(void)
|
|
struct task_struct *ksm_thread;
|
|
struct task_struct *ksm_thread;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ ksm_init_max_kernel_pages();
|
|
|
|
+
|
|
err = ksm_slab_init();
|
|
err = ksm_slab_init();
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|