ksm.c (d94e5fcbf1420366dcb4102bafe04dbcfc0d0d4b) ksm.c (c73602ad31cdcf7e6651f43d12f65b5b9b825b6f)
1/*
2 * Memory merging support.
3 *
4 * This code enables dynamic sharing of identical pages found in different
5 * memory areas, even if they are not shared by fork()
6 *
7 * Copyright (C) 2008-2009 Red Hat, Inc.
8 * Authors:

--- 170 unchanged lines hidden (view full) ---

179static DECLARE_WAIT_QUEUE_HEAD(ksm_thread_wait);
180static DEFINE_MUTEX(ksm_thread_mutex);
181static DEFINE_SPINLOCK(ksm_mmlist_lock);
182
183#define KSM_KMEM_CACHE(__struct, __flags) kmem_cache_create("ksm_"#__struct,\
184 sizeof(struct __struct), __alignof__(struct __struct),\
185 (__flags), NULL)
186
1/*
2 * Memory merging support.
3 *
4 * This code enables dynamic sharing of identical pages found in different
5 * memory areas, even if they are not shared by fork()
6 *
7 * Copyright (C) 2008-2009 Red Hat, Inc.
8 * Authors:

--- 170 unchanged lines hidden (view full) ---

179static DECLARE_WAIT_QUEUE_HEAD(ksm_thread_wait);
180static DEFINE_MUTEX(ksm_thread_mutex);
181static DEFINE_SPINLOCK(ksm_mmlist_lock);
182
183#define KSM_KMEM_CACHE(__struct, __flags) kmem_cache_create("ksm_"#__struct,\
184 sizeof(struct __struct), __alignof__(struct __struct),\
185 (__flags), NULL)
186
187static void __init ksm_init_max_kernel_pages(void)
188{
189 ksm_max_kernel_pages = nr_free_buffer_pages() / 4;
190}
191
192static int __init ksm_slab_init(void)
193{
194 rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0);
195 if (!rmap_item_cache)
196 goto out;
197
198 mm_slot_cache = KSM_KMEM_CACHE(mm_slot, 0);
199 if (!mm_slot_cache)

--- 1468 unchanged lines hidden (view full) ---

1668};
1669#endif /* CONFIG_SYSFS */
1670
1671static int __init ksm_init(void)
1672{
1673 struct task_struct *ksm_thread;
1674 int err;
1675
187static int __init ksm_slab_init(void)
188{
189 rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0);
190 if (!rmap_item_cache)
191 goto out;
192
193 mm_slot_cache = KSM_KMEM_CACHE(mm_slot, 0);
194 if (!mm_slot_cache)

--- 1468 unchanged lines hidden (view full) ---

1663};
1664#endif /* CONFIG_SYSFS */
1665
1666static int __init ksm_init(void)
1667{
1668 struct task_struct *ksm_thread;
1669 int err;
1670
1676 ksm_init_max_kernel_pages();
1671 ksm_max_kernel_pages = totalram_pages / 4;
1677
1678 err = ksm_slab_init();
1679 if (err)
1680 goto out;
1681
1682 err = mm_slots_hash_init();
1683 if (err)
1684 goto out_free1;

--- 7 unchanged lines hidden (view full) ---

1692
1693#ifdef CONFIG_SYSFS
1694 err = sysfs_create_group(mm_kobj, &ksm_attr_group);
1695 if (err) {
1696 printk(KERN_ERR "ksm: register sysfs failed\n");
1697 kthread_stop(ksm_thread);
1698 goto out_free2;
1699 }
1672
1673 err = ksm_slab_init();
1674 if (err)
1675 goto out;
1676
1677 err = mm_slots_hash_init();
1678 if (err)
1679 goto out_free1;

--- 7 unchanged lines hidden (view full) ---

1687
1688#ifdef CONFIG_SYSFS
1689 err = sysfs_create_group(mm_kobj, &ksm_attr_group);
1690 if (err) {
1691 printk(KERN_ERR "ksm: register sysfs failed\n");
1692 kthread_stop(ksm_thread);
1693 goto out_free2;
1694 }
1695#else
1696 ksm_run = KSM_RUN_MERGE; /* no way for user to start it */
1697
1700#endif /* CONFIG_SYSFS */
1701
1702 return 0;
1703
1704out_free2:
1705 mm_slots_hash_free();
1706out_free1:
1707 ksm_slab_free();
1708out:
1709 return err;
1710}
1711module_init(ksm_init)
1698#endif /* CONFIG_SYSFS */
1699
1700 return 0;
1701
1702out_free2:
1703 mm_slots_hash_free();
1704out_free1:
1705 ksm_slab_free();
1706out:
1707 return err;
1708}
1709module_init(ksm_init)