1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Compressed RAM block device 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2008, 2009, 2010 Nitin Gupta 5*4882a593Smuzhiyun * 2012, 2013 Minchan Kim 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This code is released using a dual license strategy: BSD/GPL 8*4882a593Smuzhiyun * You can choose the licence that better fits your requirements. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Released under the terms of 3-clause BSD License 11*4882a593Smuzhiyun * Released under the terms of GNU General Public License Version 2.0 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef _ZRAM_DRV_H_ 16*4882a593Smuzhiyun #define _ZRAM_DRV_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/rwsem.h> 19*4882a593Smuzhiyun #include <linux/zsmalloc.h> 20*4882a593Smuzhiyun #include <linux/crypto.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include "zcomp.h" 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT) 25*4882a593Smuzhiyun #define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT) 26*4882a593Smuzhiyun #define ZRAM_LOGICAL_BLOCK_SHIFT 12 27*4882a593Smuzhiyun #define ZRAM_LOGICAL_BLOCK_SIZE (1 << ZRAM_LOGICAL_BLOCK_SHIFT) 28*4882a593Smuzhiyun #define ZRAM_SECTOR_PER_LOGICAL_BLOCK \ 29*4882a593Smuzhiyun (1 << (ZRAM_LOGICAL_BLOCK_SHIFT - SECTOR_SHIFT)) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* 33*4882a593Smuzhiyun * The lower ZRAM_FLAG_SHIFT bits of table.flags is for 34*4882a593Smuzhiyun * object size (excluding header), the higher bits is for 35*4882a593Smuzhiyun * zram_pageflags. 36*4882a593Smuzhiyun * 37*4882a593Smuzhiyun * zram is mainly used for memory efficiency so we want to keep memory 38*4882a593Smuzhiyun * footprint small so we can squeeze size and flags into a field. 39*4882a593Smuzhiyun * The lower ZRAM_FLAG_SHIFT bits is for object size (excluding header), 40*4882a593Smuzhiyun * the higher bits is for zram_pageflags. 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun #define ZRAM_FLAG_SHIFT 24 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* Flags for zram pages (table[page_no].flags) */ 45*4882a593Smuzhiyun enum zram_pageflags { 46*4882a593Smuzhiyun /* zram slot is locked */ 47*4882a593Smuzhiyun ZRAM_LOCK = ZRAM_FLAG_SHIFT, 48*4882a593Smuzhiyun ZRAM_SAME, /* Page consists the same element */ 49*4882a593Smuzhiyun ZRAM_WB, /* page is stored on backing_device */ 50*4882a593Smuzhiyun ZRAM_UNDER_WB, /* page is under writeback */ 51*4882a593Smuzhiyun ZRAM_HUGE, /* Incompressible page */ 52*4882a593Smuzhiyun ZRAM_IDLE, /* not accessed page since last idle marking */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun __NR_ZRAM_PAGEFLAGS, 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /*-- Data structures */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* Allocated for each disk page */ 60*4882a593Smuzhiyun struct zram_table_entry { 61*4882a593Smuzhiyun union { 62*4882a593Smuzhiyun unsigned long handle; 63*4882a593Smuzhiyun unsigned long element; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun unsigned long flags; 66*4882a593Smuzhiyun #ifdef CONFIG_ZRAM_MEMORY_TRACKING 67*4882a593Smuzhiyun ktime_t ac_time; 68*4882a593Smuzhiyun #endif 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct zram_stats { 72*4882a593Smuzhiyun atomic64_t compr_data_size; /* compressed size of pages stored */ 73*4882a593Smuzhiyun atomic64_t num_reads; /* failed + successful */ 74*4882a593Smuzhiyun atomic64_t num_writes; /* --do-- */ 75*4882a593Smuzhiyun atomic64_t failed_reads; /* can happen when memory is too low */ 76*4882a593Smuzhiyun atomic64_t failed_writes; /* can happen when memory is too low */ 77*4882a593Smuzhiyun atomic64_t invalid_io; /* non-page-aligned I/O requests */ 78*4882a593Smuzhiyun atomic64_t notify_free; /* no. of swap slot free notifications */ 79*4882a593Smuzhiyun atomic64_t same_pages; /* no. of same element filled pages */ 80*4882a593Smuzhiyun atomic64_t huge_pages; /* no. of huge pages */ 81*4882a593Smuzhiyun atomic64_t pages_stored; /* no. of pages currently stored */ 82*4882a593Smuzhiyun atomic_long_t max_used_pages; /* no. of maximum pages stored */ 83*4882a593Smuzhiyun atomic64_t writestall; /* no. of write slow paths */ 84*4882a593Smuzhiyun atomic64_t miss_free; /* no. of missed free */ 85*4882a593Smuzhiyun #ifdef CONFIG_ZRAM_WRITEBACK 86*4882a593Smuzhiyun atomic64_t bd_count; /* no. of pages in backing device */ 87*4882a593Smuzhiyun atomic64_t bd_reads; /* no. of reads from backing device */ 88*4882a593Smuzhiyun atomic64_t bd_writes; /* no. of writes from backing device */ 89*4882a593Smuzhiyun #endif 90*4882a593Smuzhiyun }; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct zram { 93*4882a593Smuzhiyun struct zram_table_entry *table; 94*4882a593Smuzhiyun struct zs_pool *mem_pool; 95*4882a593Smuzhiyun struct zcomp *comp; 96*4882a593Smuzhiyun struct gendisk *disk; 97*4882a593Smuzhiyun /* Prevent concurrent execution of device init */ 98*4882a593Smuzhiyun struct rw_semaphore init_lock; 99*4882a593Smuzhiyun /* 100*4882a593Smuzhiyun * the number of pages zram can consume for storing compressed data 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun unsigned long limit_pages; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct zram_stats stats; 105*4882a593Smuzhiyun /* 106*4882a593Smuzhiyun * This is the limit on amount of *uncompressed* worth of data 107*4882a593Smuzhiyun * we can store in a disk. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun u64 disksize; /* bytes */ 110*4882a593Smuzhiyun char compressor[CRYPTO_MAX_ALG_NAME]; 111*4882a593Smuzhiyun /* 112*4882a593Smuzhiyun * zram is claimed so open request will be failed 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun bool claim; /* Protected by bdev->bd_mutex */ 115*4882a593Smuzhiyun struct file *backing_dev; 116*4882a593Smuzhiyun #ifdef CONFIG_ZRAM_WRITEBACK 117*4882a593Smuzhiyun spinlock_t wb_limit_lock; 118*4882a593Smuzhiyun bool wb_limit_enable; 119*4882a593Smuzhiyun u64 bd_wb_limit; 120*4882a593Smuzhiyun struct block_device *bdev; 121*4882a593Smuzhiyun unsigned int old_block_size; 122*4882a593Smuzhiyun unsigned long *bitmap; 123*4882a593Smuzhiyun unsigned long nr_pages; 124*4882a593Smuzhiyun #endif 125*4882a593Smuzhiyun #ifdef CONFIG_ZRAM_MEMORY_TRACKING 126*4882a593Smuzhiyun struct dentry *debugfs_dir; 127*4882a593Smuzhiyun #endif 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun #endif 130