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) |