/* * Great future plan: * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. * Always point %gs to its beginning */ void __init setup_per_cpu_areas(void) { ssize_t size = PERCPU_ENOUGH_ROOM; char *ptr; int cpu; /* Setup cpu_pda map */ setup_cpu_pda_map(); /* Copy section for each CPU (we discard the original) */ size = PERCPU_ENOUGH_ROOM; printk(KERN_INFO "PERCPU: Allocating %zd bytes of per cpu data\n", size); for_each_possible_cpu(cpu) { #ifndef CONFIG_NEED_MULTIPLE_NODES ptr = alloc_bootmem_pages(size); #else int node = early_cpu_to_node(cpu); if (!node_online(node) || !NODE_DATA(node)) { ptr = alloc_bootmem_pages(size); printk(KERN_INFO "cpu %d has no node %d or node-local memory\n", cpu, node); } else ptr = alloc_bootmem_pages_node(NODE_DATA(node), size); #endif per_cpu_offset(cpu) = ptr - __per_cpu_start; memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); } printk(KERN_DEBUG "NR_CPUS: %d, nr_cpu_ids: %d, nr_node_ids %d\n", NR_CPUS, nr_cpu_ids, nr_node_ids); /* Setup percpu data maps */ setup_per_cpu_maps(); /* Setup node to cpumask map */ setup_node_to_cpumask_map(); /* Setup cpumask_of_cpu map */ setup_cpumask_of_cpu(); }
void s3c64xx_reserve_bootmem(void) { struct s3c_media_device *mdev; int i, nr_devs; nr_devs = sizeof(media_devs) / sizeof(media_devs[0]); for (i = 0; i < nr_devs; i++) { mdev = &media_devs[i]; if (mdev->memsize <= 0) continue; mdev->paddr = virt_to_phys(alloc_bootmem_pages_node( \ NODE_DATA(mdev->node), mdev->memsize)); printk(KERN_INFO "s5p64xx: %lu bytes system memory reserved " \ "for %s at 0x%08x\n", (unsigned long) mdev->memsize, \ mdev->name, mdev->paddr); } }
void __init setup_per_cpu_areas(void) { int i; unsigned long size; char *ptr; /* Copy section for each CPU (we discard the original) */ size = ALIGN(__per_cpu_end - __per_cpu_start, PAGE_SIZE); #ifdef CONFIG_MODULES if (size < PERCPU_ENOUGH_ROOM) size = PERCPU_ENOUGH_ROOM; #endif for_each_possible_cpu(i) { ptr = alloc_bootmem_pages_node(NODE_DATA(cpu_to_node(i)), size); paca[i].data_offset = ptr - __per_cpu_start; memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); } }