[lkml]   [2009]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: [this_cpu_xx V7 1/8] this_cpu_ops: page allocator conversion
On Tue, 15 Dec 2009, Tejun Heo wrote:

> Hello,
> On 12/15/2009 07:03 AM, Christoph Lameter wrote:
> > static __meminit void zone_pcp_init(struct zone *zone)
> > {
> > - int cpu;
> > - unsigned long batch = zone_batchsize(zone);
> > + /* Use boot pagesets until we have the per cpu allocator up */
> > + zone->pageset = &per_cpu_var(boot_pageset);
> Ummm... this scares me a little bit. Before it was a pointer to
> statically allocated area which can be used from basically anywhere.
> Now, it's being initialized to a percpu pointer which won't be
> available before setup_per_cpu_areas() is complete and the above
> initialization takes place from setup_arch() which is before percpu
> initialization. I don't think there's anything which would access
> page allocator between the two places, but it still seems a bit risky.
> Maybe it's better to keep the boot_pageset a static array? Or am I
> misunderstanding something?

A static array would have to be dimensioned to NR_CPUS. That is one thing
we are trying to avoid.

The assignment of the pageset "percpu" pointer does not mean that the pcp
is usable. It must first be properly initialized through setup_pageset().

setup_pageset() is run for each cpu. zone->pageset is the same for all
cpus that is why it is in zone_pcp_init() and not in setup_pageset().

The boot pageset initialization was moved into __build_all_zonelists(). We
could move the zone->pageset initialization there too?

 \ /
  Last update: 2009-12-15 16:07    [W:0.157 / U:2.300 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site