From: Mike Travis <travis@sgi.com>
To: Frederik Deweerdt <frederik.deweerdt@xprog.eu>
Cc: mingo@elte.hu, andi@firstfloor.org, tglx@linutronix.de,
hpa@zytor.com, linux-kernel@vger.kernel.org
Subject: Re: [patch] tlb flush_data: replace per_cpu with an array
Date: Mon, 12 Jan 2009 15:57:47 -0800 [thread overview]
Message-ID: <496BD8FB.1050101@sgi.com> (raw)
In-Reply-To: <20090112235156.GC10720@gambetta>
Frederik Deweerdt wrote:
> On Mon, Jan 12, 2009 at 02:54:25PM -0800, Mike Travis wrote:
>> Frederik Deweerdt wrote:
>>> Hi,
>>>
>>> On x86_64 flush tlb data is stored in per_cpu variables. This is
>>> unnecessary because only the first NUM_INVALIDATE_TLB_VECTORS entries
>>> are accessed.
>>> This patch aims at making the code less confusing (there's nothing
>>> really "per_cpu") by using a plain array. It also would save some memory
>>> on most distros out there (Ubuntu x86_64 has NR_CPUS=64 by default).
>>>
>>> Regards,
>>> Frederik
>>>
>>> Signed-off-by: Frederik Deweerdt <frederik.deweerdt@xprog.eu>
>> Here is the net change in memory usage with this patch on a allyesconfig
>> with NR_CPUS=4096.
> Yes, this point wrt. memory was based on my flawed understanding of how
> per_cpu actually allocates the data. There is however 1) a confusing use
> of per_cpu removed, 2) faster access to the flush data.
Is this true? On a widely separated NUMA system, requiring all CPU's to
access memory on NODE 0 for every tlb flush would seem expensive. That's
another benefit of per_cpu data, it's local to the node's cpus.
(And was it determined yet, that a cacheline has to be tossed around as well?)
Thanks,
Mike
>
>> ====== Data (-l 500)
>>
>> 1 - initial
>> 2 - change-flush-tlb
>>
>> .1. .2. .delta.
>> 0 5120 +5120 . flush_state(.bss)
>>
>> ====== Sections (-l 500)
>>
>> .1. .2. .delta.
>> 12685496 12693688 +8192 +0.06% .bss
>> 1910176 1909408 -768 -0.04% .data.percpu
>>
> I get :
> Initial
> size ./arch/x86/kernel/tlb_64.o
> text data bss dec hex filename
> 1667 136 8 1811 713 ./arch/x86/kernel/tlb_64.o
>
> After
> size ./arch/x86/kernel/tlb_64.o
> text data bss dec hex filename
> 1598 8 1088 2694 a86 ./arch/x86/kernel/tlb_64.o
>
> -69 -128 +1080 +883
>
> But I'm not sure those numbers are that relevant, as the percpu part
> will be allocated at runtime.
>
> Regards,
> Frederik
>
>>> diff --git a/arch/x86/kernel/tlb_64.c b/arch/x86/kernel/tlb_64.c
>>> index f8be6f1..c177a1f 100644
>>> --- a/arch/x86/kernel/tlb_64.c
>>> +++ b/arch/x86/kernel/tlb_64.c
>>> @@ -33,7 +33,7 @@
>>> * To avoid global state use 8 different call vectors.
>>> * Each CPU uses a specific vector to trigger flushes on other
>>> * CPUs. Depending on the received vector the target CPUs look into
>>> - * the right per cpu variable for the flush data.
>>> + * the right array slot for the flush data.
>>> *
>>> * With more than 8 CPUs they are hashed to the 8 available
>>> * vectors. The limited global vector space forces us to this right now.
>>> @@ -54,7 +54,7 @@ union smp_flush_state {
>>> /* State is put into the per CPU data section, but padded
>>> to a full cache line because other CPUs can access it and we don't
>>> want false sharing in the per cpu data segment. */
>>> -static DEFINE_PER_CPU(union smp_flush_state, flush_state);
>>> +static union smp_flush_state flush_state[NUM_INVALIDATE_TLB_VECTORS];
>>>
>>> /*
>>> * We cannot call mmdrop() because we are in interrupt context,
>>> @@ -129,7 +129,7 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs)
>>> * Use that to determine where the sender put the data.
>>> */
>>> sender = ~regs->orig_ax - INVALIDATE_TLB_VECTOR_START;
>>> - f = &per_cpu(flush_state, sender);
>>> + f = &flush_state[sender];
>>>
>>> if (!cpu_isset(cpu, f->flush_cpumask))
>>> goto out;
>>> @@ -169,7 +169,7 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm,
>>>
>>> /* Caller has disabled preemption */
>>> sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS;
>>> - f = &per_cpu(flush_state, sender);
>>> + f = &flush_state[sender];
>>>
>>> /*
>>> * Could avoid this lock when
>>> @@ -205,8 +205,8 @@ static int __cpuinit init_smp_flush(void)
>>> {
>>> int i;
>>>
>>> - for_each_possible_cpu(i)
>>> - spin_lock_init(&per_cpu(flush_state, i).tlbstate_lock);
>>> + for (i = 0; i < ARRAY_SIZE(flush_state); i++)
>>> + spin_lock_init(&flush_state[i].tlbstate_lock);
>>>
>>> return 0;
>>> }
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>> Please read the FAQ at http://www.tux.org/lkml/
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2009-01-12 23:58 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-12 21:35 [patch] tlb flush_data: replace per_cpu with an array Frederik Deweerdt
2009-01-12 21:46 ` Ingo Molnar
2009-01-12 21:57 ` Andi Kleen
2009-01-12 22:10 ` Frederik Deweerdt
2009-01-12 22:32 ` Andi Kleen
2009-01-12 22:50 ` Ingo Molnar
2009-01-12 22:40 ` Ingo Molnar
2009-01-12 22:59 ` H. Peter Anvin
2009-01-13 2:43 ` Andi Kleen
2009-01-13 12:28 ` Ingo Molnar
2009-01-12 22:34 ` Ravikiran G Thirumalai
2009-01-12 23:00 ` Ingo Molnar
2009-01-12 23:09 ` Ingo Molnar
2009-01-13 2:14 ` Ravikiran G Thirumalai
2009-01-13 12:00 ` Peter Zijlstra
2009-01-13 12:33 ` Ingo Molnar
2009-01-13 18:13 ` Ravikiran G Thirumalai
2009-01-13 18:34 ` Ingo Molnar
2009-01-13 18:42 ` Ravikiran G Thirumalai
2009-01-14 7:31 ` Ingo Molnar
2009-01-15 7:15 ` Ravikiran G Thirumalai
2009-01-14 9:08 ` Andi Kleen
2009-01-14 14:41 ` Frederik Deweerdt
2009-01-14 15:20 ` Andi Kleen
2009-01-14 15:10 ` Frederik Deweerdt
2009-01-12 22:54 ` Mike Travis
2009-01-12 23:51 ` Frederik Deweerdt
2009-01-12 23:57 ` Mike Travis [this message]
2009-01-13 0:01 ` Ingo Molnar
2009-01-13 3:36 ` Andi Kleen
2009-01-13 12:14 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=496BD8FB.1050101@sgi.com \
--to=travis@sgi.com \
--cc=andi@firstfloor.org \
--cc=frederik.deweerdt@xprog.eu \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.