linux/drivers/staging/zram/xvmalloc_int.h
<<
>>
Prefs
   1/*
   2 * xvmalloc memory allocator
   3 *
   4 * Copyright (C) 2008, 2009, 2010  Nitin Gupta
   5 *
   6 * This code is released using a dual license strategy: BSD/GPL
   7 * You can choose the licence that better fits your requirements.
   8 *
   9 * Released under the terms of 3-clause BSD License
  10 * Released under the terms of GNU General Public License Version 2.0
  11 */
  12
  13#ifndef _XV_MALLOC_INT_H_
  14#define _XV_MALLOC_INT_H_
  15
  16#include <linux/kernel.h>
  17#include <linux/types.h>
  18
  19/* User configurable params */
  20
  21/* Must be power of two */
  22#define XV_ALIGN_SHIFT  2
  23#define XV_ALIGN        (1 << XV_ALIGN_SHIFT)
  24#define XV_ALIGN_MASK   (XV_ALIGN - 1)
  25
  26/* This must be greater than sizeof(link_free) */
  27#define XV_MIN_ALLOC_SIZE       32
  28#define XV_MAX_ALLOC_SIZE       (PAGE_SIZE - XV_ALIGN)
  29
  30/* Free lists are separated by FL_DELTA bytes */
  31#define FL_DELTA_SHIFT  3
  32#define FL_DELTA        (1 << FL_DELTA_SHIFT)
  33#define FL_DELTA_MASK   (FL_DELTA - 1)
  34#define NUM_FREE_LISTS  ((XV_MAX_ALLOC_SIZE - XV_MIN_ALLOC_SIZE) \
  35                                / FL_DELTA + 1)
  36
  37#define MAX_FLI         DIV_ROUND_UP(NUM_FREE_LISTS, BITS_PER_LONG)
  38
  39/* End of user params */
  40
  41enum blockflags {
  42        BLOCK_FREE,
  43        PREV_FREE,
  44        __NR_BLOCKFLAGS,
  45};
  46
  47#define FLAGS_MASK      XV_ALIGN_MASK
  48#define PREV_MASK       (~FLAGS_MASK)
  49
  50struct freelist_entry {
  51        struct page *page;
  52        u16 offset;
  53        u16 pad;
  54};
  55
  56struct link_free {
  57        struct page *prev_page;
  58        struct page *next_page;
  59        u16 prev_offset;
  60        u16 next_offset;
  61};
  62
  63struct block_header {
  64        union {
  65                /* This common header must be XV_ALIGN bytes */
  66                u8 common[XV_ALIGN];
  67                struct {
  68                        u16 size;
  69                        u16 prev;
  70                };
  71        };
  72        struct link_free link;
  73};
  74
  75struct xv_pool {
  76        ulong flbitmap;
  77        ulong slbitmap[MAX_FLI];
  78        spinlock_t lock;
  79
  80        struct freelist_entry freelist[NUM_FREE_LISTS];
  81
  82        /* stats */
  83        u64 total_pages;
  84};
  85
  86#endif
  87