Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 161647
b: refs/heads/master
c: ce3141a
h: refs/heads/master
i:
  161645: 2b47ca1
  161643: 49f44d1
  161639: a4d0057
  161631: c4d89ea
v: v3
  • Loading branch information
Tejun Heo committed Jul 3, 2009
1 parent 0624a6d commit 3588836
Show file tree
Hide file tree
Showing 4 changed files with 401 additions and 250 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c8a51be4cabb7009db5f865169389242d49c4c60
refs/heads/master: ce3141a277ff6cc37e51008b8888dc2cb7456ef1
42 changes: 15 additions & 27 deletions trunk/arch/sparc/kernel/smp_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -1415,19 +1415,6 @@ static void * __init pcpu_alloc_bootmem(unsigned int cpu, unsigned long size,
#endif
}

static size_t pcpur_size __initdata;
static void **pcpur_ptrs __initdata;

static struct page * __init pcpur_get_page(unsigned int cpu, int pageno)
{
size_t off = (size_t)pageno << PAGE_SHIFT;

if (off >= pcpur_size)
return NULL;

return virt_to_page(pcpur_ptrs[cpu] + off);
}

#define PCPU_CHUNK_SIZE (4UL * 1024UL * 1024UL)

static void __init pcpu_map_range(unsigned long start, unsigned long end,
Expand Down Expand Up @@ -1491,25 +1478,26 @@ void __init setup_per_cpu_areas(void)
size_t dyn_size, static_size = __per_cpu_end - __per_cpu_start;
static struct vm_struct vm;
unsigned long delta, cpu;
size_t pcpu_unit_size;
size_t size_sum, pcpu_unit_size;
size_t ptrs_size;
void **ptrs;

pcpur_size = PFN_ALIGN(static_size + PERCPU_MODULE_RESERVE +
PERCPU_DYNAMIC_RESERVE);
dyn_size = pcpur_size - static_size - PERCPU_MODULE_RESERVE;
size_sum = PFN_ALIGN(static_size + PERCPU_MODULE_RESERVE +
PERCPU_DYNAMIC_RESERVE);
dyn_size = size_sum - static_size - PERCPU_MODULE_RESERVE;


ptrs_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpur_ptrs[0]));
pcpur_ptrs = alloc_bootmem(ptrs_size);
ptrs_size = PFN_ALIGN(num_possible_cpus() * sizeof(ptrs[0]));
ptrs = alloc_bootmem(ptrs_size);

for_each_possible_cpu(cpu) {
pcpur_ptrs[cpu] = pcpu_alloc_bootmem(cpu, PCPU_CHUNK_SIZE,
PCPU_CHUNK_SIZE);
ptrs[cpu] = pcpu_alloc_bootmem(cpu, PCPU_CHUNK_SIZE,
PCPU_CHUNK_SIZE);

free_bootmem(__pa(pcpur_ptrs[cpu] + pcpur_size),
PCPU_CHUNK_SIZE - pcpur_size);
free_bootmem(__pa(ptrs[cpu] + size_sum),
PCPU_CHUNK_SIZE - size_sum);

memcpy(pcpur_ptrs[cpu], __per_cpu_load, static_size);
memcpy(ptrs[cpu], __per_cpu_load, static_size);
}

/* allocate address and map */
Expand All @@ -1523,14 +1511,14 @@ void __init setup_per_cpu_areas(void)

start += cpu * PCPU_CHUNK_SIZE;
end = start + PCPU_CHUNK_SIZE;
pcpu_map_range(start, end, virt_to_page(pcpur_ptrs[cpu]));
pcpu_map_range(start, end, virt_to_page(ptrs[cpu]));
}

pcpu_unit_size = pcpu_setup_first_chunk(pcpur_get_page, static_size,
pcpu_unit_size = pcpu_setup_first_chunk(static_size,
PERCPU_MODULE_RESERVE, dyn_size,
PCPU_CHUNK_SIZE, vm.addr);

free_bootmem(__pa(pcpur_ptrs), ptrs_size);
free_bootmem(__pa(ptrs), ptrs_size);

delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
for_each_possible_cpu(cpu) {
Expand Down
3 changes: 1 addition & 2 deletions trunk/include/linux/percpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,12 @@

extern void *pcpu_base_addr;

typedef struct page * (*pcpu_get_page_fn_t)(unsigned int cpu, int pageno);
typedef void * (*pcpu_fc_alloc_fn_t)(unsigned int cpu, size_t size);
typedef void (*pcpu_fc_free_fn_t)(void *ptr, size_t size);
typedef void (*pcpu_fc_populate_pte_fn_t)(unsigned long addr);
typedef void (*pcpu_fc_map_fn_t)(void *ptr, size_t size, void *addr);

extern size_t __init pcpu_setup_first_chunk(pcpu_get_page_fn_t get_page_fn,
extern size_t __init pcpu_setup_first_chunk(
size_t static_size, size_t reserved_size,
ssize_t dyn_size, size_t unit_size,
void *base_addr);
Expand Down
Loading

0 comments on commit 3588836

Please sign in to comment.