Commit 81df9bff2609f07cef4690ac2ebda1611b55b05a
Committed by
Linus Torvalds
1 parent
e9b2e78c6a
Exists in
master
and in
20 other branches
bootmem: fix wrong call parameter for free_bootmem()
It is strange that alloc_bootmem() returns a virtual address and free_bootmem() requires a physical address. Anyway, free_bootmem()'s first parameter should be physical address. There are some call sites for free_bootmem() with virtual address. So fix them. [akpm@linux-foundation.org: improve free_bootmem() and free_bootmem_pate() documentation] Signed-off-by: Joonsoo Kim <js1304@gmail.com> Cc: Haavard Skinnemoen <hskinnemoen@gmail.com> Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 5 changed files with 16 additions and 16 deletions Side-by-side Diff
arch/powerpc/platforms/cell/celleb_pci.c
... | ... | @@ -401,11 +401,11 @@ |
401 | 401 | } else { |
402 | 402 | if (config && *config) { |
403 | 403 | size = 256; |
404 | - free_bootmem((unsigned long)(*config), size); | |
404 | + free_bootmem(__pa(*config), size); | |
405 | 405 | } |
406 | 406 | if (res && *res) { |
407 | 407 | size = sizeof(struct celleb_pci_resource); |
408 | - free_bootmem((unsigned long)(*res), size); | |
408 | + free_bootmem(__pa(*res), size); | |
409 | 409 | } |
410 | 410 | } |
411 | 411 |
drivers/macintosh/smu.c
include/linux/bootmem.h
... | ... | @@ -51,8 +51,8 @@ |
51 | 51 | extern void free_bootmem_node(pg_data_t *pgdat, |
52 | 52 | unsigned long addr, |
53 | 53 | unsigned long size); |
54 | -extern void free_bootmem(unsigned long addr, unsigned long size); | |
55 | -extern void free_bootmem_late(unsigned long addr, unsigned long size); | |
54 | +extern void free_bootmem(unsigned long physaddr, unsigned long size); | |
55 | +extern void free_bootmem_late(unsigned long physaddr, unsigned long size); | |
56 | 56 | |
57 | 57 | /* |
58 | 58 | * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, |
lib/cpumask.c
mm/bootmem.c
... | ... | @@ -147,21 +147,21 @@ |
147 | 147 | |
148 | 148 | /* |
149 | 149 | * free_bootmem_late - free bootmem pages directly to page allocator |
150 | - * @addr: starting address of the range | |
150 | + * @addr: starting physical address of the range | |
151 | 151 | * @size: size of the range in bytes |
152 | 152 | * |
153 | 153 | * This is only useful when the bootmem allocator has already been torn |
154 | 154 | * down, but we are still initializing the system. Pages are given directly |
155 | 155 | * to the page allocator, no bootmem metadata is updated because it is gone. |
156 | 156 | */ |
157 | -void __init free_bootmem_late(unsigned long addr, unsigned long size) | |
157 | +void __init free_bootmem_late(unsigned long physaddr, unsigned long size) | |
158 | 158 | { |
159 | 159 | unsigned long cursor, end; |
160 | 160 | |
161 | - kmemleak_free_part(__va(addr), size); | |
161 | + kmemleak_free_part(__va(physaddr), size); | |
162 | 162 | |
163 | - cursor = PFN_UP(addr); | |
164 | - end = PFN_DOWN(addr + size); | |
163 | + cursor = PFN_UP(physaddr); | |
164 | + end = PFN_DOWN(physaddr + size); | |
165 | 165 | |
166 | 166 | for (; cursor < end; cursor++) { |
167 | 167 | __free_pages_bootmem(pfn_to_page(cursor), 0); |
168 | 168 | |
169 | 169 | |
170 | 170 | |
... | ... | @@ -377,21 +377,21 @@ |
377 | 377 | |
378 | 378 | /** |
379 | 379 | * free_bootmem - mark a page range as usable |
380 | - * @addr: starting address of the range | |
380 | + * @addr: starting physical address of the range | |
381 | 381 | * @size: size of the range in bytes |
382 | 382 | * |
383 | 383 | * Partial pages will be considered reserved and left as they are. |
384 | 384 | * |
385 | 385 | * The range must be contiguous but may span node boundaries. |
386 | 386 | */ |
387 | -void __init free_bootmem(unsigned long addr, unsigned long size) | |
387 | +void __init free_bootmem(unsigned long physaddr, unsigned long size) | |
388 | 388 | { |
389 | 389 | unsigned long start, end; |
390 | 390 | |
391 | - kmemleak_free_part(__va(addr), size); | |
391 | + kmemleak_free_part(__va(physaddr), size); | |
392 | 392 | |
393 | - start = PFN_UP(addr); | |
394 | - end = PFN_DOWN(addr + size); | |
393 | + start = PFN_UP(physaddr); | |
394 | + end = PFN_DOWN(physaddr + size); | |
395 | 395 | |
396 | 396 | mark_bootmem(start, end, 0, 0); |
397 | 397 | } |