[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] Xen: Spread boot time page scrubbing across all available CPU's
On Fri, Apr 11, 2014 at 08:19:27PM +0100, Julien Grall wrote: > Hi Konrad, > > This patch will break ARM build (see below). > > On 04/11/2014 07:08 PM, Konrad Rzeszutek Wilk wrote: > > +void __init smp_scrub_heap_pages(void *data) > > +{ > > + unsigned long mfn, start, end; > > + struct page_info *pg; > > + struct scrub_region *r; > > + unsigned int temp_cpu, node, cpu_idx = 0; > > + unsigned int cpu = smp_processor_id(); > > + > > + if ( data ) > > + r = data; > > + else { > > else > { Right. > > > + node = cpu_to_node(cpu); > > + if ( node == NUMA_NO_NODE ) > > + return; > > + r = ®ion[node]; > > + } > > + ASSERT(r != NULL); > > + > > + /* Determine the current CPU's index into CPU's linked to this node*/ > > + for_each_cpu ( temp_cpu, &r->cpu ) > > + { > > + if ( cpu == temp_cpu ) > > + break; > > + cpu_idx++; > > + } > > + > > + /* Calculate the starting mfn for this CPU's memory block */ > > + start = r->start + (r->per_cpu_sz * cpu_idx) + r->offset; > > + > > + /* Calculate the end mfn into this CPU's memory block for this > > iteration */ > > + if ( r->offset + chunk_size > r->per_cpu_sz ) { > > if ( ... ) > { > > [..] <sigh> > > > void __init scrub_heap_pages(void) > > { > > - unsigned long mfn; > > - struct page_info *pg; > > + cpumask_t node_cpus, temp_cpus, all_worker_cpus = {{ 0 }}; > > + unsigned int i, j, cpu, sibling; > > + unsigned long offset, max_per_cpu_sz = 0; > > + unsigned long start, end; > > + unsigned long rem = 0; > > > > if ( !opt_bootscrub ) > > return; > > > > - printk("Scrubbing Free RAM: "); > > + /* Scrub block size */ > > + chunk_size = opt_bootscrub_chunk >> PAGE_SHIFT; > > + if ( chunk_size == 0 ) > > + chunk_size = 1; > > > > - for ( mfn = first_valid_mfn; mfn < max_page; mfn++ ) > > + /* Round #0 - figure out amounts and which CPUs to use */ > > + for_each_online_node ( i ) > > { > > + /* Calculate Node memory start and end address */ > > + start = max(node_start_pfn(i), first_valid_mfn); > > node_start_pfn doesn't exists on ARM. > As we don't yet support NUMA, you will have to add a dummy #define in > asm-arm/numa.h which will return the correct value. OK. Will add that. > > > + end = min(node_start_pfn(i) + node_spanned_pages(i), max_page); > > + /* CPUs that are online and on this node (if none, that it is OK */ > > + cpumask_and(&node_cpus, &node_to_cpumask(i), &cpu_online_map); > > + cpumask_copy(&temp_cpus, &node_cpus); > > + /* Rip out threads. */ > > + for_each_cpu ( j, &temp_cpus ) > > + { > > + cpu = 0; > > + for_each_cpu(sibling, per_cpu(cpu_sibling_mask, j)) { > > for_each_cpu( ... ) > { > > > + if (cpu++ == 0) /* Skip 1st CPU - the core */ > > if ( ... ) > > > + continue; > > + cpumask_clear_cpu(sibling, &node_cpus); > > + } > > + } > > + cpumask_or(&all_worker_cpus, &all_worker_cpus, &node_cpus); > > + if ( cpumask_empty(&node_cpus) ) { /* No CPUs on this node. */ > > if ( ... ) > { > > Regards, Thanks for your review! > > -- > Julien Grall > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |