2009-09-22 10:26:53 +05:30
/*
2010-06-01 13:31:25 +05:30
* Compressed RAM block device
2009-09-22 10:26:53 +05:30
*
2010-01-28 21:21:35 +05:30
* Copyright ( C ) 2008 , 2009 , 2010 Nitin Gupta
2014-01-30 15:45:55 -08:00
* 2012 , 2013 Minchan Kim
2009-09-22 10:26:53 +05:30
*
* This code is released using a dual license strategy : BSD / GPL
* You can choose the licence that better fits your requirements .
*
* Released under the terms of 3 - clause BSD License
* Released under the terms of GNU General Public License Version 2.0
*
*/
2010-06-01 13:31:25 +05:30
# ifndef _ZRAM_DRV_H_
# define _ZRAM_DRV_H_
2009-09-22 10:26:53 +05:30
2010-01-28 21:13:37 +05:30
# include <linux/spinlock.h>
# include <linux/mutex.h>
2014-01-30 15:45:50 -08:00
# include <linux/zsmalloc.h>
2009-09-22 10:26:53 +05:30
/*
* Some arbitrary value . This is just to catch
* invalid value for num_devices module parameter .
*/
static const unsigned max_num_devices = 32 ;
/*-- Configurable parameters */
/*
* Pages that compress to size greater than this are stored
* uncompressed in memory .
*/
2011-09-09 19:01:00 -04:00
static const size_t max_zpage_size = PAGE_SIZE / 4 * 3 ;
2009-09-22 10:26:53 +05:30
/*
2010-05-13 14:24:21 +05:30
* NOTE : max_zpage_size must be less than or equal to :
2012-10-10 08:49:52 +09:00
* ZS_MAX_ALLOC_SIZE . Otherwise , zs_malloc ( ) would
* always return failure .
2009-09-22 10:26:53 +05:30
*/
/*-- End of configurable params */
# 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)
2011-06-10 15:28:48 +02:00
# define ZRAM_LOGICAL_BLOCK_SHIFT 12
# define ZRAM_LOGICAL_BLOCK_SIZE (1 << ZRAM_LOGICAL_BLOCK_SHIFT)
# define ZRAM_SECTOR_PER_LOGICAL_BLOCK \
( 1 < < ( ZRAM_LOGICAL_BLOCK_SHIFT - SECTOR_SHIFT ) )
2009-09-22 10:26:53 +05:30
2010-06-01 13:31:25 +05:30
/* Flags for zram pages (table[page_no].flags) */
enum zram_pageflags {
2009-09-22 10:26:53 +05:30
/* Page consists entirely of zeros */
2010-06-01 13:31:25 +05:30
ZRAM_ZERO ,
2009-09-22 10:26:53 +05:30
2010-06-01 13:31:25 +05:30
__NR_ZRAM_PAGEFLAGS ,
2009-09-22 10:26:53 +05:30
} ;
/*-- Data structures */
2010-06-01 13:31:25 +05:30
/* Allocated for each disk page */
2009-09-22 10:26:53 +05:30
struct table {
2012-06-08 15:39:25 +09:00
unsigned long handle ;
2012-01-09 16:51:59 -06:00
u16 size ; /* object size (excluding header) */
2009-09-22 10:26:53 +05:30
u8 flags ;
2012-06-07 16:03:48 -07:00
} __aligned ( 4 ) ;
2009-09-22 10:26:53 +05:30
2010-06-01 13:31:25 +05:30
struct zram_stats {
2014-04-07 15:38:03 -07:00
atomic64_t compr_data_size ; /* compressed size of pages stored */
2013-06-07 00:07:31 +08:00
atomic64_t num_reads ; /* failed + successful */
atomic64_t num_writes ; /* --do-- */
atomic64_t failed_reads ; /* should NEVER! happen */
atomic64_t failed_writes ; /* can happen when memory is too low */
atomic64_t invalid_io ; /* non-page-aligned I/O requests */
atomic64_t notify_free ; /* no. of swap slot free notifications */
2014-04-07 15:38:03 -07:00
atomic64_t zero_pages ; /* no. of zero filled pages */
atomic64_t pages_stored ; /* no. of pages currently stored */
2009-09-22 10:26:53 +05:30
} ;
2013-02-06 08:48:53 +09:00
struct zram_meta {
2014-01-30 15:46:03 -08:00
rwlock_t tb_lock ; /* protect table */
2009-09-22 10:26:53 +05:30
void * compress_workmem ;
void * compress_buffer ;
struct table * table ;
2013-02-06 08:48:53 +09:00
struct zs_pool * mem_pool ;
2014-01-30 15:46:06 -08:00
struct mutex buffer_lock ; /* protect compress buffers */
2013-02-06 08:48:53 +09:00
} ;
struct zram {
struct zram_meta * meta ;
2009-09-22 10:26:53 +05:30
struct request_queue * queue ;
struct gendisk * disk ;
2011-09-06 15:02:11 +02:00
/* Prevent concurrent execution of device init, reset and R/W request */
struct rw_semaphore init_lock ;
2009-09-22 10:26:53 +05:30
/*
2010-06-01 13:31:25 +05:30
* This is the limit on amount of * uncompressed * worth of data
* we can store in a disk .
2009-09-22 10:26:53 +05:30
*/
2010-08-09 22:56:47 +05:30
u64 disksize ; /* bytes */
2009-09-22 10:26:53 +05:30
2010-06-01 13:31:25 +05:30
struct zram_stats stats ;
2009-09-22 10:26:53 +05:30
} ;
2010-01-28 21:13:37 +05:30
# endif