|
[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
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
{
> + 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 ( ... )
{
[..]
> 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.
> + 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,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |