xref: /linux/drivers/block/zram/zcomp.h (revision 4eac932103a5d8c3a1bdf6776dbc1a178c31d896)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #ifndef _ZCOMP_H_
4 #define _ZCOMP_H_
5 
6 #include <linux/local_lock.h>
7 
8 #define ZCOMP_PARAM_NO_LEVEL	INT_MIN
9 
10 struct zcomp_params {
11 	void *dict;
12 	size_t dict_sz;
13 	s32 level;
14 };
15 
16 struct zcomp_strm {
17 	/* The members ->buffer and ->tfm are protected by ->lock. */
18 	local_lock_t lock;
19 	/* compression/decompression buffer */
20 	void *buffer;
21 	void *ctx;
22 };
23 
24 struct zcomp_ops {
25 	int (*compress)(void *ctx, const unsigned char *src, size_t src_len,
26 			unsigned char *dst, size_t *dst_len);
27 
28 	int (*decompress)(void *ctx, const unsigned char *src, size_t src_len,
29 			  unsigned char *dst, size_t dst_len);
30 
31 	void *(*create_ctx)(struct zcomp_params *params);
32 	void (*destroy_ctx)(void *ctx);
33 
34 	const char *name;
35 };
36 
37 /* dynamic per-device compression frontend */
38 struct zcomp {
39 	struct zcomp_strm __percpu *stream;
40 	const struct zcomp_ops *ops;
41 	struct zcomp_params *params;
42 	struct hlist_node node;
43 };
44 
45 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node);
46 int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
47 ssize_t zcomp_available_show(const char *comp, char *buf);
48 bool zcomp_available_algorithm(const char *comp);
49 
50 struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params);
51 void zcomp_destroy(struct zcomp *comp);
52 
53 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp);
54 void zcomp_stream_put(struct zcomp *comp);
55 
56 int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm,
57 		   const void *src, unsigned int *dst_len);
58 int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm,
59 		     const void *src, unsigned int src_len, void *dst);
60 
61 #endif /* _ZCOMP_H_ */
62