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