hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * zpool memory storage api
 *
 * Copyright (C) 2014 Dan Streetman
 *
 * This is a common frontend for the zbud and zsmalloc memory
 * storage pool implementations.  Typically, this is used to
 * store compressed memory.
 */
 
#ifndef _ZPOOL_H_
#define _ZPOOL_H_
 
struct zpool;
 
struct zpool_ops {
   int (*evict)(struct zpool *pool, unsigned long handle);
};
 
/*
 * Control how a handle is mapped.  It will be ignored if the
 * implementation does not support it.  Its use is optional.
 * Note that this does not refer to memory protection, it
 * refers to how the memory will be copied in/out if copying
 * is necessary during mapping; read-write is the safest as
 * it copies the existing memory in on map, and copies the
 * changed memory back out on unmap.  Write-only does not copy
 * in the memory and should only be used for initialization.
 * If in doubt, use ZPOOL_MM_DEFAULT which is read-write.
 */
enum zpool_mapmode {
   ZPOOL_MM_RW, /* normal read-write mapping */
   ZPOOL_MM_RO, /* read-only (no copy-out at unmap time) */
   ZPOOL_MM_WO, /* write-only (no copy-in at map time) */
 
   ZPOOL_MM_DEFAULT = ZPOOL_MM_RW
};
 
bool zpool_has_pool(char *type);
 
struct zpool *zpool_create_pool(const char *type, const char *name,
           gfp_t gfp, const struct zpool_ops *ops);
 
const char *zpool_get_type(struct zpool *pool);
 
void zpool_destroy_pool(struct zpool *pool);
 
bool zpool_malloc_support_movable(struct zpool *pool);
 
int zpool_malloc(struct zpool *pool, size_t size, gfp_t gfp,
           unsigned long *handle);
 
void zpool_free(struct zpool *pool, unsigned long handle);
 
int zpool_shrink(struct zpool *pool, unsigned int pages,
           unsigned int *reclaimed);
 
void *zpool_map_handle(struct zpool *pool, unsigned long handle,
           enum zpool_mapmode mm);
 
void zpool_unmap_handle(struct zpool *pool, unsigned long handle);
 
u64 zpool_get_total_size(struct zpool *pool);
 
 
/**
 * struct zpool_driver - driver implementation for zpool
 * @type:    name of the driver.
 * @list:    entry in the list of zpool drivers.
 * @create:    create a new pool.
 * @destroy:    destroy a pool.
 * @malloc:    allocate mem from a pool.
 * @free:    free mem from a pool.
 * @shrink:    shrink the pool.
 * @map:    map a handle.
 * @unmap:    unmap a handle.
 * @total_size:    get total size of a pool.
 *
 * This is created by a zpool implementation and registered
 * with zpool.
 */
struct zpool_driver {
   char *type;
   struct module *owner;
   atomic_t refcount;
   struct list_head list;
 
   void *(*create)(const char *name,
           gfp_t gfp,
           const struct zpool_ops *ops,
           struct zpool *zpool);
   void (*destroy)(void *pool);
 
   bool malloc_support_movable;
   int (*malloc)(void *pool, size_t size, gfp_t gfp,
               unsigned long *handle);
   void (*free)(void *pool, unsigned long handle);
 
   int (*shrink)(void *pool, unsigned int pages,
               unsigned int *reclaimed);
 
   void *(*map)(void *pool, unsigned long handle,
               enum zpool_mapmode mm);
   void (*unmap)(void *pool, unsigned long handle);
 
   u64 (*total_size)(void *pool);
};
 
void zpool_register_driver(struct zpool_driver *driver);
 
int zpool_unregister_driver(struct zpool_driver *driver);
 
bool zpool_evictable(struct zpool *pool);
 
#endif