Commit 81df9bff2609f07cef4690ac2ebda1611b55b05a

Authored by Joonsoo Kim
Committed by Linus Torvalds
1 parent e9b2e78c6a

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
... ... @@ -565,7 +565,7 @@
565 565 fail_db_node:
566 566 of_node_put(smu->db_node);
567 567 fail_bootmem:
568   - free_bootmem((unsigned long)smu, sizeof(struct smu_device));
  568 + free_bootmem(__pa(smu), sizeof(struct smu_device));
569 569 smu = NULL;
570 570 fail_np:
571 571 of_node_put(np);
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,
... ... @@ -161,7 +161,7 @@
161 161 */
162 162 void __init free_bootmem_cpumask_var(cpumask_var_t mask)
163 163 {
164   - free_bootmem((unsigned long)mask, cpumask_size());
  164 + free_bootmem(__pa(mask), cpumask_size());
165 165 }
166 166 #endif
... ... @@ -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 }