package/compcache: use mainline modules for kernels >=2.6.33 (thank you nbd)
authoracoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 1 Aug 2010 16:57:24 +0000 (16:57 +0000)
committeracoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 1 Aug 2010 16:57:24 +0000 (16:57 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22458 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/compcache/Makefile
package/compcache/files/compcache.init.new [new file with mode: 0644]
package/compcache/patches/003-no_stats.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.33/040-compcache_swap_notify_core_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.34/040-compcache_swap_notify_core_support.patch [new file with mode: 0644]

index 5106293..f7b7c5b 100644 (file)
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 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
 
@@ -23,8 +23,17 @@ define KernelPackage/ramzswap
   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
 
@@ -39,20 +48,21 @@ 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
@@ -62,7 +72,11 @@ define Package/compcache/install
              -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
diff --git a/package/compcache/files/compcache.init.new b/package/compcache/files/compcache.init.new
new file mode 100644 (file)
index 0000000..18aead9
--- /dev/null
@@ -0,0 +1,50 @@
+#!/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"
+}
diff --git a/package/compcache/patches/003-no_stats.patch b/package/compcache/patches/003-no_stats.patch
new file mode 100644 (file)
index 0000000..bfa25f8
--- /dev/null
@@ -0,0 +1,12 @@
+--- 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
diff --git a/target/linux/generic/patches-2.6.33/040-compcache_swap_notify_core_support.patch b/target/linux/generic/patches-2.6.33/040-compcache_swap_notify_core_support.patch
new file mode 100644 (file)
index 0000000..0372e20
--- /dev/null
@@ -0,0 +1,30 @@
+--- 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;
diff --git a/target/linux/generic/patches-2.6.34/040-compcache_swap_notify_core_support.patch b/target/linux/generic/patches-2.6.34/040-compcache_swap_notify_core_support.patch
new file mode 100644 (file)
index 0000000..0372e20
--- /dev/null
@@ -0,0 +1,30 @@
+--- 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;