From 1f24cd1700272f566ece8cbcde509494ccb894d0 Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
Date: Mon, 23 Nov 2009 22:30:42 +0000
Subject: [PATCH] update compcache to 0.5.4 (#6018)

SVN-Revision: 18512
---
 package/compcache/Config.in                   |  30 +
 package/compcache/Makefile                    |  36 +-
 package/compcache/files/compcache.config      |   5 +-
 package/compcache/files/compcache.init        |  28 +-
 .../patches/000-provide_lzo_kmod.patch        | 662 ++++++++++++++++++
 package/compcache/patches/001-lzo-speed.patch |  32 +-
 .../patches/002-compact_lzo-codec.patch       |  30 -
 .../patches/100-use_register_width.patch      |  24 +
 .../patches/200-av_compress_ratio.patch       |  39 ++
 9 files changed, 813 insertions(+), 73 deletions(-)
 create mode 100644 package/compcache/Config.in
 create mode 100644 package/compcache/patches/000-provide_lzo_kmod.patch
 delete mode 100644 package/compcache/patches/002-compact_lzo-codec.patch
 create mode 100644 package/compcache/patches/100-use_register_width.patch
 create mode 100644 package/compcache/patches/200-av_compress_ratio.patch

diff --git a/package/compcache/Config.in b/package/compcache/Config.in
new file mode 100644
index 000000000000..9904237edc6c
--- /dev/null
+++ b/package/compcache/Config.in
@@ -0,0 +1,30 @@
+# compcache configuration
+
+config COMPCACHE_ENABLE
+	bool "enabled on boot"
+	default n
+	depends on PACKAGE_kmod-compcache
+	help
+	  Enables compressed ram swap devices.
+
+config COMPCACHE_RAM_REPORTED
+	string "swap space reported to kernel in kb"
+	depends on PACKAGE_kmod-compcache
+	default "2048"
+	help
+	  This is the amount of memory that will be reported 
+	  to the kernel as swap. The real ram in use will differ, 
+	  because of lzo compression.
+	  Example:
+	    16 MB = 2048 KB 
+	    32 MB = 4098 KB
+
+config COMPCACHE_BACKUP_DEV
+	string "Backup device for compcache"
+	depends on PACKAGE_kmod-compcache
+	default ""
+	help
+	  Compcache will use this as a backup device for swap.
+	  Example:
+	         /dev/sda5
+
diff --git a/package/compcache/Makefile b/package/compcache/Makefile
index a4d845100818..8ca581b3d12a 100644
--- a/package/compcache/Makefile
+++ b/package/compcache/Makefile
@@ -1,21 +1,19 @@
 #
-# Copyright (C) 2006 OpenWrt.org
+# Copyright (C) 2009 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
 #
-# $Id: Makefile 6562 2009-01-21 11:19:24 ghd $
+# $Id: Makefile 6562 2009-10-05 08:30:14 ghd $
 
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=compcache
-PKG_VERSION:=0.5
+PKG_VERSION:=0.5.4
 PKG_RELEASE:=$(PKG_VERSION)-1
 PKG_SOURCE_URL:=http://compcache.googlecode.com/files/
-PKG_MD5SUM:=eea73324e9e69178866f6c0fbc852f1f
-
-#PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)
+PKG_MD5SUM:=e83535925a014ac34e1eaeb4f7a2f49a
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 
@@ -26,18 +24,18 @@ define KernelPackage/compcache
   DEPENDS:=@LINUX_2_6 @BUSYBOX_CONFIG_SWAPONOFF
   TITLE:=Driver for compressed ram swap device
   VERSION:=$(LINUX_VERSION)-$(BOARD)-$(LINUX_RELEASE)+$(PKG_RELEASE)
-  FILES:=$(PKG_BUILD_DIR)/compcache.$(LINUX_KMOD_SUFFIX) \
-         $(PKG_BUILD_DIR)/sub-projects/compression/lzo-kmod/lzo1x.$(LINUX_KMOD_SUFFIX) \
-	 $(PKG_BUILD_DIR)/sub-projects/allocators/xvmalloc-kmod/xvmalloc.$(LINUX_KMOD_SUFFIX)
-#  AUTOLOAD:=$(call AutoLoad,10,xvmalloc lzo1x compcache+compcache_size_kbytes=2048)
+  FILES:=$(PKG_BUILD_DIR)/ramzswap.$(LINUX_KMOD_SUFFIX) \
+	  $(PKG_BUILD_DIR)/sub-projects/compression/lzo-kmod/lzo1x.$(LINUX_KMOD_SUFFIX) \
+	  $(PKG_BUILD_DIR)/sub-projects/allocators/xvmalloc-kmod/xvmalloc.$(LINUX_KMOD_SUFFIX)
 endef
 
-BUILDFLAGS:=-DCONFIG_BLK_DEV_COMPCACHE_DEBUG=0 \
-	    -DCONFIG_BLK_DEV_COMPCACHE_STATS=1 \
-	    -DCONFIG_XV_DEBUG=0 \
-	    -DCONFIG_XV_STATS=1 \
-	    -g -Wall
+XVM = sub-projects/allocators/xvmalloc-kmod
+LZO = sub-projects/compression/lzo-kmod
 
+BUILDFLAGS:=-DCONFIG_BLK_DEV_RAMZSWAP_STATS \
+	    -I$(PKG_BUILD_DIR)/$(XVM) \
+	    -I$(PKG_BUILD_DIR)/$(LZO) \
+	    -g -Wall
 
 define Build/Compile
 	$(MAKE) -C "$(LINUX_DIR)" \
@@ -52,8 +50,16 @@ endef
 define KernelPackage/compcache/install
 	$(INSTALL_DIR) $(1)/etc/config
 	$(INSTALL_DATA) ./files/compcache.config $(1)/etc/config/compcache
+	$(SED) 's,%ENABLED%,$(if $(CONFIG_COMPCACHE_ENABLE),1,0),g' \
+	      -e 's,%RAM_REPORTED%,$(call qstrip,$(CONFIG_COMPCACHE_RAM_REPORTED)),g' \
+	      -e 's,%BACKUP_DEV%,$(call qstrip,$(CONFIG_COMPCACHE_BACKUP_DEV)),g' \
+	      $(1)/etc/config/compcache
 	$(INSTALL_DIR) $(1)/etc/init.d
 	$(INSTALL_BIN) ./files/compcache.init $(1)/etc/init.d/compcache
 endef
 
+define KernelPackage/compcache/config
+	source "$(SOURCE)/Config.in"
+endef
+
 $(eval $(call KernelPackage,compcache))
diff --git a/package/compcache/files/compcache.config b/package/compcache/files/compcache.config
index 96ee19284acb..3faab3e140af 100644
--- a/package/compcache/files/compcache.config
+++ b/package/compcache/files/compcache.config
@@ -1,3 +1,4 @@
 config compcache
-	option 'enabled'	'0'
-	option 'size_kbytes'	'2048'
+	option 'enabled'	'%ENABLED%'
+	option 'size_kbytes'	'%RAM_REPORTED%'
+	option 'backup_dev'	'%BACKUP_DEV%'
diff --git a/package/compcache/files/compcache.init b/package/compcache/files/compcache.init
index 5c85e5ddd214..b9406d108c6e 100644
--- a/package/compcache/files/compcache.init
+++ b/package/compcache/files/compcache.init
@@ -1,18 +1,28 @@
 #!/bin/sh /etc/rc.common
 # Copyright (C) 2008 OpenWrt.org
-START=19
+START=14
 
 load_modules() {
 	local section="$1"
 	config_get "size_kbytes" "$section" "size_kbytes"
+	config_get "backup_dev" "$section" "backup_dev"
+	#CC_PARAM_STR="memlimit_kb=$1 backing_dev=$BACKING_DEV"
 	config_get_bool "enabled" "$section" "enabled" '1'
 	if [ "$enabled" -gt 0 ]; then
-		if [ "`lsmod | grep 'compcache'`" != "" ]; then
-			echo "compcache allready loaded"
+		if [ "`cat /proc/swaps | grep 'ramzswap0'`" != "" ]; then
+			echo "compcache already loaded"
 		else
-			insmod xvmalloc
-			insmod lzo1x
-			insmod compcache compcache_size_kbytes=$size_kbytes
+			if [ "$backup_dev" != "" ]; then
+				params_set="memlimit_kb=$size_kbytes backing_swap=$backup_dev"
+			else
+				params_set="disksize_kb=$size_kbytes"
+			fi
+			if [ "`lsmod | grep 'ramzswap'`" == "" ]; then
+				insmod xvmalloc
+				insmod lzo1x
+				insmod ramzswap $params_set
+				swapon /dev/ramzswap0
+			fi
 		fi
 	fi
 }
@@ -22,9 +32,9 @@ remove_modules() {
 	config_get_bool "enabled" "$section" "enabled" '1'
 	if [ "$enabled" -gt 0 ]; then
 		[ "`cat /proc/swaps | grep 'ramzswap0'`" != "" ] && swapoff /dev/ramzswap0
-		[ "`lsmod | grep 'compcache'`" != "" ] && rmmod compcache > /dev/null
-		[ "`lsmod | grep 'lzo1x'`" != "" ] && rmmod lzo1x > /dev/null
-		[ "`lsmod | grep 'xvmalloc'`" != "" ] && rmmod xvmalloc > /dev/null
+		[ "`lsmod | grep 'ramzswap'`" != "" ] && rmmod ramzswap &> /dev/null
+		[ "`lsmod | grep 'lzo1x'`" != "" ] && rmmod lzo1x &> /dev/null
+		[ "`lsmod | grep 'xvmalloc'`" != "" ] && rmmod xvmalloc &> /dev/null
 	fi
 }
 
diff --git a/package/compcache/patches/000-provide_lzo_kmod.patch b/package/compcache/patches/000-provide_lzo_kmod.patch
new file mode 100644
index 000000000000..1ad4fb63a470
--- /dev/null
+++ b/package/compcache/patches/000-provide_lzo_kmod.patch
@@ -0,0 +1,662 @@
+diff -uNr compcache-0.5.4-old/Makefile compcache-0.5.4/Makefile
+--- compcache-0.5.4-old/Makefile	2009-10-17 08:49:42.000000000 +0200
++++ compcache-0.5.4/Makefile	2009-10-17 09:39:34.000000000 +0200
+@@ -1,19 +1,26 @@
+ KERNEL_BUILD_PATH ?= "/lib/modules/$(shell uname -r)/build"
+ 
+ XVM = sub-projects/allocators/xvmalloc-kmod
+-EXTRA_CFLAGS	:=	-DCONFIG_BLK_DEV_RAMZSWAP_STATS	\
+-			-I$(PWD)/$(XVM)			\
++LZO = sub-projects/compression/lzo-kmod
++
++EXTRA_CFLAGS	+=	-DCONFIG_BLK_DEV_RAMZSWAP_STATS \
++			-I$(PWD)/$(XVM) \
++			-I$(PWD)/$(LZO) \
+ 			-g -Wall
+ 
+ obj-m	+=	$(XVM)/xvmalloc.o \
++		$(LZO)/lzo1x.o \
+ 		ramzswap.o
+ 
+ all:
+ 	make -C $(KERNEL_BUILD_PATH) M=$(PWD)/$(XVM) modules
++	make -C $(KERNEL_BUILD_PATH) M=$(PWD)/$(LZO) modules
+ 	make -C $(KERNEL_BUILD_PATH) M=$(PWD) modules
+ 	@ln -sf $(XVM)/xvmalloc.ko
++	@ln -sf $(LZO)/xvmalloc.ko
+ 
+ clean:
+ 	make -C $(KERNEL_BUILD_PATH) M=$(PWD) clean
+ 	make -C $(KERNEL_BUILD_PATH) M=$(PWD)/$(XVM) clean
++	make -C $(KERNEL_BUILD_PATH) M=$(PWD)/$(LZO) clean
+ 	@rm -rf *.ko
+diff -uNr compcache-0.5.4-old/ramzswap.c compcache-0.5.4/ramzswap.c
+--- compcache-0.5.4-old/ramzswap.c	2009-10-17 08:50:06.000000000 +0200
++++ compcache-0.5.4/ramzswap.c	2009-10-17 09:35:59.000000000 +0200
+@@ -20,7 +20,6 @@
+ #include <linux/device.h>
+ #include <linux/genhd.h>
+ #include <linux/highmem.h>
+-#include <linux/lzo.h>
+ #include <linux/mutex.h>
+ #include <linux/proc_fs.h>
+ #include <linux/string.h>
+diff -uNr compcache-0.5.4-old/ramzswap.h compcache-0.5.4/ramzswap.h
+--- compcache-0.5.4-old/ramzswap.h	2009-10-17 08:50:06.000000000 +0200
++++ compcache-0.5.4/ramzswap.h	2009-10-17 09:40:45.000000000 +0200
+@@ -16,6 +16,7 @@
+ #define _RAMZSWAP_H_
+ 
+ #include "xvmalloc.h"
++#include "lzo.h"
+ 
+ /*
+  * Stored at beginning of each compressed object.
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x.c compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x.c
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x.c	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x.c	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,7 @@
++#include <linux/module.h>
++
++#include "lzo1x_compress.c"
++#include "lzo1x_decompress.c"
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("LZO1X Lib");
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x_compress.c compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x_compress.c
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x_compress.c	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x_compress.c	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,227 @@
++/*
++ *  LZO1X Compressor from MiniLZO
++ *
++ *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
++ *
++ *  The full LZO package can be found at:
++ *  http://www.oberhumer.com/opensource/lzo/
++ *
++ *  Changed for kernel use by:
++ *  Nitin Gupta <nitingupta910@gmail.com>
++ *  Richard Purdie <rpurdie@openedhand.com>
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <asm/unaligned.h>
++
++#include "lzodefs.h"
++#include "lzo.h"
++
++static noinline size_t
++_lzo1x_1_do_compress(const unsigned char *in, size_t in_len,
++		unsigned char *out, size_t *out_len, void *wrkmem)
++{
++	const unsigned char * const in_end = in + in_len;
++	const unsigned char * const ip_end = in + in_len - M2_MAX_LEN - 5;
++	const unsigned char ** const dict = wrkmem;
++	const unsigned char *ip = in, *ii = ip;
++	const unsigned char *end, *m, *m_pos;
++	size_t m_off, m_len, dindex;
++	unsigned char *op = out;
++
++	ip += 4;
++
++	for (;;) {
++		dindex = ((size_t)(0x21 * DX3(ip, 5, 5, 6)) >> 5) & D_MASK;
++		m_pos = dict[dindex];
++
++		if (m_pos < in)
++			goto literal;
++
++		if (ip == m_pos || ((size_t)(ip - m_pos) > M4_MAX_OFFSET))
++			goto literal;
++
++		m_off = ip - m_pos;
++		if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
++			goto try_match;
++
++		dindex = (dindex & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f);
++		m_pos = dict[dindex];
++
++		if (m_pos < in)
++			goto literal;
++
++		if (ip == m_pos || ((size_t)(ip - m_pos) > M4_MAX_OFFSET))
++			goto literal;
++
++		m_off = ip - m_pos;
++		if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
++			goto try_match;
++
++		goto literal;
++
++try_match:
++		if (get_unaligned((const unsigned short *)m_pos)
++				== get_unaligned((const unsigned short *)ip)) {
++			if (likely(m_pos[2] == ip[2]))
++					goto match;
++		}
++
++literal:
++		dict[dindex] = ip;
++		++ip;
++		if (unlikely(ip >= ip_end))
++			break;
++		continue;
++
++match:
++		dict[dindex] = ip;
++		if (ip != ii) {
++			size_t t = ip - ii;
++
++			if (t <= 3) {
++				op[-2] |= t;
++			} else if (t <= 18) {
++				*op++ = (t - 3);
++			} else {
++				size_t tt = t - 18;
++
++				*op++ = 0;
++				while (tt > 255) {
++					tt -= 255;
++					*op++ = 0;
++				}
++				*op++ = tt;
++			}
++			do {
++				*op++ = *ii++;
++			} while (--t > 0);
++		}
++
++		ip += 3;
++		if (m_pos[3] != *ip++ || m_pos[4] != *ip++
++				|| m_pos[5] != *ip++ || m_pos[6] != *ip++
++				|| m_pos[7] != *ip++ || m_pos[8] != *ip++) {
++			--ip;
++			m_len = ip - ii;
++
++			if (m_off <= M2_MAX_OFFSET) {
++				m_off -= 1;
++				*op++ = (((m_len - 1) << 5)
++						| ((m_off & 7) << 2));
++				*op++ = (m_off >> 3);
++			} else if (m_off <= M3_MAX_OFFSET) {
++				m_off -= 1;
++				*op++ = (M3_MARKER | (m_len - 2));
++				goto m3_m4_offset;
++			} else {
++				m_off -= 0x4000;
++
++				*op++ = (M4_MARKER | ((m_off & 0x4000) >> 11)
++						| (m_len - 2));
++				goto m3_m4_offset;
++			}
++		} else {
++			end = in_end;
++			m = m_pos + M2_MAX_LEN + 1;
++
++			while (ip < end && *m == *ip) {
++				m++;
++				ip++;
++			}
++			m_len = ip - ii;
++
++			if (m_off <= M3_MAX_OFFSET) {
++				m_off -= 1;
++				if (m_len <= 33) {
++					*op++ = (M3_MARKER | (m_len - 2));
++				} else {
++					m_len -= 33;
++					*op++ = M3_MARKER | 0;
++					goto m3_m4_len;
++				}
++			} else {
++				m_off -= 0x4000;
++				if (m_len <= M4_MAX_LEN) {
++					*op++ = (M4_MARKER
++						| ((m_off & 0x4000) >> 11)
++						| (m_len - 2));
++				} else {
++					m_len -= M4_MAX_LEN;
++					*op++ = (M4_MARKER
++						| ((m_off & 0x4000) >> 11));
++m3_m4_len:
++					while (m_len > 255) {
++						m_len -= 255;
++						*op++ = 0;
++					}
++
++					*op++ = (m_len);
++				}
++			}
++m3_m4_offset:
++			*op++ = ((m_off & 63) << 2);
++			*op++ = (m_off >> 6);
++		}
++
++		ii = ip;
++		if (unlikely(ip >= ip_end))
++			break;
++	}
++
++	*out_len = op - out;
++	return in_end - ii;
++}
++
++int lzo1x_1_compress(const unsigned char *in, size_t in_len, unsigned char *out,
++			size_t *out_len, void *wrkmem)
++{
++	const unsigned char *ii;
++	unsigned char *op = out;
++	size_t t;
++
++	if (unlikely(in_len <= M2_MAX_LEN + 5)) {
++		t = in_len;
++	} else {
++		t = _lzo1x_1_do_compress(in, in_len, op, out_len, wrkmem);
++		op += *out_len;
++	}
++
++	if (t > 0) {
++		ii = in + in_len - t;
++
++		if (op == out && t <= 238) {
++			*op++ = (17 + t);
++		} else if (t <= 3) {
++			op[-2] |= t;
++		} else if (t <= 18) {
++			*op++ = (t - 3);
++		} else {
++			size_t tt = t - 18;
++
++			*op++ = 0;
++			while (tt > 255) {
++				tt -= 255;
++				*op++ = 0;
++			}
++
++			*op++ = tt;
++		}
++		do {
++			*op++ = *ii++;
++		} while (--t > 0);
++	}
++
++	*op++ = M4_MARKER | 1;
++	*op++ = 0;
++	*op++ = 0;
++
++	*out_len = op - out;
++	return LZO_E_OK;
++}
++EXPORT_SYMBOL_GPL(lzo1x_1_compress);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("LZO1X-1 Compressor");
++
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x_decompress.c compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,255 @@
++/*
++ *  LZO1X Decompressor from MiniLZO
++ *
++ *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
++ *
++ *  The full LZO package can be found at:
++ *  http://www.oberhumer.com/opensource/lzo/
++ *
++ *  Changed for kernel use by:
++ *  Nitin Gupta <nitingupta910@gmail.com>
++ *  Richard Purdie <rpurdie@openedhand.com>
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <asm/byteorder.h>
++#include <asm/unaligned.h>
++
++#include "lzodefs.h"
++#include "lzo.h"
++
++#define HAVE_IP(x, ip_end, ip) ((size_t)(ip_end - ip) < (x))
++#define HAVE_OP(x, op_end, op) ((size_t)(op_end - op) < (x))
++#define HAVE_LB(m_pos, out, op) (m_pos < out || m_pos >= op)
++
++#define COPY4(dst, src)	\
++		put_unaligned(get_unaligned((const u32 *)(src)), (u32 *)(dst))
++
++int lzo1x_decompress_safe(const unsigned char *in, size_t in_len,
++			unsigned char *out, size_t *out_len)
++{
++	const unsigned char * const ip_end = in + in_len;
++	unsigned char * const op_end = out + *out_len;
++	const unsigned char *ip = in, *m_pos;
++	unsigned char *op = out;
++	size_t t;
++
++	*out_len = 0;
++
++	if (*ip > 17) {
++		t = *ip++ - 17;
++		if (t < 4)
++			goto match_next;
++		if (HAVE_OP(t, op_end, op))
++			goto output_overrun;
++		if (HAVE_IP(t + 1, ip_end, ip))
++			goto input_overrun;
++		do {
++			*op++ = *ip++;
++		} while (--t > 0);
++		goto first_literal_run;
++	}
++
++	while ((ip < ip_end)) {
++		t = *ip++;
++		if (t >= 16)
++			goto match;
++		if (t == 0) {
++			if (HAVE_IP(1, ip_end, ip))
++				goto input_overrun;
++			while (*ip == 0) {
++				t += 255;
++				ip++;
++				if (HAVE_IP(1, ip_end, ip))
++					goto input_overrun;
++			}
++			t += 15 + *ip++;
++		}
++		if (HAVE_OP(t + 3, op_end, op))
++			goto output_overrun;
++		if (HAVE_IP(t + 4, ip_end, ip))
++			goto input_overrun;
++
++		COPY4(op, ip);
++		op += 4;
++		ip += 4;
++		if (--t > 0) {
++			if (t >= 4) {
++				do {
++					COPY4(op, ip);
++					op += 4;
++					ip += 4;
++					t -= 4;
++				} while (t >= 4);
++				if (t > 0) {
++					do {
++						*op++ = *ip++;
++					} while (--t > 0);
++				}
++			} else {
++				do {
++					*op++ = *ip++;
++				} while (--t > 0);
++			}
++		}
++
++first_literal_run:
++		t = *ip++;
++		if (t >= 16)
++			goto match;
++		m_pos = op - (1 + M2_MAX_OFFSET);
++		m_pos -= t >> 2;
++		m_pos -= *ip++ << 2;
++
++		if (HAVE_LB(m_pos, out, op))
++			goto lookbehind_overrun;
++
++		if (HAVE_OP(3, op_end, op))
++			goto output_overrun;
++		*op++ = *m_pos++;
++		*op++ = *m_pos++;
++		*op++ = *m_pos;
++
++		goto match_done;
++
++		do {
++match:
++			if (t >= 64) {
++				m_pos = op - 1;
++				m_pos -= (t >> 2) & 7;
++				m_pos -= *ip++ << 3;
++				t = (t >> 5) - 1;
++				if (HAVE_LB(m_pos, out, op))
++					goto lookbehind_overrun;
++				if (HAVE_OP(t + 3 - 1, op_end, op))
++					goto output_overrun;
++				goto copy_match;
++			} else if (t >= 32) {
++				t &= 31;
++				if (t == 0) {
++					if (HAVE_IP(1, ip_end, ip))
++						goto input_overrun;
++					while (*ip == 0) {
++						t += 255;
++						ip++;
++						if (HAVE_IP(1, ip_end, ip))
++							goto input_overrun;
++					}
++					t += 31 + *ip++;
++				}
++				m_pos = op - 1;
++				m_pos -= le16_to_cpu(get_unaligned(
++					(const unsigned short *)ip)) >> 2;
++				ip += 2;
++			} else if (t >= 16) {
++				m_pos = op;
++				m_pos -= (t & 8) << 11;
++
++				t &= 7;
++				if (t == 0) {
++					if (HAVE_IP(1, ip_end, ip))
++						goto input_overrun;
++					while (*ip == 0) {
++						t += 255;
++						ip++;
++						if (HAVE_IP(1, ip_end, ip))
++							goto input_overrun;
++					}
++					t += 7 + *ip++;
++				}
++				m_pos -= le16_to_cpu(get_unaligned(
++					(const unsigned short *)ip)) >> 2;
++				ip += 2;
++				if (m_pos == op)
++					goto eof_found;
++				m_pos -= 0x4000;
++			} else {
++				m_pos = op - 1;
++				m_pos -= t >> 2;
++				m_pos -= *ip++ << 2;
++
++				if (HAVE_LB(m_pos, out, op))
++					goto lookbehind_overrun;
++				if (HAVE_OP(2, op_end, op))
++					goto output_overrun;
++
++				*op++ = *m_pos++;
++				*op++ = *m_pos;
++				goto match_done;
++			}
++
++			if (HAVE_LB(m_pos, out, op))
++				goto lookbehind_overrun;
++			if (HAVE_OP(t + 3 - 1, op_end, op))
++				goto output_overrun;
++
++			if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) {
++				COPY4(op, m_pos);
++				op += 4;
++				m_pos += 4;
++				t -= 4 - (3 - 1);
++				do {
++					COPY4(op, m_pos);
++					op += 4;
++					m_pos += 4;
++					t -= 4;
++				} while (t >= 4);
++				if (t > 0)
++					do {
++						*op++ = *m_pos++;
++					} while (--t > 0);
++			} else {
++copy_match:
++				*op++ = *m_pos++;
++				*op++ = *m_pos++;
++				do {
++					*op++ = *m_pos++;
++				} while (--t > 0);
++			}
++match_done:
++			t = ip[-2] & 3;
++			if (t == 0)
++				break;
++match_next:
++			if (HAVE_OP(t, op_end, op))
++				goto output_overrun;
++			if (HAVE_IP(t + 1, ip_end, ip))
++				goto input_overrun;
++
++			*op++ = *ip++;
++			if (t > 1) {
++				*op++ = *ip++;
++				if (t > 2)
++					*op++ = *ip++;
++			}
++
++			t = *ip++;
++		} while (ip < ip_end);
++	}
++
++	*out_len = op - out;
++	return LZO_E_EOF_NOT_FOUND;
++
++eof_found:
++	*out_len = op - out;
++	return (ip == ip_end ? LZO_E_OK :
++		(ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN));
++input_overrun:
++	*out_len = op - out;
++	return LZO_E_INPUT_OVERRUN;
++
++output_overrun:
++	*out_len = op - out;
++	return LZO_E_OUTPUT_OVERRUN;
++
++lookbehind_overrun:
++	*out_len = op - out;
++	return LZO_E_LOOKBEHIND_OVERRUN;
++}
++
++EXPORT_SYMBOL_GPL(lzo1x_decompress_safe);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("LZO1X Decompressor");
++
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzodefs.h compcache-0.5.4/sub-projects/compression/lzo-kmod/lzodefs.h
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzodefs.h	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/lzodefs.h	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,43 @@
++/*
++ *  lzodefs.h -- architecture, OS and compiler specific defines
++ *
++ *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
++ *
++ *  The full LZO package can be found at:
++ *  http://www.oberhumer.com/opensource/lzo/
++ *
++ *  Changed for kernel use by:
++ *  Nitin Gupta <nitingupta910@gmail.com>
++ *  Richard Purdie <rpurdie@openedhand.com>
++ */
++
++#define LZO_VERSION		0x2020
++#define LZO_VERSION_STRING	"2.02"
++#define LZO_VERSION_DATE	"Oct 17 2005"
++
++#define M1_MAX_OFFSET	0x0400
++#define M2_MAX_OFFSET	0x0800
++#define M3_MAX_OFFSET	0x4000
++#define M4_MAX_OFFSET	0xbfff
++
++#define M1_MIN_LEN	2
++#define M1_MAX_LEN	2
++#define M2_MIN_LEN	3
++#define M2_MAX_LEN	8
++#define M3_MIN_LEN	3
++#define M3_MAX_LEN	33
++#define M4_MIN_LEN	3
++#define M4_MAX_LEN	9
++
++#define M1_MARKER	0
++#define M2_MARKER	64
++#define M3_MARKER	32
++#define M4_MARKER	16
++
++#define D_BITS		14
++#define D_MASK		((1u << D_BITS) - 1)
++#define D_HIGH		((D_MASK >> 1) + 1)
++
++#define DX2(p, s1, s2)	(((((size_t)((p)[2]) << (s2)) ^ (p)[1]) \
++							<< (s1)) ^ (p)[0])
++#define DX3(p, s1, s2, s3)	((DX2((p)+1, s2, s3) << (s1)) ^ (p)[0])
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo.h compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo.h
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/lzo.h	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/lzo.h	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,44 @@
++#ifndef __LZO_H__
++#define __LZO_H__
++/*
++ *  LZO Public Kernel Interface
++ *  A mini subset of the LZO real-time data compression library
++ *
++ *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
++ *
++ *  The full LZO package can be found at:
++ *  http://www.oberhumer.com/opensource/lzo/
++ *
++ *  Changed for kernel use by:
++ *  Nitin Gupta <nitingupta910@gmail.com>
++ *  Richard Purdie <rpurdie@openedhand.com>
++ */
++
++#define LZO1X_MEM_COMPRESS	(16384 * sizeof(unsigned char *))
++#define LZO1X_1_MEM_COMPRESS	LZO1X_MEM_COMPRESS
++
++#define lzo1x_worst_compress(x) ((x) + ((x) / 16) + 64 + 3)
++
++/* This requires 'workmem' of size LZO1X_1_MEM_COMPRESS */
++int lzo1x_1_compress(const unsigned char *src, size_t src_len,
++			unsigned char *dst, size_t *dst_len, void *wrkmem);
++
++/* safe decompression with overrun testing */
++int lzo1x_decompress_safe(const unsigned char *src, size_t src_len,
++			unsigned char *dst, size_t *dst_len);
++
++/*
++ * Return values (< 0 = Error)
++ */
++#define LZO_E_OK			0
++#define LZO_E_ERROR			(-1)
++#define LZO_E_OUT_OF_MEMORY		(-2)
++#define LZO_E_NOT_COMPRESSIBLE		(-3)
++#define LZO_E_INPUT_OVERRUN		(-4)
++#define LZO_E_OUTPUT_OVERRUN		(-5)
++#define LZO_E_LOOKBEHIND_OVERRUN	(-6)
++#define LZO_E_EOF_NOT_FOUND		(-7)
++#define LZO_E_INPUT_NOT_CONSUMED	(-8)
++#define LZO_E_NOT_YET_IMPLEMENTED	(-9)
++
++#endif
+diff -uNr compcache-0.5.4-old/sub-projects/compression/lzo-kmod/Makefile compcache-0.5.4/sub-projects/compression/lzo-kmod/Makefile
+--- compcache-0.5.4-old/sub-projects/compression/lzo-kmod/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ compcache-0.5.4/sub-projects/compression/lzo-kmod/Makefile	2009-10-17 09:35:59.000000000 +0200
+@@ -0,0 +1,8 @@
++obj-m += lzo1x_compress.o lzo1x_decompress.o
++
++all:
++	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
++
++clean:
++	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
++
diff --git a/package/compcache/patches/001-lzo-speed.patch b/package/compcache/patches/001-lzo-speed.patch
index df27b9bb6a2d..59efe097c403 100644
--- a/package/compcache/patches/001-lzo-speed.patch
+++ b/package/compcache/patches/001-lzo-speed.patch
@@ -1,6 +1,6 @@
-diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c
---- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c	2008-08-13 06:33:34.000000000 +0200
-+++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c	2009-01-21 08:00:35.000000000 +0100
+diff -uNr compcache-0.5.3-org/sub-projects/compression/lzo-kmod/lzo1x_compress.c compcache-0.5.3/sub-projects/compression/lzo-kmod/lzo1x_compress.c
+--- compcache-0.5.3-org/sub-projects/compression/lzo-kmod/lzo1x_compress.c	2009-04-20 06:28:30.000000000 +0200
++++ compcache-0.5.3/sub-projects/compression/lzo-kmod/lzo1x_compress.c	2009-04-20 06:29:21.000000000 +0200
 @@ -62,8 +62,12 @@
  		goto literal;
  
@@ -55,9 +55,9 @@ diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c compc
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("LZO1X-1 Compressor");
 -
-diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
---- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	2008-08-13 06:33:42.000000000 +0200
-+++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	2009-01-21 07:49:41.000000000 +0100
+diff -uNr compcache-0.5.3-org/sub-projects/compression/lzo-kmod/lzo1x_decompress.c compcache-0.5.3/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
+--- compcache-0.5.3-org/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	2009-04-20 06:28:30.000000000 +0200
++++ compcache-0.5.3/sub-projects/compression/lzo-kmod/lzo1x_decompress.c	2009-04-20 06:29:21.000000000 +0200
 @@ -45,10 +45,7 @@
  			goto output_overrun;
  		if (HAVE_IP(t + 1, ip_end, ip))
@@ -70,7 +70,7 @@ diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c com
  	}
  
  	while ((ip < ip_end)) {
-@@ -71,23 +68,20 @@
+@@ -71,30 +68,27 @@
  		if (HAVE_IP(t + 4, ip_end, ip))
  			goto input_overrun;
  
@@ -108,6 +108,14 @@ diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c com
  				do {
  					*op++ = *ip++;
  				} while (--t > 0);
+ 			}
+ 		}
+ 
+-first_literal_run:
++//first_literal_run:
+ 		t = *ip++;
+ 		if (t >= 16)
+ 			goto match;
 @@ -139,8 +133,7 @@
  					t += 31 + *ip++;
  				}
@@ -173,13 +181,3 @@ diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c com
  			} else {
  copy_match:
  				*op++ = *m_pos++;
-@@ -247,9 +251,7 @@
- 	*out_len = op - out;
- 	return LZO_E_LOOKBEHIND_OVERRUN;
- }
--
- EXPORT_SYMBOL_GPL(lzo1x_decompress_safe);
- 
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("LZO1X Decompressor");
--
diff --git a/package/compcache/patches/002-compact_lzo-codec.patch b/package/compcache/patches/002-compact_lzo-codec.patch
deleted file mode 100644
index 4b560f317fa0..000000000000
--- a/package/compcache/patches/002-compact_lzo-codec.patch
+++ /dev/null
@@ -1,30 +0,0 @@
---- compcache-0.5/Makefile.bak	2008-12-10 07:25:44.000000000 +0100
-+++ compcache-0.5/Makefile	2009-01-21 08:25:38.000000000 +0100
-@@ -4,15 +4,13 @@
- 			-DCONFIG_XV_STATS \
- 			-g -Wall
- 
--obj-m	+=	sub-projects/compression/lzo-kmod/lzo1x_decompress.o \
--		sub-projects/compression/lzo-kmod/lzo1x_compress.o \
-+obj-m	+=	sub-projects/compression/lzo-kmod/lzo1x.o \
- 		sub-projects/allocators/xvmalloc-kmod/xvmalloc.o \
- 		compcache.o
- 
- all:
- 	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
--	@ln -sf sub-projects/compression/lzo-kmod/lzo1x_decompress.ko
--	@ln -sf sub-projects/compression/lzo-kmod/lzo1x_compress.ko
-+	@ln -sf sub-projects/compression/lzo-kmod/lzo1x.ko
- 	@ln -sf sub-projects/allocators/xvmalloc-kmod/xvmalloc.ko
- 
- clean:
---- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x.c~	1970-01-01 01:00:00.000000000 +0100
-+++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x.c	2008-05-06 09:38:12.000000000 +0200
-@@ -0,0 +1,7 @@
-+#include <linux/module.h>
-+
-+#include "lzo1x_compress.c"
-+#include "lzo1x_decompress.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("LZO1X Lib");
diff --git a/package/compcache/patches/100-use_register_width.patch b/package/compcache/patches/100-use_register_width.patch
new file mode 100644
index 000000000000..6200d56fdb9c
--- /dev/null
+++ b/package/compcache/patches/100-use_register_width.patch
@@ -0,0 +1,24 @@
+diff -uNr compcache-0.5.2/compcache.c compcache/compcache.c
+--- compcache-0.5.2/compcache.c	2009-03-10 13:03:56.000000000 +0100
++++ compcache/ramzswap.c	2009-04-01 17:38:20.000000000 +0200
+@@ -68,15 +68,15 @@
+ static int page_zero_filled(void *ptr)
+ {
+ 	u32 pos;
+-	u64 *page;
+-
+-	page = (u64 *)ptr;
+-
++#if defined(CONFIG_64BIT)
++	u64 *page = (u64 *)ptr;
++#else
++	u32 *page = (u32 *)ptr;
++#endif
+ 	for (pos = 0; pos != PAGE_SIZE / sizeof(*page); pos++) {
+ 		if (page[pos])
+ 			return 0;
+ 	}
+-
+ 	return 1;
+ }
+ 
diff --git a/package/compcache/patches/200-av_compress_ratio.patch b/package/compcache/patches/200-av_compress_ratio.patch
new file mode 100644
index 000000000000..82a1ecce84d1
--- /dev/null
+++ b/package/compcache/patches/200-av_compress_ratio.patch
@@ -0,0 +1,39 @@
+diff -uNr compcache-0.5.4-old/ramzswap.c compcache-0.5.4/ramzswap.c
+--- compcache-0.5.4-old/ramzswap.c	2009-10-18 09:14:53.000000000 +0200
++++ compcache-0.5.4/ramzswap.c	2009-10-18 09:12:08.000000000 +0200
+@@ -126,7 +126,9 @@
+ {
+ 	int len;
+ 	size_t succ_writes, mem_used;
+-	unsigned int good_compress_perc = 0, no_compress_perc = 0;
++	unsigned int good_compress_perc = 0, 
++		     av_compression_perc = 0,
++		     no_compress_perc = 0;
+ 
+ 	mem_used = xv_get_total_size_bytes(rzs.mem_pool)
+ 			+ (stats.pages_expand << PAGE_SHIFT);
+@@ -154,6 +156,8 @@
+ 	if (succ_writes && stats.pages_stored) {
+ 		good_compress_perc = stats.good_compress * 100
+ 					/ stats.pages_stored;
++		av_compression_perc = stats.compr_size * 100
++					/ (stats.good_compress << PAGE_SHIFT);
+ 		no_compress_perc = stats.pages_expand * 100
+ 					/ stats.pages_stored;
+ 	}
+@@ -168,6 +172,7 @@
+ 		"NotifyFree:	%8llu\n"
+ 		"ZeroPages:	%8u\n"
+ 		"GoodCompress:	%8u %%\n"
++		"AvCompression:	%8u %%\n"
+ 		"NoCompress:	%8u %%\n"
+ 		"PagesStored:	%8u\n"
+ 		"PagesUsed:	%8zu\n"
+@@ -182,6 +187,7 @@
+ 		stats.notify_free,
+ 		stats.pages_zero,
+ 		good_compress_perc,
++		av_compression_perc,
+ 		no_compress_perc,
+ 		stats.pages_stored,
+ 		mem_used >> PAGE_SHIFT,
-- 
2.30.2