PKG_NAME:=compcache
PKG_VERSION:=0.6.2
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_SOURCE_URL:=http://compcache.googlecode.com/files/
PKG_MD5SUM:=27aec78dc50e34fb800c74e879057743
DEPENDS:=@BUSYBOX_CONFIG_SWAPONOFF
TITLE:=Driver for compressed ram swap device
VERSION:=$(LINUX_VERSION)-$(BOARD)-$(LINUX_RELEASE)+$(PKG_RELEASE)
- FILES:=$(PKG_BUILD_DIR)/ramzswap.ko \
- $(PKG_BUILD_DIR)/sub-projects/compression/lzo-kmod/lzo1x.ko
+ KCONFIG:=CONFIG_RAMZSWAP=m CONFIG_RAMZSWAP_STATS=n
+ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
+ FILES:= \
+ $(LINUX_DIR)/drivers/staging/ramzswap/ramzswap.ko \
+ $(LINUX_DIR)/lib/lzo/lzo_compress.ko \
+ $(LINUX_DIR)/lib/lzo/lzo_decompress.ko
+else
+ FILES:= \
+ $(PKG_BUILD_DIR)/ramzswap.ko \
+ $(PKG_BUILD_DIR)/sub-projects/compression/lzo-kmod/lzo1x.ko
+endif
URL:=http://code.google.com/p/compcache/
endef
include $(INCLUDE_DIR)/kernel-defaults.mk
-LZO = sub-projects/compression/lzo-kmod
RZSC = sub-projects/rzscontrol
-BUILDFLAGS:=-DCONFIG_RAMZSWAP_STATS \
- -I$(PKG_BUILD_DIR)/$(LZO) \
- -Wall
-
RZSCFLAGS:=-I$(PKG_BUILD_DIR)/$(RZSC)/../include \
-I$(PKG_BUILD_DIR)/$(RZSC)/../..
-define Build/Compile
- $(MAKE) $(KERNEL_MAKEOPTS) EXTRA_CFLAGS="$(BUILDFLAGS)" M="$(PKG_BUILD_DIR)" modules
+ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
+ define Build/Compile
+ $(TARGET_CC) $(TARGET_CFLAGS) $(RZSCFLAGS) $(PKG_BUILD_DIR)/$(RZSC)/rzscontrol.c -o $(PKG_BUILD_DIR)/rzscontrol
+ endef
+else
+ define Build/Compile
+ $(MAKE) $(KERNEL_MAKEOPTS) EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/sub-projects/compression/lzo-kmod -Wall" M="$(PKG_BUILD_DIR)" modules
$(TARGET_CC) $(TARGET_CFLAGS) $(RZSCFLAGS) $(PKG_BUILD_DIR)/$(RZSC)/rzscontrol.c -o $(PKG_BUILD_DIR)/rzscontrol
-endef
+ endef
+endif
define Package/compcache/install
$(INSTALL_DIR) $(1)/etc/config
-e 's,%BACKUP_DEV%,$(call qstrip,$(CONFIG_COMPCACHE_BACKUP_DEV)),g' \
$(1)/etc/config/compcache
$(INSTALL_DIR) $(1)/etc/init.d
+ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
+ $(INSTALL_BIN) ./files/compcache.init.new $(1)/etc/init.d/compcache
+else
$(INSTALL_BIN) ./files/compcache.init $(1)/etc/init.d/compcache
+endif
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/rzscontrol $(1)/sbin/rzscontrol
endef
--- /dev/null
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2008 OpenWrt.org
+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 [ "`cat /proc/swaps | grep 'ramzswap0'`" != "" ]; then
+ echo "compcache already loaded"
+ else
+ 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 lzo_compress
+ insmod lzo_decompress
+ insmod ramzswap $params_set
+ sleep 2
+ swapon /dev/ramzswap0
+ fi
+ fi
+ fi
+}
+
+remove_modules() {
+ local section="$1"
+ config_get_bool "enabled" "$section" "enabled" '1'
+ if [ "$enabled" -gt 0 ]; then
+ [ "`cat /proc/swaps | grep 'ramzswap0'`" != "" ] && swapoff /dev/ramzswap0
+ [ "`lsmod | grep 'ramzswap'`" != "" ] && rmmod ramzswap &> /dev/null
+ [ "`lsmod | grep 'lzo_compress'`" != "" ] && rmmod lzo_compress &> /dev/null
+ [ "`lsmod | grep 'lzo_decompress'`" != "" ] && rmmod lzo_decompress &> /dev/null
+ fi
+}
+
+start() {
+ config_load "compcache"
+ config_foreach load_modules "compcache"
+}
+
+stop() {
+ config_load "compcache"
+ config_foreach remove_modules "compcache"
+}
--- /dev/null
+--- a/Makefile
++++ b/Makefile
+@@ -2,8 +2,7 @@ KERNEL_BUILD_PATH ?= "/lib/modules/$(she
+
+ XVM = sub-projects/allocators/xvmalloc-kmod
+ LZO = sub-projects/compression/lzo-kmod
+-EXTRA_CFLAGS := -DCONFIG_RAMZSWAP_STATS \
+- -Wall
++EXTRA_CFLAGS := -Wall
+
+ obj-m += ramzswap.o $(LZO)/lzo1x.o
+ ramzswap-objs := ramzswap_drv.o $(XVM)/xvmalloc.o
--- /dev/null
+--- a/include/linux/blkdev.h
++++ b/include/linux/blkdev.h
+@@ -1301,6 +1301,8 @@ struct block_device_operations {
+ unsigned long long);
+ int (*revalidate_disk) (struct gendisk *);
+ int (*getgeo)(struct block_device *, struct hd_geometry *);
++ /* this callback is with swap_lock and sometimes page table lock held */
++ void (*swap_slot_free_notify) (struct block_device *, unsigned long);
+ struct module *owner;
+ };
+
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -574,6 +574,7 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
+
+ /* free if no reference */
+ if (!usage) {
++ struct gendisk *disk = p->bdev->bd_disk;
+ if (offset < p->lowest_bit)
+ p->lowest_bit = offset;
+ if (offset > p->highest_bit)
+@@ -583,6 +584,8 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
+ swap_list.next = p->type;
+ nr_swap_pages++;
+ p->inuse_pages--;
++ if (disk->fops->swap_slot_free_notify)
++ disk->fops->swap_slot_free_notify(p->bdev, offset);
+ }
+
+ return usage;
--- /dev/null
+--- a/include/linux/blkdev.h
++++ b/include/linux/blkdev.h
+@@ -1301,6 +1301,8 @@ struct block_device_operations {
+ unsigned long long);
+ int (*revalidate_disk) (struct gendisk *);
+ int (*getgeo)(struct block_device *, struct hd_geometry *);
++ /* this callback is with swap_lock and sometimes page table lock held */
++ void (*swap_slot_free_notify) (struct block_device *, unsigned long);
+ struct module *owner;
+ };
+
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -574,6 +574,7 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
+
+ /* free if no reference */
+ if (!usage) {
++ struct gendisk *disk = p->bdev->bd_disk;
+ if (offset < p->lowest_bit)
+ p->lowest_bit = offset;
+ if (offset > p->highest_bit)
+@@ -583,6 +584,8 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
+ swap_list.next = p->type;
+ nr_swap_pages++;
+ p->inuse_pages--;
++ if (disk->fops->swap_slot_free_notify)
++ disk->fops->swap_slot_free_notify(p->bdev, offset);
+ }
+
+ return usage;