lkml.org 
[lkml]   [2010]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] ksm: cleanup for mm_slots_hash

    Use compile-allocated memory instead of dynamic allocated
    memory for mm_slots_hash.

    Use hash_ptr() instead divisions for bucket calculation.

    Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
    ---
    diff --git a/mm/ksm.c b/mm/ksm.c
    index 8cdfc2a..81b379e 100644
    --- a/mm/ksm.c
    +++ b/mm/ksm.c
    @@ -33,6 +33,7 @@
    #include <linux/mmu_notifier.h>
    #include <linux/swap.h>
    #include <linux/ksm.h>
    +#include <linux/hash.h>

    #include <asm/tlbflush.h>
    #include "internal.h"
    @@ -153,8 +154,9 @@ struct rmap_item {
    static struct rb_root root_stable_tree = RB_ROOT;
    static struct rb_root root_unstable_tree = RB_ROOT;

    -#define MM_SLOTS_HASH_HEADS 1024
    -static struct hlist_head *mm_slots_hash;
    +#define MM_SLOTS_HASH_SHIFT 10
    +#define MM_SLOTS_HASH_HEADS (1 << MM_SLOTS_HASH_SHIFT)
    +static struct hlist_head mm_slots_hash[MM_SLOTS_HASH_HEADS];

    static struct mm_slot ksm_mm_head = {
    .mm_list = LIST_HEAD_INIT(ksm_mm_head.mm_list),
    @@ -269,28 +271,13 @@ static inline void free_mm_slot(struct mm_slot *mm_slot)
    kmem_cache_free(mm_slot_cache, mm_slot);
    }

    -static int __init mm_slots_hash_init(void)
    -{
    - mm_slots_hash = kzalloc(MM_SLOTS_HASH_HEADS * sizeof(struct hlist_head),
    - GFP_KERNEL);
    - if (!mm_slots_hash)
    - return -ENOMEM;
    - return 0;
    -}
    -
    -static void __init mm_slots_hash_free(void)
    -{
    - kfree(mm_slots_hash);
    -}
    -
    static struct mm_slot *get_mm_slot(struct mm_struct *mm)
    {
    struct mm_slot *mm_slot;
    struct hlist_head *bucket;
    struct hlist_node *node;

    - bucket = &mm_slots_hash[((unsigned long)mm / sizeof(struct mm_struct))
    - % MM_SLOTS_HASH_HEADS];
    + bucket = &mm_slots_hash[hash_ptr(mm, MM_SLOTS_HASH_SHIFT)];
    hlist_for_each_entry(mm_slot, node, bucket, link) {
    if (mm == mm_slot->mm)
    return mm_slot;
    @@ -303,8 +290,7 @@ static void insert_to_mm_slots_hash(struct mm_struct *mm,
    {
    struct hlist_head *bucket;

    - bucket = &mm_slots_hash[((unsigned long)mm / sizeof(struct mm_struct))
    - % MM_SLOTS_HASH_HEADS];
    + bucket = &mm_slots_hash[hash_ptr(mm, MM_SLOTS_HASH_SHIFT)];
    mm_slot->mm = mm;
    hlist_add_head(&mm_slot->link, bucket);
    }
    @@ -1943,15 +1929,11 @@ static int __init ksm_init(void)
    if (err)
    goto out;

    - err = mm_slots_hash_init();
    - if (err)
    - goto out_free1;
    -
    ksm_thread = kthread_run(ksm_scan_thread, NULL, "ksmd");
    if (IS_ERR(ksm_thread)) {
    printk(KERN_ERR "ksm: creating kthread failed\n");
    err = PTR_ERR(ksm_thread);
    - goto out_free2;
    + goto out_free;
    }

    #ifdef CONFIG_SYSFS
    @@ -1959,7 +1941,7 @@ static int __init ksm_init(void)
    if (err) {
    printk(KERN_ERR "ksm: register sysfs failed\n");
    kthread_stop(ksm_thread);
    - goto out_free2;
    + goto out_free;
    }
    #else
    ksm_run = KSM_RUN_MERGE; /* no way for user to start it */
    @@ -1975,9 +1957,7 @@ static int __init ksm_init(void)
    #endif
    return 0;

    -out_free2:
    - mm_slots_hash_free();
    -out_free1:
    +out_free:
    ksm_slab_free();
    out:
    return err;


    \
     
     \ /
      Last update: 2010-05-28 08:49    [W:0.025 / U:0.680 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site