wok rev 881

linux: minimize lzma memory footprint
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jun 06 23:15:25 2008 +0000 (2008-06-06)
parents 9c22e6598e9f
children 29d6ffb622ab
files linux/receipt linux/stuff/linux-lzma-loram-2.6.24.2.u
line diff
     1.1 --- a/linux/receipt	Sat Jun 07 00:48:02 2008 +0200
     1.2 +++ b/linux/receipt	Fri Jun 06 23:15:25 2008 +0000
     1.3 @@ -16,7 +16,7 @@
     1.4  	# lzma and boot patch from pascal
     1.5  	while read patch_file; do
     1.6  		echo "Apply $patch_file"
     1.7 -		patch -p1 < ../stuff/$patch_file
     1.8 +		patch -p1 < ../stuff/$patch_file || return 1
     1.9  	done <<EOT
    1.10  boot-kernel.u
    1.11  $PACKAGE-lzma-$VERSION.u
    1.12 @@ -26,7 +26,7 @@
    1.13  	cp ../stuff/$PACKAGE-$VERSION-slitaz.config .config
    1.14  	while read patch_file; do
    1.15  		echo "Apply $patch_file"
    1.16 -		patch -p1 < ../stuff/$patch_file
    1.17 +		patch -p1 < ../stuff/$patch_file || return 1
    1.18  	done <<EOT
    1.19  config-acpi-$VERSION.u
    1.20  linux-utf8-$VERSION.u
    1.21 @@ -35,6 +35,7 @@
    1.22  config-tun-$VERSION.u
    1.23  config-reiserfs-$VERSION.u
    1.24  config-wireless-$VERSION.u
    1.25 +$PACKAGE-lzma-loram-$VERSION.u
    1.26  EOT
    1.27  	make oldconfig
    1.28  	make bzImage
    1.29 @@ -48,6 +49,7 @@
    1.30      local path
    1.31      mkdir $fs/boot
    1.32      cp -a $src/arch/x86/boot/bzImage $fs/boot/vmlinuz-$VERSION-slitaz
    1.33 +    rdev $fs/boot/vmlinuz-$VERSION-slitaz /dev/ram0
    1.34      # Compress all modules.
    1.35      # Package module-init-tools is compiled with zlib support.
    1.36      #
    1.37 @@ -75,7 +77,7 @@
    1.38  post_install()
    1.39  {
    1.40      echo "Processing post-install commands..."
    1.41 -    depmod -a -b /$1
    1.42 +    depmod -a -b "$1/"
    1.43      echo "----"
    1.44      echo "If you have GRUB installed, you can add tree lines to boot SliTaz."
    1.45      echo "Example /boot/grub/menu.lst"
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/linux/stuff/linux-lzma-loram-2.6.24.2.u	Fri Jun 06 23:15:25 2008 +0000
     2.3 @@ -0,0 +1,227 @@
     2.4 +--- linux-2.6.24.2/init/initramfs.c
     2.5 ++++ linux-2.6.24.2/init/initramfs.c
     2.6 +@@ -468,6 +468,29 @@
     2.7 + }
     2.8 + #endif
     2.9 + 
    2.10 ++#include <linux/initrd.h>
    2.11 ++#ifdef CONFIG_RD_LZMA
    2.12 ++#define INITRD_PAGE ((PAGE_SIZE > 1024*1024) ? PAGE_SIZE : 1024*1024)
    2.13 ++static int fill_offset, fill_total;
    2.14 ++static int fill_buffer(void *buffer, unsigned size)
    2.15 ++{
    2.16 ++	int max =  initrd_end - initrd_start - fill_offset;
    2.17 ++	if (size < max) max = size;
    2.18 ++	memcpy(buffer, (void *)(initrd_start + fill_offset), max);
    2.19 ++	fill_offset += max;
    2.20 ++	fill_total += max;
    2.21 ++	if (fill_offset >= INITRD_PAGE) {
    2.22 ++		unsigned rem = fill_offset % INITRD_PAGE;
    2.23 ++		unsigned end = initrd_start + fill_offset - rem;
    2.24 ++		free_initrd_mem(initrd_start, end);
    2.25 ++		printk(".");
    2.26 ++		initrd_start = end;
    2.27 ++		fill_offset = rem;
    2.28 ++	}
    2.29 ++	return max;
    2.30 ++}
    2.31 ++#endif
    2.32 ++
    2.33 + static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
    2.34 + {
    2.35 + 	int written;
    2.36 +@@ -484,6 +507,9 @@
    2.37 + 	this_header = 0;
    2.38 + 	message = NULL;
    2.39 + 	while (!message && len) {
    2.40 ++#ifdef CONFIG_RD_LZMA
    2.41 ++		int status;
    2.42 ++#endif
    2.43 + 		loff_t saved_offset = this_header;
    2.44 + 		if (*buf == '0' && !(this_header & 3)) {
    2.45 + 			state = Start;
    2.46 +@@ -523,8 +549,20 @@
    2.47 + #ifdef CONFIG_RD_LZMA
    2.48 + 		message = NULL; /* Zero out message, or else cpio will
    2.49 + 				   think an error has already occured */
    2.50 +-		if(!unlzma(buf, len, NULL, flush_buffer, &inptr) < 0 &&
    2.51 +-		   message == NULL) {
    2.52 ++		status = -1;
    2.53 ++		if(buf == (char *) initrd_start) {
    2.54 ++			char *work_buffer = malloc(LZMA_IOBUF_SIZE);
    2.55 ++			if (work_buffer) {
    2.56 ++				fill_total = fill_offset = 0;
    2.57 ++				fill_buffer(work_buffer, LZMA_IOBUF_SIZE);
    2.58 ++				status = unlzma(work_buffer, LZMA_IOBUF_SIZE,
    2.59 ++					fill_buffer, flush_buffer, NULL);
    2.60 ++				inptr = fill_total;
    2.61 ++				free(work_buffer);
    2.62 ++			}
    2.63 ++		}
    2.64 ++		else status = unlzma(buf,len, NULL, flush_buffer, &inptr);
    2.65 ++		if (status == 0 && message == NULL) {
    2.66 + 			goto ok;
    2.67 + 		}
    2.68 + #endif
    2.69 +
    2.70 +--- linux-2.6.24.2/arch/x86/mm/init_32.c
    2.71 ++++ linux-2.6.24.2/arch/x86/mm/init_32.c
    2.72 +@@ -834,7 +834,8 @@
    2.73 + 		free_page(addr);
    2.74 + 		totalram_pages++;
    2.75 + 	}
    2.76 +-	printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
    2.77 ++	if (what)
    2.78 ++		printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
    2.79 + }
    2.80 + 
    2.81 + void free_initmem(void)
    2.82 +@@ -847,7 +848,7 @@
    2.83 + #ifdef CONFIG_BLK_DEV_INITRD
    2.84 + void free_initrd_mem(unsigned long start, unsigned long end)
    2.85 + {
    2.86 +-	free_init_pages("initrd memory", start, end);
    2.87 ++	free_init_pages(NULL, start, end);
    2.88 + }
    2.89 + #endif
    2.90 + 
    2.91 +
    2.92 +--- linux-2.6.24.2/lib/decompress_unlzma.c
    2.93 ++++ linux-2.6.24.2/lib/decompress_unlzma.c
    2.94 +@@ -366,7 +366,8 @@
    2.95 + 		header.dict_size = 1;
    2.96 + 
    2.97 + 	bufsize = MIN(header.dst_size, header.dict_size);
    2.98 +-	buffer = large_malloc(bufsize);
    2.99 ++	buffer = (uint8_t *) posp;
   2.100 ++	if (writebb) buffer = large_malloc(bufsize);
   2.101 + 	if(buffer == NULL)
   2.102 + 		return -1;
   2.103 + 
   2.104 +@@ -394,10 +395,12 @@
   2.105 + 				int match_byte;
   2.106 + 
   2.107 + 				pos = buffer_pos - rep0;
   2.108 +-				while (pos >= header.dict_size)
   2.109 +-					pos += header.dict_size;
   2.110 +-				if(pos >= bufsize) {
   2.111 +-					goto fail;
   2.112 ++				if (writebb) {
   2.113 ++					while (pos >= header.dict_size)
   2.114 ++						pos += header.dict_size;
   2.115 ++					if(pos >= bufsize) {
   2.116 ++						goto fail;
   2.117 ++					}
   2.118 + 				}
   2.119 + 				match_byte = buffer[pos];
   2.120 + 				do {
   2.121 +@@ -419,20 +422,14 @@
   2.122 + 				prob_lit = prob + mi;
   2.123 + 				rc_get_bit(&rc, prob_lit, &mi);
   2.124 + 			}
   2.125 ++			previous_byte = (uint8_t) mi;
   2.126 + 			if (state < 4)
   2.127 + 				state = 0;
   2.128 + 			else if (state < 10)
   2.129 + 				state -= 3;
   2.130 + 			else
   2.131 + 				state -= 6;
   2.132 +-			previous_byte = (uint8_t) mi;
   2.133 +-		one_byte:
   2.134 +-			buffer[buffer_pos++] = previous_byte;
   2.135 +-			if (buffer_pos == header.dict_size) {
   2.136 +-				buffer_pos = 0;
   2.137 +-				global_pos += header.dict_size;
   2.138 +-				writebb((char*)buffer, header.dict_size);
   2.139 +-			}
   2.140 ++			goto store_previous_byte;
   2.141 + 		} else {
   2.142 + 			int offset;
   2.143 + 			uint16_t *prob_len;
   2.144 +@@ -457,14 +454,23 @@
   2.145 + 						rc_update_bit_0(&rc, prob);
   2.146 + 
   2.147 + 						state = state < LZMA_NUM_LIT_STATES ? 9 : 11;
   2.148 +-						pos = buffer_pos - rep0;
   2.149 +-						while (pos >= header.dict_size)
   2.150 +-							pos += header.dict_size;
   2.151 +-						if(pos >= bufsize) {
   2.152 +-							goto fail;
   2.153 ++						pos = buffer_pos - rep0;
   2.154 ++						if (writebb) {
   2.155 ++							while (pos >= header.dict_size)
   2.156 ++								pos += header.dict_size;
   2.157 ++							if(pos >= bufsize) {
   2.158 ++								goto fail;
   2.159 ++							}
   2.160 + 						}
   2.161 + 						previous_byte = buffer[pos];
   2.162 +-						goto one_byte;
   2.163 ++					store_previous_byte:
   2.164 ++						buffer[buffer_pos++] = previous_byte;
   2.165 ++						if (writebb && buffer_pos == header.dict_size) {
   2.166 ++							buffer_pos = 0;
   2.167 ++							global_pos += header.dict_size;
   2.168 ++							writebb((char*)buffer, header.dict_size);
   2.169 ++						}
   2.170 ++						continue;
   2.171 + 					} else {
   2.172 + 						rc_update_bit_1(&rc, prob);
   2.173 + 					}
   2.174 +@@ -566,14 +572,16 @@
   2.175 + 
   2.176 + 			do {
   2.177 + 				pos = buffer_pos - rep0;
   2.178 +-				while (pos >= header.dict_size)
   2.179 +-					pos += header.dict_size;
   2.180 +-				if(pos >= bufsize) {
   2.181 +-					goto fail;
   2.182 ++				if (writebb) {
   2.183 ++					while (pos >= header.dict_size)
   2.184 ++						pos += header.dict_size;
   2.185 ++					if(pos >= bufsize) {
   2.186 ++						goto fail;
   2.187 ++					}
   2.188 + 				}
   2.189 + 				previous_byte = buffer[pos];
   2.190 + 				buffer[buffer_pos++] = previous_byte;
   2.191 +-				if (buffer_pos == header.dict_size) {
   2.192 ++				if (writebb && buffer_pos == header.dict_size) {
   2.193 + 					buffer_pos = 0;
   2.194 + 					global_pos += header.dict_size;
   2.195 + 					writebb((char*)buffer, header.dict_size);
   2.196 +@@ -583,15 +591,17 @@
   2.197 + 		}
   2.198 + 	}
   2.199 + 
   2.200 +-	writebb((char*)buffer, buffer_pos);
   2.201 +-	if(posp) {
   2.202 +-		*posp = rc.ptr-rc.buffer;
   2.203 ++	if (writebb) {
   2.204 ++		writebb((char*)buffer, buffer_pos);
   2.205 ++		if(posp) {
   2.206 ++			*posp = rc.ptr-rc.buffer;
   2.207 ++		}
   2.208 ++		large_free(buffer);
   2.209 + 	}
   2.210 +-	large_free(buffer);
   2.211 + 	large_free(p);
   2.212 + 	return 0;
   2.213 +  fail:
   2.214 +-	large_free(buffer);
   2.215 ++	if (writebb) large_free(buffer);
   2.216 + 	large_free(p);
   2.217 + 	return -1;
   2.218 + }
   2.219 +
   2.220 +--- linux-2.6.24.2/arch/x86/boot/compressed/misc_32.c
   2.221 ++++ linux-2.6.24.2/arch/x86/boot/compressed/misc_32.c
   2.222 +@@ -444,7 +444,7 @@
   2.223 + 
   2.224 + #ifdef CONFIG_KERNEL_LZMA
   2.225 + 	putstr("Unlzmaing Linux... ");
   2.226 +-	unlzma(input_data, input_len-4, NULL, compr_flush, NULL);
   2.227 ++	unlzma(input_data, input_len-4, NULL, NULL, window);
   2.228 + #endif
   2.229 + 
   2.230 + #ifdef CONFIG_KERNEL_GZIP