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