diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-05 14:22:00 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-05 14:22:00 -0700 |
commit | 931f70350e9c298887c78e852d179ef7efcce304 (patch) | |
tree | 7d909970a9ac85c3a7b6c460330591f26bdb1dcd | |
parent | e305fc5ecd6420fadec5a8108852081fa2b89a17 (diff) | |
parent | 04a13c7c632e1fe04a5f6e6c83565d2559e37598 (diff) | |
download | linux-stable-931f70350e9c298887c78e852d179ef7efcce304.tar.gz linux-stable-931f70350e9c298887c78e852d179ef7efcce304.tar.bz2 linux-stable-931f70350e9c298887c78e852d179ef7efcce304.zip |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu:
percpu: don't assume existence of cpu0
-rw-r--r-- | mm/percpu.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/mm/percpu.c b/mm/percpu.c index 5fe37842e0ea..3311c8919f37 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -197,7 +197,12 @@ static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk, static bool pcpu_chunk_page_occupied(struct pcpu_chunk *chunk, int page_idx) { - return *pcpu_chunk_pagep(chunk, 0, page_idx) != NULL; + /* + * Any possible cpu id can be used here, so there's no need to + * worry about preemption or cpu hotplug. + */ + return *pcpu_chunk_pagep(chunk, raw_smp_processor_id(), + page_idx) != NULL; } /* set the pointer to a chunk in a page struct */ @@ -297,6 +302,14 @@ static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr) return pcpu_first_chunk; } + /* + * The address is relative to unit0 which might be unused and + * thus unmapped. Offset the address to the unit space of the + * current processor before looking it up in the vmalloc + * space. Note that any possible cpu id can be used here, so + * there's no need to worry about preemption or cpu hotplug. + */ + addr += raw_smp_processor_id() * pcpu_unit_size; return pcpu_get_page_chunk(vmalloc_to_page(addr)); } |