init.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <linux/swap.h>
  2. #include <asm/cacheflush.h>
  3. #include <asm/page.h>
  4. #include <asm/sections.h>
  5. #include <asm/system.h>
  6. void free_init_pages(char *what, unsigned long begin, unsigned long end)
  7. {
  8. unsigned long addr = begin;
  9. if (addr >= end)
  10. return;
  11. /*
  12. * If debugging page accesses then do not free this memory but
  13. * mark them not present - any buggy init-section access will
  14. * create a kernel page fault:
  15. */
  16. #ifdef CONFIG_DEBUG_PAGEALLOC
  17. printk(KERN_INFO "debug: unmapping init memory %08lx..%08lx\n",
  18. begin, PAGE_ALIGN(end));
  19. set_memory_np(begin, (end - begin) >> PAGE_SHIFT);
  20. #else
  21. /*
  22. * We just marked the kernel text read only above, now that
  23. * we are going to free part of that, we need to make that
  24. * writeable first.
  25. */
  26. set_memory_rw(begin, (end - begin) >> PAGE_SHIFT);
  27. printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
  28. for (; addr < end; addr += PAGE_SIZE) {
  29. ClearPageReserved(virt_to_page(addr));
  30. init_page_count(virt_to_page(addr));
  31. memset((void *)(addr & ~(PAGE_SIZE-1)),
  32. POISON_FREE_INITMEM, PAGE_SIZE);
  33. free_page(addr);
  34. totalram_pages++;
  35. }
  36. #endif
  37. }
  38. void free_initmem(void)
  39. {
  40. free_init_pages("unused kernel memory",
  41. (unsigned long)(&__init_begin),
  42. (unsigned long)(&__init_end));
  43. }