162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * drivers/block/zram/zram_group/zram_group.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2020-2022 Huawei Technologies Co., Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _ZRAM_GROUP_H_
962306a36Sopenharmony_ci#define _ZRAM_GROUP_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/mutex.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "zlist.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define ZGRP_MAX_GRP USHRT_MAX
1762306a36Sopenharmony_ci#define ZGRP_MAX_OBJ (1 << 30)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cienum {
2062306a36Sopenharmony_ci	ZGRP_NONE = 0,
2162306a36Sopenharmony_ci	ZGRP_TRACK,
2262306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_WRITEBACK
2362306a36Sopenharmony_ci	ZGRP_WRITE,
2462306a36Sopenharmony_ci#endif
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_WRITEBACK
2862306a36Sopenharmony_ci#define ZGRP_MAX_EXT (ZLIST_IDX_MAX - ZGRP_MAX_GRP - ZGRP_MAX_OBJ)
2962306a36Sopenharmony_cistruct writeback_group {
3062306a36Sopenharmony_ci	bool enable;
3162306a36Sopenharmony_ci	u32 nr_ext;
3262306a36Sopenharmony_ci	struct zlist_node *grp_ext_head;
3362306a36Sopenharmony_ci	struct zlist_node *ext;
3462306a36Sopenharmony_ci	struct zlist_table *ext_tab;
3562306a36Sopenharmony_ci	struct zlist_node *ext_obj_head;
3662306a36Sopenharmony_ci	struct mutex init_lock;
3762306a36Sopenharmony_ci	wait_queue_head_t fault_wq;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci#endif
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct zram_group_stats {
4262306a36Sopenharmony_ci	atomic64_t zram_size;
4362306a36Sopenharmony_ci	atomic_t zram_pages;
4462306a36Sopenharmony_ci	atomic64_t zram_fault;
4562306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_WRITEBACK
4662306a36Sopenharmony_ci	atomic64_t wb_size;
4762306a36Sopenharmony_ci	atomic_t wb_pages;
4862306a36Sopenharmony_ci	atomic64_t wb_fault;
4962306a36Sopenharmony_ci	atomic_t wb_exts;
5062306a36Sopenharmony_ci	atomic64_t write_size;
5162306a36Sopenharmony_ci	atomic64_t read_size;
5262306a36Sopenharmony_ci#endif
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct zram_group {
5662306a36Sopenharmony_ci	u32 nr_obj;
5762306a36Sopenharmony_ci	u32 nr_grp;
5862306a36Sopenharmony_ci	struct zlist_node *grp_obj_head;
5962306a36Sopenharmony_ci	struct zlist_node *obj;
6062306a36Sopenharmony_ci	struct zlist_table *obj_tab;
6162306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_WRITEBACK
6262306a36Sopenharmony_ci	struct writeback_group wbgrp;
6362306a36Sopenharmony_ci#endif
6462306a36Sopenharmony_ci	struct group_swap_device *gsdev;
6562306a36Sopenharmony_ci	struct zram_group_stats *stats;
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_civoid zram_group_meta_free(struct zram_group *zgrp);
6962306a36Sopenharmony_cistruct zram_group *zram_group_meta_alloc(u32 nr_obj, u32 nr_grp);
7062306a36Sopenharmony_civoid zgrp_obj_insert(struct zram_group *zgrp, u32 index, u16 gid);
7162306a36Sopenharmony_cibool zgrp_obj_delete(struct zram_group *zgrp, u32 index, u16 gid);
7262306a36Sopenharmony_ciu32 zgrp_isolate_objs(struct zram_group *zgrp, u16 gid,	u32 *idxs, u32 nr, bool *last);
7362306a36Sopenharmony_cibool zgrp_obj_is_isolated(struct zram_group *zgrp, u32 index);
7462306a36Sopenharmony_civoid zgrp_obj_putback(struct zram_group *zgrp, u32 index, u16 gid);
7562306a36Sopenharmony_civoid zgrp_obj_stats_inc(struct zram_group *zgrp, u16 gid, u32 size);
7662306a36Sopenharmony_civoid zgrp_obj_stats_dec(struct zram_group *zgrp, u16 gid, u32 size);
7762306a36Sopenharmony_civoid zgrp_fault_stats_inc(struct zram_group *zgrp, u16 gid, u32 size);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_DEBUG
8062306a36Sopenharmony_civoid zram_group_dump(struct zram_group *zgrp, u16 gid, u32 index);
8162306a36Sopenharmony_ci#endif
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#ifdef CONFIG_ZRAM_GROUP_WRITEBACK
8462306a36Sopenharmony_civoid zram_group_remove_writeback(struct zram_group *zgrp);
8562306a36Sopenharmony_ciint zram_group_apply_writeback(struct zram_group *zgrp, u32 nr_ext);
8662306a36Sopenharmony_civoid zgrp_ext_insert(struct zram_group *zgrp, u32 eid, u16 gid);
8762306a36Sopenharmony_cibool zgrp_ext_delete(struct zram_group *zgrp, u32 eid, u16 gid);
8862306a36Sopenharmony_ciu32 zgrp_isolate_exts(struct zram_group *zgrp, u16 gid, u32 *eids, u32 nr, bool *last);
8962306a36Sopenharmony_civoid zgrp_get_ext(struct zram_group *zgrp, u32 eid);
9062306a36Sopenharmony_cibool zgrp_put_ext(struct zram_group *zgrp, u32 eid);
9162306a36Sopenharmony_civoid wbgrp_obj_insert(struct zram_group *zgrp, u32 index, u32 eid);
9262306a36Sopenharmony_cibool wbgrp_obj_delete(struct zram_group *zgrp, u32 index, u32 eid);
9362306a36Sopenharmony_ciu32 wbgrp_isolate_objs(struct zram_group *zgrp, u32 eid, u32 *idxs, u32 nr, bool *last);
9462306a36Sopenharmony_civoid wbgrp_obj_stats_inc(struct zram_group *zgrp, u16 gid, u32 eid, u32 size);
9562306a36Sopenharmony_civoid wbgrp_obj_stats_dec(struct zram_group *zgrp, u16 gid, u32 eid, u32 size);
9662306a36Sopenharmony_civoid wbgrp_fault_stats_inc(struct zram_group *zgrp, u16 gid, u32 eid, u32 size);
9762306a36Sopenharmony_ci#endif
9862306a36Sopenharmony_ci#endif
99