From: Andrew Morton <akpm@osdl.org>
To: Ravikiran G Thirumalai <kiran@in.ibm.com>
Cc: linux-kernel@vger.kernel.org, manfred@colorfullife.com,
rusty@rustcorp.com.au, dipankar@in.ibm.com
Subject: Re: [patch] mm: Reimplementation of dynamic percpu memory allocator
Date: Thu, 13 Jan 2005 00:57:30 -0800 [thread overview]
Message-ID: <20050113005730.0e10b2d9.akpm@osdl.org> (raw)
In-Reply-To: <20050113083412.GA7567@impedimenta.in.ibm.com>
Ravikiran G Thirumalai <kiran@in.ibm.com> wrote:
>
> ...
> The following patch re-implements the linux dynamic percpu memory allocator
Heavens, it's complex.
> 1. Percpu memory dereference is faster
> - One less memory reference compared to existing simple alloc_percpu
> - As fast as with static percpu areas, one mem ref less actually.
> 2. Better memory usage
> - Doesn't need a NR_CPUS pointer array for each allocation
> - Interlaces objects making better utilization of memory/cachelines
> - Userspace tests show 98% utilization with random sized allocations
> after repeated random frees
> 3. Provides truly node local allocation
> - The percpu memory with existing alloc_percpu does node local
> allocation, but the NR_CPUS place holder is not node local. This
> problem doesn't exist with the new implementation.
But it does consume vmalloc space and will incur additional TLB reload
costs.
> +static void *
> +valloc_percpu(void)
> +{
> + int i,j = 0;
> + unsigned int nr_pages;
> + struct vm_struct *area, tmp;
> + struct page **tmppage;
> + struct page *pages[BLOCK_MANAGEMENT_PAGES];
How much stackspace is this guy using on 512-way?
> + unsigned int cpu_pages = PCPU_BLKSIZE >> PAGE_SHIFT;
> + struct pcpu_block *blkp = NULL;
> +
> + BUG_ON(!IS_ALIGNED(PCPU_BLKSIZE, PAGE_SIZE));
> + BUG_ON(!PCPU_BLKSIZE);
> + nr_pages = PCPUPAGES_PER_BLOCK + BLOCK_MANAGEMENT_PAGES;
> +
> + /* Alloc Managent block pages */
> + for ( i = 0; i < BLOCK_MANAGEMENT_PAGES; i++) {
> + pages[i] = alloc_pages(GFP_KERNEL, 0);
Can use __GFP_ZERO here.
> + if (!pages[i]) {
> + while ( --i >= 0 )
> + __free_pages(pages[i], 0);
> + return NULL;
> + }
> + /* Zero the alloced page */
> + clear_page(page_address(pages[i]));
And so can remove this.
Cannot highmem pages be used here?
> + for ( i = 0; i < BLOCK_MANAGEMENT_PAGES; i++)
Patch has a fair amount of whitespace oddities.
> + /* Alloc node local pages for all cpus possible */
> + for (i = 0; i < NR_CPUS; i++) {
> + if (cpu_possible(i)) {
Isn't this equivalent to for_each_cpu()?
> + /* Map pages for each cpu by splitting vm_struct for each cpu */
> + for (i = 0; i < NR_CPUS; i++) {
> + if (cpu_possible(i)) {
etc.
> +/* Sort obj_map array in ascending order -- simple bubble sort */
> +static void
> +sort_obj_map(struct obj_map_elmt map[], int nr)
That'll be unpopular ;) Why not extract qsort from XFS?
Why cannot the code simply call vmalloc rather than copying its internals?
Have you considered trying a simple __alloc_pages, fall back to vmalloc if
that fails, or if the requested size is more than eight pages, or something
of that sort?
next prev parent reply other threads:[~2005-01-13 8:58 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-13 8:34 Ravikiran G Thirumalai
2005-01-13 8:57 ` Andrew Morton [this message]
2005-01-14 15:05 ` Ravikiran G Thirumalai
2005-01-14 9:34 ` Andrew Morton
2005-01-17 18:27 ` Ravikiran G Thirumalai
2005-01-17 22:11 ` Andrew Morton
2005-01-18 5:59 ` Ravikiran G Thirumalai
2005-01-14 2:24 ` Rusty Russell
2005-01-14 9:58 ` Ravikiran G Thirumalai
2005-01-14 10:41 ` Rusty Russell
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=20050113005730.0e10b2d9.akpm@osdl.org \
--to=akpm@osdl.org \
--cc=dipankar@in.ibm.com \
--cc=kiran@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=manfred@colorfullife.com \
--cc=rusty@rustcorp.com.au \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome