wok annotate linux/stuff/linux-freeinitrd-2.6.33.4.u @ rev 5578

Up: emacs, emacs-help, emacs-lisp-src (23.2)
author Dominique Corbex <domcox@slitaz.org>
date Sat May 15 20:40:38 2010 +0200 (2010-05-15)
parents
children
rev   line source
pankso@5551 1 --- linux-2.6.30.4/arch/x86/mm/init.c
pankso@5551 2 +++ linux-2.6.30.4/arch/x86/mm/init.c
pankso@5551 3 @@ -381,7 +381,7 @@
pankso@5551 4 */
pankso@5551 5 set_memory_rw(begin, (end - begin) >> PAGE_SHIFT);
pankso@5551 6
pankso@5551 7 - printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
pankso@5551 8 + if (what) printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
pankso@5551 9
pankso@5551 10 for (; addr < end; addr += PAGE_SIZE) {
pankso@5551 11 ClearPageReserved(virt_to_page(addr));
pankso@5551 12
pankso@5551 13 --- linux-2.6.30.4/init/initramfs.c
pankso@5551 14 +++ linux-2.6.30.4/init/initramfs.c
pankso@5551 15 @@ -374,6 +374,52 @@
pankso@5551 16 [Reset] = do_reset,
pankso@5551 17 };
pankso@5551 18
pankso@5551 19 +#include <linux/initrd.h>
pankso@5551 20 +#define INITRD_PAGE ((PAGE_SIZE > 64*1024) ? PAGE_SIZE : 64*1024)
pankso@5551 21 +#define INITRD_DOT (1024*1024)
pankso@5551 22 +
pankso@5551 23 +static void free_rootfs_mem(unsigned long start, unsigned long end)
pankso@5551 24 +{
pankso@5551 25 + free_init_pages(NULL, start, end);
pankso@5551 26 +}
pankso@5551 27 +
pankso@5551 28 +static void _free_initrd(unsigned long initrd_start, unsigned long initrd_end,
pankso@5551 29 + void (*free_initrd_mem)(unsigned long, unsigned long));
pankso@5551 30 +
pankso@5551 31 +static struct {
pankso@5551 32 + int offset, last, inptr, freed;
pankso@5551 33 + char *max;
pankso@5551 34 +} fill;
pankso@5551 35 +
pankso@5551 36 +static void release_inbuf(unsigned n)
pankso@5551 37 +{
pankso@5551 38 + if (n >= INITRD_PAGE) {
pankso@5551 39 + unsigned rem = n % INITRD_PAGE;
pankso@5551 40 + unsigned end = initrd_start + n - rem;
pankso@5551 41 + _free_initrd(initrd_start, end, free_rootfs_mem);
pankso@5551 42 + fill.freed += n - rem;
pankso@5551 43 + if (fill.freed >= INITRD_DOT) {
pankso@5551 44 + fill.freed -= INITRD_DOT;
pankso@5551 45 + printk(".");
pankso@5551 46 + }
pankso@5551 47 + initrd_start = end;
pankso@5551 48 + fill.offset = rem;
pankso@5551 49 + }
pankso@5551 50 +}
pankso@5551 51 +
pankso@5551 52 +static int fill_buffer(void *buffer, unsigned size)
pankso@5551 53 +{
pankso@5551 54 + int max = fill.max - (char *) initrd_start - fill.offset;
pankso@5551 55 + if (max > size) max = size;
pankso@5551 56 + if (max > INITRD_PAGE) max = INITRD_PAGE;
pankso@5551 57 + memcpy(buffer, (void *)(initrd_start + fill.offset), max);
pankso@5551 58 + release_inbuf(fill.offset);
pankso@5551 59 + fill.offset += max;
pankso@5551 60 + fill.inptr += fill.last;
pankso@5551 61 + fill.last = max;
pankso@5551 62 + return max;
pankso@5551 63 +}
pankso@5551 64 +
pankso@5551 65 static int __init write_buffer(char *buf, unsigned len)
pankso@5551 66 {
pankso@5551 67 count = len;
pankso@5551 68 @@ -418,6 +463,7 @@
pankso@5551 69 decompress_fn decompress;
pankso@5551 70 const char *compress_name;
pankso@5551 71 static __initdata char msg_buf[64];
pankso@5551 72 + int early_free_initrd = (buf == (char *) initrd_start);
pankso@5551 73
pankso@5551 74 header_buf = kmalloc(110, GFP_KERNEL);
pankso@5551 75 symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
pankso@5551 76 @@ -431,11 +478,16 @@
pankso@5551 77 message = NULL;
pankso@5551 78 while (!message && len) {
pankso@5551 79 loff_t saved_offset = this_header;
pankso@5551 80 + fill.offset = buf - (char *) initrd_start;
pankso@5551 81 + fill.max = buf + len;
pankso@5551 82 + fill.inptr = fill.last = fill.freed = 0;
pankso@5551 83 if (*buf == '0' && !(this_header & 3)) {
pankso@5551 84 state = Start;
pankso@5551 85 written = write_buffer(buf, len);
pankso@5551 86 buf += written;
pankso@5551 87 len -= written;
pankso@5551 88 + if (early_free_initrd)
pankso@5551 89 + release_inbuf(buf - (char *) initrd_start);
pankso@5551 90 continue;
pankso@5551 91 }
pankso@5551 92 if (!*buf) {
pankso@5551 93 @@ -446,9 +497,15 @@
pankso@5551 94 }
pankso@5551 95 this_header = 0;
pankso@5551 96 decompress = decompress_method(buf, len, &compress_name);
pankso@5551 97 - if (decompress)
pankso@5551 98 - decompress(buf, len, NULL, flush_buffer, NULL,
pankso@5551 99 + if (decompress) {
pankso@5551 100 + if (early_free_initrd) {
pankso@5551 101 + decompress(NULL, 0, fill_buffer, flush_buffer,
pankso@5551 102 + NULL, &my_inptr, error);
pankso@5551 103 + my_inptr += fill.inptr;
pankso@5551 104 + }
pankso@5551 105 + else decompress(buf, len, NULL, flush_buffer, NULL,
pankso@5551 106 &my_inptr, error);
pankso@5551 107 + }
pankso@5551 108 else if (compress_name) {
pankso@5551 109 if (!message) {
pankso@5551 110 snprintf(msg_buf, sizeof msg_buf,
pankso@5551 111 @@ -485,7 +543,8 @@
pankso@5551 112 #include <linux/initrd.h>
pankso@5551 113 #include <linux/kexec.h>
pankso@5551 114
pankso@5551 115 -static void __init free_initrd(void)
pankso@5551 116 +static void _free_initrd(unsigned long initrd_start, unsigned long initrd_end,
pankso@5551 117 + void (*free_initrd_mem)(unsigned long, unsigned long))
pankso@5551 118 {
pankso@5551 119 #ifdef CONFIG_KEXEC
pankso@5551 120 unsigned long crashk_start = (unsigned long)__va(crashk_res.start);
pankso@5551 121 @@ -513,6 +571,12 @@
pankso@5551 122 #endif
pankso@5551 123 free_initrd_mem(initrd_start, initrd_end);
pankso@5551 124 skip:
pankso@5551 125 + ;
pankso@5551 126 +}
pankso@5551 127 +
pankso@5551 128 +static void __init free_initrd(void)
pankso@5551 129 +{
pankso@5551 130 + _free_initrd(initrd_start, initrd_end, free_initrd_mem);
pankso@5551 131 initrd_start = 0;
pankso@5551 132 initrd_end = 0;
pankso@5551 133 }