// SPDX-License-Identifier: GPL-2.0-only/* * z3fold.c * * Author: Vitaly Wool <vitaly.wool@konsulko.com> * Copyright (C) 2016, Sony Mobile Communications Inc. * * This implementation is based on zbud written by Seth Jennings. * * z3fold is an special purpose allocator for storing compressed pages. It * can store up to three compressed pages per page which improves the * compression ratio of zbud while retaining its main concepts (e. g. always * storing an integral number of objects per page) and simplicity. * It still has simple and deterministic reclaim properties that make it * preferable to a higher density approach (with no requirement on integral * number of object per page) when reclaim is used. * * As in zbud, pages are divided into "chunks". The size of the chunks is * fixed at compile time and is determined by NCHUNKS_ORDER below. * * z3fold doesn't export any API and is meant to be used via zpool API. */#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt#include<linux/atomic.h>#include<linux/sched.h>#include<linux/cpumask.h>#include<linux/list.h>#include<linux/mm.h>#include<linux/module.h>#include<linux/page-flags.h>#include<linux/migrate.h>#include<linux/node.h>#include<linux/compaction.h>#include<linux/percpu.h>#include<linux/mount.h>#include<linux/pseudo_fs.h>#include<linux/fs.h>#include<linux/preempt.h>#include<linux/workqueue.h>#include<linux/slab.h&g