lkml.org 
[lkml]   [2009]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC MM] mmap_sem scaling: only scan cpus used by an mm
    One way to reduce the cost of the writer lock is to track the cpus used
    and loop over the processors in that bitmap.

    ---
    arch/x86/include/asm/mmu_context.h | 1 +
    include/linux/mm_types.h | 3 ++-
    kernel/fork.c | 2 ++
    mm/init-mm.c | 1 +
    4 files changed, 6 insertions(+), 1 deletion(-)

    Index: linux-2.6/arch/x86/include/asm/mmu_context.h
    ===================================================================
    --- linux-2.6.orig/arch/x86/include/asm/mmu_context.h 2009-11-06 12:26:24.000000000 -0600
    +++ linux-2.6/arch/x86/include/asm/mmu_context.h 2009-11-06 12:26:36.000000000 -0600
    @@ -43,6 +43,7 @@ static inline void switch_mm(struct mm_s
    percpu_write(cpu_tlbstate.active_mm, next);
    #endif
    cpumask_set_cpu(cpu, mm_cpumask(next));
    + cpumask_set_cpu(cpu, &next->cpus_used);

    /* Re-load page tables */
    load_cr3(next->pgd);
    Index: linux-2.6/include/linux/mm_types.h
    ===================================================================
    --- linux-2.6.orig/include/linux/mm_types.h 2009-11-06 12:26:35.000000000 -0600
    +++ linux-2.6/include/linux/mm_types.h 2009-11-06 12:26:36.000000000 -0600
    @@ -241,6 +241,7 @@ struct mm_struct {
    struct linux_binfmt *binfmt;

    cpumask_t cpu_vm_mask;
    + cpumask_t cpus_used;

    /* Architecture-specific MM context */
    mm_context_t context;
    @@ -291,7 +292,7 @@ static inline int mm_has_reader(struct m
    {
    int cpu;

    - for_each_possible_cpu(cpu)
    + for_each_cpu(cpu, &mm->cpus_used)
    if (per_cpu(mm->rss->readers, cpu))
    return 1;

    Index: linux-2.6/mm/init-mm.c
    ===================================================================
    --- linux-2.6.orig/mm/init-mm.c 2009-11-06 12:26:35.000000000 -0600
    +++ linux-2.6/mm/init-mm.c 2009-11-06 12:26:36.000000000 -0600
    @@ -19,5 +19,6 @@ struct mm_struct init_mm = {
    .page_table_lock = __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
    .mmlist = LIST_HEAD_INIT(init_mm.mmlist),
    .cpu_vm_mask = CPU_MASK_ALL,
    + .cpus_used = CPU_MASK_ALL,
    .rss = &init_mm_counters,
    };
    Index: linux-2.6/kernel/fork.c
    ===================================================================
    --- linux-2.6.orig/kernel/fork.c 2009-11-06 12:26:35.000000000 -0600
    +++ linux-2.6/kernel/fork.c 2009-11-06 12:26:40.000000000 -0600
    @@ -297,6 +297,8 @@ static int dup_mmap(struct mm_struct *mm
    mm->cached_hole_size = ~0UL;
    mm->map_count = 0;
    cpumask_clear(mm_cpumask(mm));
    + cpumask_clear(&mm->cpus_used);
    + cpumask_set_cpu(smp_processor_id(), &mm->cpus_used);
    mm->mm_rb = RB_ROOT;
    rb_link = &mm->mm_rb.rb_node;
    rb_parent = NULL;


    \
     
     \ /
      Last update: 2009-11-06 19:57    [W:0.024 / U:1.352 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site