compcache: Compressed Caching
Subsystems (3)
cover compcache: Compressed Caching
Hi All,
This implements a RAM based block device which acts as swap disk. Pages swapped to this disk are compressed and stored in memory itself. This allows more applications to fit in given amount of memory. This is especially useful for embedded devices, OLPC and small desktops (aka virtual machines).
Project home: http://code.google.com/p/compcache/
It consists of following components:
- compcache.ko: Creates RAM based block device
- tlsf.ko: Two Level Segregate Fit (TLSF) allocator
- LZO de/compressor: (Already in mainline)
Project home contains some performance numbers for TLSF and LZO. For general desktop use, this is giving *significant* performance gain under memory pressure. For now, it has been tested only on x86.
Thanks,
Nitin
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 1/6 compcache: compressed RAM block device
This creates RAM based block device (called ramzswap0) which is used as swap disk.
On write (swap-out):
- compress page (using LZO)
- Allocate required amount of memory (using TLSF)
- Store reference to its location in simple array.
On read (swap-in):
- Get compressed page location from array
- Decompress this page.
It also makes required Makefile changes.
---
drivers/block/Kconfig | 10 + drivers/block/Makefile | 1 + drivers/block/compcache.c | 440 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 451 insertions(+), 0 deletions(-)
drivers/block/Kconfig +10 -0
@@ -347,6 +347,16 @@ config BLK_DEV_RAM_SIZE The default value is 4096 kilobytes. Only change this if you know what you are doing. +config BLK_DEV_COMPCACHE + tristate "Compressed RAM based swap device" + select TLSF + select LZO_COMPRESS + select LZO_DECOMPRESS + help + This creates RAM based block device which acts as swap disk. Pages + swapped to this disk are compressed and stored in memory itself. + Project Home: http://code.google.com/p/compcache/ + config BLK_DEV_XIP bool "Support XIP filesystems on RAM block device" depends on BLK_DEV_RAM
drivers/block/Makefile +1 -0
@@ -12,6 +12,7 @@ obj-$(CONFIG_PS3_DISK) += ps3disk.o obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o obj-$(CONFIG_AMIGA_Z2RAM) += z2ram.o obj-$(CONFIG_BLK_DEV_RAM) += brd.o +obj-$(CONFIG_BLK_DEV_COMPCACHE) += compcache.o obj-$(CONFIG_BLK_DEV_LOOP) += loop.o obj-$(CONFIG_BLK_DEV_XD) += xd.o obj-$(CONFIG_BLK_CPQ_DA) += cpqarray.o
drivers/block/compcache.c new file +440 -0
440 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 2/6 compcache: block device - internal defs
In reply to Nitin GuptaThis contains header to be used internally by block device code. It contains flags to enable/disable debugging, stats collection and also defines default disk size (25% of total RAM).
---
drivers/block/compcache.h | 147 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 147 insertions(+), 0 deletions(-)
drivers/block/compcache.h new file +147 -0
@@ -0,0 +1,147 @@ +/* +* Compressed RAM based swap device +* +* (C) Nitin Gupta +* +* This RAM based block device acts as swap disk. +* Pages swapped to this device are compressed and +* stored in memory. +* +* Project home: http://code.google.com/p/compcache +*/ + +#ifndef _COMPCACHE_H_ +#define _COMPCACHE_H_ + +#define K (x) ((x) >> 10) +#define KB (x) ((x) << 10) + +#define SECTOR_SHIFT 9 +#define SECTOR_SIZE (1 << SECTOR_SHIFT) +#define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT) +#define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT) + +/*-- Configurable parameters */ +/* Default compcache size: 25% of total RAM */ +#define DEFAULT_COMPCACHE_PERCENT 25 +#define INIT_SIZE KB(16) +#define GROW_SIZE INIT_SIZE +/*-- */ + +/* Message prefix */ +#define C "compcache: " + +/* Debugging and Stats */ +#define NOP do { } while(0) + +#if (1 || defined(CONFIG_DEBUG_COMPCACHE )) +#define DEBUG 1 +#define STATS 1 +#else +#define DEBUG 0 +#define STATS 0 +#endif + +/* Create /proc/compcache? */ +/* If STATS is disabled, this will give minimal compcache info */ +#define CONFIG_COMPCACHE_PROC + +#if DEBUG +#define CC_DEBUG(fmt,arg...) \ + printk(KERN_DEBUG C fmt,##arg) +#else +#define CC_DEBUG(fmt,arg...) NOP +#endif + +/* +* Verbose debugging: +* Enable basic debugging + verbose messages spread all over code +*/ +#define DEBUG2 0 + +#if DEBUG2 +#define DEBUG 1 +#define STATS 1 +#define CONFIG_COMPCACHE_PROC 1 +#define CC_DEBUG2((fmt,arg...) \ + printk(KERN_DEBUG C fmt,##arg) +#else /* DEBUG2 */ +#define CC_DEBUG2(fmt,arg...) NOP +#endif + +/* Its useless to collect stats if there is no way to export it */ +#if (STATS && !defined(CONFIG_COMPCACHE_PROC )) +#error "compcache stats is enabled but not /proc/compcache." +#endif + +#if STATS +static inline void stat_inc_if_less (size_t *stat,const size_t val1, +const size_t val2) +{ + *stat += ((val1 < val2) ?1 :0 ); +} + +static inline void stat_inc (size_t *stat) +{ + ++*stat; +} + +static inline void stat_dec (size_t *stat) +{ +BUG_ON (*stat ==0 ); + --*stat; +} + +static inline void stat_set (size_t *stat,const size_t val) +{ + *stat = val; +} + +static inline void stat_setmax (size_t *max,const size_t cur) +{ + *max = (cur > *max) ? cur : *max; +} +#else /* STATS */ +#define stat_inc (x) NOP +#define stat_dec (x) NOP +#define stat_set (x, v) NOP +#define stat_setmax (x, v) NOP +#define stat_inc_if_less (x, v1, v2) NOP +#endif /* STATS */ + +/*-- Data structures */ +/* Indexed by page no. */ +struct table { +void *addr; +unsigned short len; +} __attribute__ ((packed)); + +struct compcache { +void *mem_pool; +void *compress_workmem; +void *compress_buffer; +struct table *table; +struct mutex lock; +struct gendisk *disk; +size_t size;/* In sectors */ +}; + +#if STATS +struct compcache_stats { +u32 num_reads;/* failed + successful */ +u32 num_writes;/* --do-- */ +u32 failed_reads;/* can happen when memory is tooo low */ +u32 failed_writes;/* should NEVER! happen */ +u32 invalid_io;/* non-swap I/O requests */ +u32 good_compress;/* no. of pages with compression +* ratio <= 50%. TODO: export full +* compressed page size histogram */ +u32 pages_expand;/* no. of incompressible pages */ +size_t curr_pages;/* current no. of compressed pages */ +size_t curr_mem;/* current total size of compressed pages */ +size_t peak_mem; +}; +#endif +/*-- */ + +#endif
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 3/6 compcache: TLSF Allocator interface
In reply to Nitin GuptaTwo Level Segregate Fit (TLSF) Allocator is used to allocate memory for variable size compressed pages. Its fast and gives low fragmentation. Following links give details on this allocator:
- http://rtportal.upv.es/rtmalloc/files/tlsf_paper_spe_2007.pdf
- http://code.google.com/p/compcache/wiki/TLSFAllocator
This kernel port of TLSF (v2.3.2) introduces several changes but underlying algorithm remains the same.
Changelog TLSF v2.3.2 vs this kernel port
- Pool now dynamically expands/shrinks.
It is collection of contiguous memory regions.
- Changes to pool create interface as a result of above change.
- Collect and export stats (/proc/tlsfinfo)
- Cleanups: kernel coding style, added comments, macros -> static inline, etc.
--- include/linux/tlsf.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 93 insertions(+), 0 deletions(-)
include/linux/tlsf.h new file +93 -0
@@ -0,0 +1,93 @@ +/* +* Two Levels Segregate Fit memory allocator (TLSF) +* Version 2.3.2 +* +* Written by Miguel Masmano Tello <[email protected]> +* +* Thanks to Ismael Ripoll for his suggestions and reviews +* +* Copyright (C) 2007, 2006, 2005, 2004 +* +* This code is released using a dual license strategy: GPL/LGPL +* You can choose the licence that better fits your requirements. +* +* Released under the terms of the GNU General Public License Version 2.0 +* Released under the terms of the GNU Lesser General Public License Version 2.1 +* +* This is kernel port of TLSF allocator. +* Original code can be found at: http://rtportal.upv.es/rtmalloc/ +* - Nitin Gupta (nitingupta910 at gmail dot com) +*/ + +#ifndef _TLSF_H_ +#define _TLSF_H_ + +typedef void * (get_memory )(size_t bytes); +typedef void (put_memory )(void *ptr); + +/** +* tlsf_create_memory_pool - create dynamic memory pool +* @name: name of the pool +* @get_mem: callback function used to expand pool +* @put_mem: callback function used to shrink pool +* @init_size: inital pool size (in bytes) +* @max_size: maximum pool size (in bytes) - set this as 0 for no limit +* @grow_size: amount of memory (in bytes) added to pool whenever required +* +* All size values are rounded up to next page boundary. +*/ +extern void *tlsf_create_memory_pool (const char *name, +get_memory get_mem, +put_memory put_mem, +size_t init_size, +size_t max_size, +size_t grow_size); +/** +* tlsf_destory_memory_pool - cleanup given pool +* @mem_pool: Pool to be destroyed +* +* Data structures associated with pool are freed. +* All memory allocated from pool must be freed before +* destorying it. +*/ +extern void tlsf_destroy_memory_pool (void *mem_pool); + +/** +* tlsf_malloc - allocate memory from given pool +* @size: no. of bytes +* @mem_pool: pool to allocate from +*/ +extern void *tlsf_malloc (size_t size,void *mem_pool); + +/** +* tlsf_calloc - allocate and zero-out memory from given pool +* @size: no. of bytes +* @mem_pool: pool to allocate from +*/ +extern void *tlsf_calloc (size_t nelem,size_t elem_size,void *mem_pool); + +/** +* tlsf_free - free memory from given pool +* @ptr: address of memory to be freed +* @mem_pool: pool to free from +*/ +extern void tlsf_free (void *ptr,void *mem_pool); + +/** +* tlsf_get_used_size - get memory currently used by given pool +* +* Used memory includes stored data + metadata + internal fragmentation +*/ +extern size_t tlsf_get_used_size (void *mem_pool); + +/** +* tlsf_get_total_size - get total memory currently allocated for given pool +* +* This is the total memory currently allocated for this pool which includes +* used size + free size. +* +* (Total - Used) is good indicator of memory efficiency of allocator. +*/ +extern size_t tlsf_get_total_size (void *mem_pool); + +#endif
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 4/6 compcache: TLSF Allocator
In reply to Nitin GuptaThis is main TLSF Allocator code.
It is designed specifically for embedded devices.
See:
http://rtportal.upv.es/rtmalloc/
for more information.
--- init/Kconfig | 10 + mm/Makefile | 1 + mm/tlsf.c | 668 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 679 insertions(+), 0 deletions(-)
init/Kconfig +10 -0
@@ -734,6 +734,16 @@ config SLOB endchoice +config TLSF + depends on EMBEDDED + tristate "TLSF Allocator" + help + Two Level Segregate Fit Allocator. Its fast and gives low + fragmentation. See: + http://rtportal.upv.es/rtmalloc/ + http://code.google.com/p/compcache/wiki/TLSFAllocator + for more information. + config PROFILING bool "Profiling support (EXPERIMENTAL)" help
mm/Makefile +1 -0
@@ -27,6 +27,7 @@ obj-$(CONFIG_TINY_SHMEM) += tiny-shmem.o obj-$(CONFIG_SLOB) += slob.o obj-$(CONFIG_SLAB) += slab.o obj-$(CONFIG_SLUB) += slub.o +obj-$(CONFIG_TLSF) += tlsf.o obj-$(CONFIG_MEMORY_HOTPLUG) += memory_hotplug.o obj-$(CONFIG_FS_XIP) += filemap_xip.o obj-$(CONFIG_MIGRATION) += migrate.o
mm/tlsf.c new file +668 -0
668 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 5/6 compcache: TLSF Allocator - internal defs
In reply to Nitin GuptaThis contains header to be used internally by TLSF.
It contains flags to enable/disable debugging, stats collection and other important parameters like alignment requirement.
---
mm/tlsf_int.h | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 179 insertions(+), 0 deletions(-)
mm/tlsf_int.h new file +179 -0
@@ -0,0 +1,179 @@ +/* +* To be used internally by TLSF allocator. +*/ + +#ifndef _TLSF_INT_H_ +#define _TLSF_INT_H_ + +#include <linux/tlsf.h> +#include <asm/types.h> + +/* Debugging and Stats */ +#if (1 || defined(CONFIG_DEBUG_TLSF )) +#define DEBUG 1 +#define STATS 1 +#else +#define DEBUG 0 +#define STATS 0 +#endif + +/* Create /proc/tlsfinfo? */ +/* If STATS is disabled, this will give minimal memory usage info. */ +#define CONFIG_TLSFINFO + +/* It useless to collect stats if there is no way to export it */ +#if (STATS && !defined(CONFIG_TLSFINFO )) +#error "TLSF stats is enabled but not /proc/tlsfinfo." +#endif + +#define NOP do { } while(0) +#if STATS +static inline void stat_inc (size_t *stat) +{ + ++*stat; +} + +static inline void stat_dec (size_t *stat) +{ +BUG_ON (*stat ==0 ); + --*stat; +} + +static inline void stat_set (size_t *stat,size_t val) +{ + *stat = val; +} + +static inline void stat_setmax (size_t *max,size_t cur) +{ + *max = (cur > *max) ? cur : *max; +} +#else /* STATS */ + +#define stat_inc (x) NOP +#define stat_dec (x) NOP +#define stat_set (x, v) NOP +#define stat_setmax (x, v) NOP +#endif /* STATS */ + +/* Messsage prefix */ +#define T "TLSF: " + +#define K (x) ((x) >> 10) +#define MAX_POOL_NAME_LEN 16 + +/*-- TLSF structures */ + +/* Some IMPORTANT TLSF parameters */ +#define MEM_ALIGN (sizeof(void *) * 2) +#define MEM_ALIGN_MASK (~(MEM_ALIGN - 1)) + +#define MAX_FLI (30) +#define MAX_LOG2_SLI (5) +#define MAX_SLI (1 << MAX_LOG2_SLI) + +#define FLI_OFFSET (6) +/* tlsf structure just will manage blocks bigger than 128 bytes */ +#define SMALL_BLOCK (128) +#define REAL_FLI (MAX_FLI - FLI_OFFSET) +#define MIN_BLOCK_SIZE (sizeof(struct free_ptr)) +#define BHDR_OVERHEAD (sizeof(struct bhdr) - MIN_BLOCK_SIZE) + +#define PTR_MASK (sizeof(void *) - 1) +#define BLOCK_SIZE_MASK (0xFFFFFFFF - PTR_MASK) + +#define GET_NEXT_BLOCK (addr, r) ((struct bhdr *) \ + ((char *) (addr) + (r))) +#define ROUNDUP_SIZE (r) (((r) + MEM_ALIGN - 1) & MEM_ALIGN_MASK) +#define ROUNDDOWN_SIZE (r) ((r) & MEM_ALIGN_MASK) +#define ROUNDUP_PAGE (r) (((r) + PAGE_SIZE - 1) & PAGE_MASK) + +#define BLOCK_STATE (0x1) +#define PREV_STATE (0x2) + +/* bit 0 of the block size */ +#define FREE_BLOCK (0x1) +#define USED_BLOCK (0x0) + +/* bit 1 of the block size */ +#define PREV_FREE (0x2) +#define PREV_USED (0x0) + +#if DEBUG +#define MAX_RETRY_EXPAND 10 +#endif + +struct free_ptr { +struct bhdr *prev; +struct bhdr *next; +}; + +struct bhdr { +/* All blocks in a region are linked in order of physical address */ +struct bhdr *prev_hdr; +/* +* The size is stored in bytes +* bit 0: block is free, if set +* bit 1: previous block is free, if set +*/ +u32 size; +/* Free blocks in individual freelists are linked */ +union { +struct free_ptr free_ptr; +u8 buffer[sizeof (struct free_ptr )]; + } ptr; +}; + +struct pool { +/* First level bitmap (REAL_FLI bits) */ +u32 fl_bitmap; + +/* Second level bitmap */ +u32 sl_bitmap[REAL_FLI ]; + +/* Free lists */ +struct bhdr *matrix[REAL_FLI ][MAX_SLI ]; + +struct mutex lock; + +size_t init_size; +size_t max_size; +size_t grow_size; + +/* Basic stats */ +size_t used_size; +size_t num_regions; + +/* User provided functions for expanding/shrinking pool */ +get_memory *get_mem; +put_memory *put_mem; + +struct list_head list; + +#if STATS +/* Extra stats */ +size_t peak_used; +size_t peak_total; +size_t peak_extra;/* MAX(Total - Used) */ +size_t count_alloc; +size_t count_free; +size_t count_region_alloc; +size_t count_region_free; +size_t count_failed_alloc; +#endif + +#if DEBUG +/* +* Pool used size must be 0 when its destroyed. +* When non-empty pool is destroyed, it suggests +* memory leak. Such pools are marked invalid +* and kept in pool list for later debugging. +*/ +unsigned int valid; +#endif +void *init_region; +char name[MAX_POOL_NAME_LEN ]; +}; +/*-- TLSF structures end */ + +#endif
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
RFC PATCH 6/6 compcache: Documentation
In reply to Nitin Guptacompcache usage documentation.
--- Documentation/compcache.txt | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-)
Documentation/compcache.txt new file +24 -0
@@ -0,0 +1,24 @@ + +compcache: Compressed RAM based swap device +------------------------------------------- + +Project home: http://code.google.com/p/compcache + +* Introduction +This is a RAM based block device which acts as swap disk. +Pages swapped to this device are compressed and stored in +memory itself. + +* Usage + - modprobe compcache compcache_size_kbytes=<size> + (If no size is specified, default size of 25% of RAM is taken). + - swapon /dev/ramzswap0 + +* Notes + - Allocator and compcache statistics are exported via /proc interface: + - /proc/tlsfinfo + - /proc/compcache + + +Nitin Gupta +(nitingupta910 at gmail dot com)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerQuoted 1 line · On Fri, 21 Mar 2008 01:29:58 +0530 Nitin Gupta <[email protected]> wrote:
Subject: [RFC][PATCH 0/6] compcache: Compressed Caching
Didn't get many C's, did it?
Be sure to cc linux-kernel on the next version.
Quoted 10 lines
Hi All,
This implements a RAM based block device which acts as swap disk. Pages swapped to this disk are compressed and stored in memory itself. This allows more applications to fit in given amount of memory. This is especially useful for embedded devices, OLPC and small desktops (aka virtual machines).
Project home: http://code.google.com/p/compcache/
Quoted 8 lines
It consists of following components:
- compcache.ko: Creates RAM based block device
- tlsf.ko: Two Level Segregate Fit (TLSF) allocator
- LZO de/compressor: (Already in mainline)Project home contains some performance numbers for TLSF and LZO. For general desktop use, this is giving *significant* performance gain under memory pressure. For now, it has been tested only on x86.
The values of "*significant*" should be exhaustively documented in the patch changelogs. That is 100%-the-entire-whole-point of the patchset! Omitting that information tends to reduce the number of C's.
Please feed all diffs through scripts/checkpatch.pl, contemplate the result.
kmap_atomic() is (much) preferred over kmap().
flush_dcache_page() is needed after the CPU modifies pagecache or anon page by hand (generally linked to kmap[_atomic]()).
The changelogs should include *complete* justification for the introduction of a new allocator. What problem is it solving, what are the possible solutions to that problem, why this one was chosen, etc. It's a fairly big deal.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 9 lines · Andrew Morton
Quoted 1 line · On Fri, 21 Mar 2008 01:29:58 +0530 Nitin Gupta <[email protected]> wrote:
Subject: [RFC][PATCH 0/6] compcache: Compressed Caching
Didn't get many C's, did it?
Be sure to cc linux-kernel on the next version.
I have already posted it again on linux-kernel with link to performance figures for allocator (TLSF vs SLUB):
see: http://lkml.org/lkml/2008/4/8/69
Quoted 8 lines
Quoted 3 lines
Project home contains some performance numbers for TLSF and LZO. For general desktop use, this is giving *significant* performance gain under memory pressure. For now, it has been tested only on x86.
The values of "*significant*" should be exhaustively documented in the patch changelogs. That is 100%-the-entire-whole-point of the patchset! Omitting that information tends to reduce the number of C's.
I will also post performance numbers for compcache. Desktop seems so much more responsive with this. I need to see how I can quantify this.
Quoted 5 lines
Please feed all diffs through
scripts/checkpatch.pl, contemplate the result.
kmap_atomic()is (much) preferred overkmap().
We are doing compression and alloc (can sleep) between kmap/kunmap. So, I used kmap() instead of kmap_atomic().
Quoted 3 lines
flush_dcache_page()is needed after the CPU modifies pagecache or anon page by hand (generally linked to kmap[_atomic]()).
ok. I will add this.
Quoted 5 lines
The changelogs should include *complete* justification for the introduction of a new allocator. What problem is it solving, what are the possible solutions to that problem, why this one was chosen, etc. It's a fairly big deal.
TLSF comparison with SLUB can be found here:
http://code.google.com/p/compcache/wiki/AllocatorsComparison
Thanks for review.
Regards,
Nitin
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerQuoted 7 lines · On Wed, 9 Apr 2008 10:32:06 +0530 "Nitin Gupta" <[email protected]> wrote:
Quoted 6 lines · Andrew Morton
Quoted 1 line · On Fri, 21 Mar 2008 01:29:58 +0530 Nitin Gupta <[email protected]> wrote:
Subject: [RFC][PATCH 0/6] compcache: Compressed Caching
Didn't get many C's, did it?
Quoted 9 lines
Quoted 3 lines
Be sure to cc linux-kernel on the next version.
I have already posted it again on linux-kernel with link to performance figures for allocator (TLSF vs SLUB):
Information like this should be maintained within the changelog, please.
Quoted 3 lines
TLSF comparison with SLUB can be found here:
http://code.google.com/p/compcache/wiki/AllocatorsComparison
Ditto.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>