[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080312144924.769ad73e@crazy>
Date: Wed, 12 Mar 2008 14:49:24 +0100
From: Thomas Petazzoni <thomas.petazzoni@...e-electrons.com>
To: Russell King <rmk@....linux.org.uk>
Cc: akpm@...ux-foundation.org, mm-commits@...r.kernel.org,
dhowells@...hat.com, hpa@...or.com, ink@...assic.park.msu.ru,
kkojima@...iij4u.or.jp, lethal@...ux-sh.org, mingo@...e.hu,
mpm@...enic.com, rc@....org.uk, rth@...ddle.net, starvik@...s.com,
takata@...ux-m32r.org, tglx@...utronix.de,
ysato@...rs.sourceforge.jp,
Byron Bradley <byron.bbradley@...il.com>,
linux-kernel@...r.kernel.org, michael@...e-electrons.com
Subject: Re: + inflate-refactor-inflate-malloc-code.patch added to -mm tree
Hi,
Any comments about this patch ? Could it be included in -mm ?
Thanks,
Thomas
Le Mon, 18 Feb 2008 14:07:04 +0100,
Thomas Petazzoni <thomas.petazzoni@...e-electrons.com> a écrit :
> Thanks for the review. I missed the arch_decomp_wdog() part. The
> updated patch below should fix it (the generic inflate code regularly
> calls arch_decomp_wdog() if ARCH_HAS_DECOMP_WDOG is defined). The
> arch_decomp_wdog() call is still used by the S3C platform (see
> include/asm-arm/plat-s3c/uncompress.h).
>
> The updated patch also fixes the build problem reported by Byron
> Bradley on ARM. On ARM, I renamed free_mem_ptr_end to free_mem_end_ptr
> in order to match the other architectures. I also defined
> free_mem_end_ptr on architectures in which it wasn't defined (CRIS v10
> and CRIS v32).
>
> I compiled/booted the modified kernel on x86 and ARM.
>
> I hope that the patch is better now.
>
> Thanks for your comments and review,
>
> Thomas
>
> ---
>
> inflate: refactor inflate malloc code
>
> Inflate requires some dynamic memory allocation very early in the boot
> process and this is provided with a set of four functions:
> malloc/free/gzip_mark/gzip_release.
>
> The old inflate code used a mark/release strategy rather than
> implement free. This new version instead keeps a count on the number
> of outstanding allocations and when it hits zero, it resets the malloc
> arena.
>
> This allows removing all the mark and release implementations and
> unifying all the malloc/free implementations.
>
> The architecture-dependent code must define two addresses:
> - free_mem_ptr, the address of the beginning of the area in which
> allocations should be made
> - free_mem_end_ptr, the address of the end of the area in which
> allocations should be made. If set to 0, then no check is made on
> the number of allocations, it just grows as much as needed
>
> The architecture-dependent code can also provide an arch_decomp_wdog()
> function call. This function will be called several times during the
> decompression process, and allow to notify the watchdog that the
> system is still running. If an architecture provides such a call, then
> it must define ARCH_HAS_DECOMP_WDOG so that the generic inflate code
> calls arch_decomp_wdog().
>
> Work initially done by Matt Mackall <mpm@...enic.com>, updated to a
> recent version of the kernel by me.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@...e-electrons.com>
>
> ---
> arch/alpha/boot/misc.c | 39 +------------------
> arch/arm/boot/compressed/misc.c | 59
> +++---------------------------
> arch/cris/arch-v10/boot/compressed/misc.c | 35 -----------------
> arch/cris/arch-v32/boot/compressed/misc.c | 35 -----------------
> arch/h8300/boot/compressed/misc.c | 38 -------------------
> arch/m32r/boot/compressed/misc.c | 37 ------------------
> arch/mn10300/boot/compressed/misc.c | 37 ------------------
> arch/sh/boot/compressed/misc_32.c | 38 -------------------
> arch/sh/boot/compressed/misc_64.c | 40 --------------------
> arch/x86/boot/compressed/misc.c | 37 ------------------
> init/do_mounts_rd.c | 25 +-----------
> init/initramfs.c | 22 +----------
> lib/inflate.c | 52
> ++++++++++++++++++++++---- 13 files changed, 60 insertions(+), 434
> deletions(-)
>
> Index: linux/arch/alpha/boot/misc.c
> ===================================================================
> --- linux.orig/arch/alpha/boot/misc.c
> +++ linux/arch/alpha/boot/misc.c
> @@ -78,8 +78,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static char *input_data;
> static int input_data_size;
> @@ -88,51 +86,18 @@
> static ulg output_ptr;
> static ulg bytes_out;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> static void gzip_mark(void **);
> static void gzip_release(void **);
>
> extern int end;
> static ulg free_mem_ptr;
> -static ulg free_mem_ptr_end;
> +static ulg free_mem_end_ptr;
>
> #define HEAP_SIZE 0x3000
>
> #include "../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr <= 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_ptr_end)
> - error("Out of memory");
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* gzip_mark & gzip_release do the free */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> /*
> ===========================================================================
> * Fill the input buffer. This is called only when the buffer is
> empty
> * and at least one byte is really needed.
> @@ -193,7 +158,7 @@
>
> /* FIXME FIXME FIXME */
> free_mem_ptr = (ulg)output_start + ksize;
> - free_mem_ptr_end = (ulg)output_start + ksize +
> 0x200000;
> + free_mem_end_ptr = (ulg)output_start + ksize +
> 0x200000; /* FIXME FIXME FIXME */
>
> /* put in temp area to reduce initial footprint */
> Index: linux/arch/arm/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/arm/boot/compressed/misc.c
> +++ linux/arch/arm/boot/compressed/misc.c
> @@ -217,8 +217,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char input_data[];
> extern char input_data_end[];
> @@ -227,64 +225,21 @@
> static ulg output_ptr;
> static ulg bytes_out;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static void putstr(const char *);
>
> extern int end;
> static ulg free_mem_ptr;
> -static ulg free_mem_ptr_end;
> +static ulg free_mem_end_ptr;
>
> -#define HEAP_SIZE 0x3000
> -
> -#include "../../../../lib/inflate.c"
> -
> -#ifndef STANDALONE_DEBUG
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr <= 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_ptr_end)
> - error("Out of memory");
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* gzip_mark & gzip_release do the free */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - arch_decomp_wdog();
> - *ptr = (void *) free_mem_ptr;
> -}
> +#ifdef STANDALONE_DEBUG
> +#define NO_INFLATE_MALLOC
> +#endif
>
> -static void gzip_release(void **ptr)
> -{
> - arch_decomp_wdog();
> - free_mem_ptr = (long) *ptr;
> -}
> -#else
> -static void gzip_mark(void **ptr)
> -{
> -}
> +#define ARCH_HAS_DECOMP_WDOG
>
> -static void gzip_release(void **ptr)
> -{
> -}
> -#endif
> +#include "../../../../lib/inflate.c"
>
> /*
> ===========================================================================
> * Fill the input buffer. This is called only when the buffer is
> empty @@ -348,7 +303,7 @@
> {
> output_data = (uch *)output_start; /*
> Points to kernel start */ free_mem_ptr =
> free_mem_ptr_p;
> - free_mem_ptr_end = free_mem_ptr_end_p;
> + free_mem_end_ptr = free_mem_ptr_end_p;
> __machine_arch_type = arch_id;
>
> arch_decomp_setup();
> Index: linux/arch/cris/arch-v10/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/cris/arch-v10/boot/compressed/misc.c
> +++ linux/arch/cris/arch-v10/boot/compressed/misc.c
> @@ -84,8 +84,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char *input_data; /* lives in head.S */
>
> @@ -93,11 +91,7 @@
> static uch *output_data;
> static unsigned long output_ptr = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static void puts(const char *);
>
> @@ -105,37 +99,10 @@
>
> extern int end;
> static long free_mem_ptr = (long)&end;
> +static long free_mem_end_ptr = 0;
>
> #include "../../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> /* decompressor info and error messages to serial console */
>
> static void
> Index: linux/arch/cris/arch-v32/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/cris/arch-v32/boot/compressed/misc.c
> +++ linux/arch/cris/arch-v32/boot/compressed/misc.c
> @@ -89,8 +89,6 @@
>
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char *input_data; /* lives in head.S */
>
> @@ -98,11 +96,7 @@
> static uch *output_data;
> static unsigned long output_ptr = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static void puts(const char *);
>
> @@ -110,37 +104,10 @@
>
> extern int _end;
> static long free_mem_ptr = (long)&_end;
> +static long free_mem_end_ptr = 0;
>
> #include "../../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> /* decompressor info and error messages to serial console */
>
> static inline void
> Index: linux/arch/h8300/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/h8300/boot/compressed/misc.c
> +++ linux/arch/h8300/boot/compressed/misc.c
> @@ -67,8 +67,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char input_data[];
> extern int input_len;
> @@ -77,11 +75,7 @@
> static uch *output_data;
> static unsigned long output_ptr = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> int puts(const char *);
>
> @@ -98,38 +92,6 @@
> #define TDR *((volatile unsigned char *)0xffff8b)
> #define SSR *((volatile unsigned char *)0xffff8c)
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr == 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("Out of memory");
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> int puts(const char *s)
> {
> return 0;
> Index: linux/arch/m32r/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/m32r/boot/compressed/misc.c
> +++ linux/arch/m32r/boot/compressed/misc.c
> @@ -70,8 +70,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static unsigned char *input_data;
> static int input_len;
> @@ -82,9 +80,6 @@
>
> #include "m32r_sio.c"
>
> -static void *malloc(int size);
> -static void free(void *where);
> -
> static unsigned long free_mem_ptr;
> static unsigned long free_mem_end_ptr;
>
> @@ -92,38 +87,6 @@
>
> #include "../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr == 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("Out of memory");
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> void* memset(void* s, int c, size_t n)
> {
> int i;
> Index: linux/arch/mn10300/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/mn10300/boot/compressed/misc.c
> +++ linux/arch/mn10300/boot/compressed/misc.c
> @@ -153,26 +153,9 @@
> static unsigned long output_ptr;
>
>
> -static void *malloc(int size);
> -
> -static inline void free(void *where)
> -{ /* Don't care */
> -}
> -
> static unsigned long free_mem_ptr = (unsigned long) &end;
> static unsigned long free_mem_end_ptr = (unsigned long) &end +
> 0x90000;
> -static inline void gzip_mark(void **ptr)
> -{
> - kputs(".");
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static inline void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (unsigned long) *ptr;
> -}
> -
> #define INPLACE_MOVE_ROUTINE 0x1000
> #define LOW_BUFFER_START 0x2000
> #define LOW_BUFFER_END 0x90000
> @@ -186,26 +169,6 @@
>
> #include "../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size < 0)
> - error("Malloc error\n");
> - if (!free_mem_ptr)
> - error("Memory error\n");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *) free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("\nOut of memory\n");
> -
> - return p;
> -}
> -
> static inline void scroll(void)
> {
> int i;
> Index: linux/arch/sh/boot/compressed/misc_32.c
> ===================================================================
> --- linux.orig/arch/sh/boot/compressed/misc_32.c
> +++ linux/arch/sh/boot/compressed/misc_32.c
> @@ -74,8 +74,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char input_data[];
> extern int input_len;
> @@ -84,11 +82,7 @@
> static uch *output_data;
> static unsigned long output_ptr = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> int puts(const char *);
>
> @@ -101,38 +95,6 @@
>
> #include "../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr == 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("Out of memory");
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> #ifdef CONFIG_SH_STANDARD_BIOS
> size_t strlen(const char *s)
> {
> Index: linux/arch/sh/boot/compressed/misc_64.c
> ===================================================================
> --- linux.orig/arch/sh/boot/compressed/misc_64.c
> +++ linux/arch/sh/boot/compressed/misc_64.c
> @@ -72,8 +72,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> extern char input_data[];
> extern int input_len;
> @@ -82,11 +80,7 @@
> static uch *output_data;
> static unsigned long output_ptr = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> static void puts(const char *);
>
> @@ -99,40 +93,6 @@
>
> #include "../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size < 0)
> - error("Malloc error\n");
> - if (free_mem_ptr == 0)
> - error("Memory error\n");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *) free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("\nOut of memory\n");
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (long) *ptr;
> -}
> -
> void puts(const char *s)
> {
> }
> Index: linux/arch/x86/boot/compressed/misc.c
> ===================================================================
> --- linux.orig/arch/x86/boot/compressed/misc.c
> +++ linux/arch/x86/boot/compressed/misc.c
> @@ -168,8 +168,6 @@
> static int fill_inbuf(void);
> static void flush_window(void);
> static void error(char *m);
> -static void gzip_mark(void **);
> -static void gzip_release(void **);
>
> /*
> * This is set up by the setup-routine at boot-time
> @@ -187,9 +185,6 @@
>
> static long bytes_out = 0;
>
> -static void *malloc(int size);
> -static void free(void *where);
> -
> static void *memset(void *s, int c, unsigned n);
> static void *memcpy(void *dest, const void *src, unsigned n);
>
> @@ -220,38 +215,6 @@
>
> #include "../../../../lib/inflate.c"
>
> -static void *malloc(int size)
> -{
> - void *p;
> -
> - if (size <0) error("Malloc error");
> - if (free_mem_ptr <= 0) error("Memory error");
> -
> - free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
> -
> - p = (void *)free_mem_ptr;
> - free_mem_ptr += size;
> -
> - if (free_mem_ptr >= free_mem_end_ptr)
> - error("Out of memory");
> -
> - return p;
> -}
> -
> -static void free(void *where)
> -{ /* Don't care */
> -}
> -
> -static void gzip_mark(void **ptr)
> -{
> - *ptr = (void *) free_mem_ptr;
> -}
> -
> -static void gzip_release(void **ptr)
> -{
> - free_mem_ptr = (memptr) *ptr;
> -}
> -
> static void scroll(void)
> {
> int i;
> Index: linux/init/do_mounts_rd.c
> ===================================================================
> --- linux.orig/init/do_mounts_rd.c
> +++ linux/init/do_mounts_rd.c
> @@ -313,32 +313,11 @@
>
> static int __init fill_inbuf(void);
> static void __init flush_window(void);
> -static void __init *malloc(size_t size);
> -static void __init free(void *where);
> static void __init error(char *m);
> -static void __init gzip_mark(void **);
> -static void __init gzip_release(void **);
>
> -#include "../lib/inflate.c"
> -
> -static void __init *malloc(size_t size)
> -{
> - return kmalloc(size, GFP_KERNEL);
> -}
> -
> -static void __init free(void *where)
> -{
> - kfree(where);
> -}
> -
> -static void __init gzip_mark(void **ptr)
> -{
> -}
> -
> -static void __init gzip_release(void **ptr)
> -{
> -}
> +#define NO_INFLATE_MALLOC
>
> +#include "../lib/inflate.c"
>
> /*
> ===========================================================================
> * Fill the input buffer. This is called only when the buffer is
> empty Index: linux/init/initramfs.c
> ===================================================================
> --- linux.orig/init/initramfs.c
> +++ linux/init/initramfs.c
> @@ -14,16 +14,6 @@
> message = x;
> }
>
> -static void __init *malloc(size_t size)
> -{
> - return kmalloc(size, GFP_KERNEL);
> -}
> -
> -static void __init free(void *where)
> -{
> - kfree(where);
> -}
> -
> /* link hash */
>
> #define N_ALIGN(len) ((((len) + 1) & ~3) + 2)
> @@ -407,18 +397,10 @@
>
> static void __init flush_window(void);
> static void __init error(char *m);
> -static void __init gzip_mark(void **);
> -static void __init gzip_release(void **);
>
> -#include "../lib/inflate.c"
> +#define NO_INFLATE_MALLOC
>
> -static void __init gzip_mark(void **ptr)
> -{
> -}
> -
> -static void __init gzip_release(void **ptr)
> -{
> -}
> +#include "../lib/inflate.c"
>
> /*
> ===========================================================================
> * Write the output window window[0..outcnt-1] and update crc and
> bytes_out. Index: linux/lib/inflate.c
> ===================================================================
> --- linux.orig/lib/inflate.c
> +++ linux/lib/inflate.c
> @@ -230,6 +230,45 @@
> #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
> #define DUMPBITS(n) {b>>=(n);k-=(n);}
>
> +#ifndef NO_INFLATE_MALLOC
> +/* A trivial malloc implementation, adapted from
> + * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
> + */
> +
> +static unsigned long malloc_ptr;
> +static int malloc_count;
> +
> +static void *malloc(int size)
> +{
> + void *p;
> +
> + if (size <0)
> + error("Malloc error");
> + if (!malloc_ptr)
> + malloc_ptr = free_mem_ptr;
> +
> + malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */
> +
> + p = (void *)malloc_ptr;
> + malloc_ptr += size;
> +
> + if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
> + error("Out of memory");
> +
> + malloc_count++;
> + return p;
> +}
> +
> +static void free(void *where)
> +{
> + malloc_count--;
> + if (!malloc_count)
> + malloc_ptr = free_mem_ptr;
> +}
> +#else
> +#define malloc(a) kmalloc(a, GFP_KERNEL)
> +#define free(a) kfree(a)
> +#endif
>
> /*
> Huffman code decoding is performed using a multi-level table
> lookup. @@ -1042,7 +1081,6 @@
> int e; /* last block flag */
> int r; /* result code */
> unsigned h; /* maximum struct huft's malloc'ed */
> - void *ptr;
>
> /* initialize window, bit buffer */
> wp = 0;
> @@ -1054,12 +1092,12 @@
> h = 0;
> do {
> hufts = 0;
> - gzip_mark(&ptr);
> - if ((r = inflate_block(&e)) != 0) {
> - gzip_release(&ptr);
> - return r;
> - }
> - gzip_release(&ptr);
> +#ifdef ARCH_HAS_DECOMP_WDOG
> + arch_decomp_wdog();
> +#endif
> + r = inflate_block(&e);
> + if (r)
> + return r;
> if (hufts > h)
> h = hufts;
> } while (!e);
>
>
--
Thomas Petazzoni, Free Electrons
Free Embedded Linux Training Materials
on http://free-electrons.com/training
(More than 1500 pages!)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists