diff options
author | Richard Braun <rbraun@sceen.net> | 2014-12-10 22:08:07 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2014-12-10 23:16:47 +0100 |
commit | 0bc7e442fe8f6df72ca11036401c8766d57fc034 (patch) | |
tree | fd349319cb7aaf94270ac42d54a26557191f5340 /kern/percpu.c | |
parent | 7de1e22e040c51f833bfb096f2974e25f9bda2ea (diff) |
kern/percpu: directmap update
Diffstat (limited to 'kern/percpu.c')
-rw-r--r-- | kern/percpu.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/kern/percpu.c b/kern/percpu.c index 2da86e2e..71f67b1a 100644 --- a/kern/percpu.c +++ b/kern/percpu.c @@ -32,37 +32,45 @@ void *percpu_areas[MAX_CPUS] __read_mostly; static void *percpu_area_content __initdata; -static size_t percpu_size __initdata; +static size_t percpu_area_size __initdata; static int percpu_skip_warning __initdata; void __init percpu_bootstrap(void) { percpu_areas[0] = &_percpu; - percpu_size = &_epercpu - &_percpu; } void __init percpu_setup(void) { - printk("percpu: max_cpus: %u, section size: %zuk\n", - MAX_CPUS, percpu_size >> 10); - assert(vm_page_aligned(percpu_size)); + struct vm_page *page; + unsigned int order; - if (percpu_size == 0) + percpu_area_size = &_epercpu - &_percpu; + printk("percpu: max_cpus: %u, section size: %zuk\n", MAX_CPUS, + percpu_area_size >> 10); + assert(vm_page_aligned(percpu_area_size)); + + if (percpu_area_size == 0) return; - percpu_area_content = vm_kmem_alloc(percpu_size); + order = vm_page_order(percpu_area_size); + page = vm_page_alloc(order, VM_PAGE_SEL_DIRECTMAP, VM_PAGE_KERNEL); - if (percpu_area_content == NULL) + if (page == NULL) panic("percpu: unable to allocate memory for percpu area content"); - memcpy(percpu_area_content, &_percpu, percpu_size); + percpu_area_content = vm_page_direct_ptr(page); + memcpy(percpu_area_content, &_percpu, percpu_area_size); } int __init percpu_add(unsigned int cpu) { + struct vm_page *page; + unsigned int order; + if (cpu >= ARRAY_SIZE(percpu_areas)) { if (!percpu_skip_warning) { printk("percpu: ignoring processor beyond id %zu\n", @@ -78,17 +86,19 @@ percpu_add(unsigned int cpu) return ERROR_INVAL; } - if (percpu_size == 0) + if (percpu_area_size == 0) goto out; - percpu_areas[cpu] = vm_kmem_alloc(percpu_size); + order = vm_page_order(percpu_area_size); + page = vm_page_alloc(order, VM_PAGE_SEL_DIRECTMAP, VM_PAGE_KERNEL); - if (percpu_areas[cpu] == NULL) { + if (page == NULL) { printk("percpu: error: unable to allocate percpu area\n"); return ERROR_NOMEM; } - memcpy(percpu_area(cpu), percpu_area_content, percpu_size); + percpu_areas[cpu] = vm_page_direct_ptr(page); + memcpy(percpu_area(cpu), percpu_area_content, percpu_area_size); out: return 0; @@ -97,5 +107,10 @@ out: void percpu_cleanup(void) { - vm_kmem_free(percpu_area_content, percpu_size); + struct vm_page *page; + unsigned long va; + + va = (unsigned long)percpu_area_content; + page = vm_page_lookup(vm_page_direct_pa(va)); + vm_page_free(page, vm_page_order(percpu_area_size)); } |