Commit 2a03085c authored by Miaohe Lin's avatar Miaohe Lin Committed by Linus Torvalds

mm/zbud: don't export any zbud API

The zbud doesn't need to export any API and it is meant to be used via
zpool API since the commit 12d79d64 ("mm/zpool: update zswap to use
zpool").  So we can remove the unneeded zbud.h and move down zpool API to
avoid any forward declaration.

[linmiaohe@huawei.com: fix unused function warnings when CONFIG_ZPOOL is disabled]
  Link: https://lkml.kernel.org/r/20210619025508.1239386-1-linmiaohe@huawei.com

Link: https://lkml.kernel.org/r/20210608114515.206992-3-linmiaohe@huawei.comSigned-off-by: default avatarMiaohe Lin <linmiaohe@huawei.com>
Cc: Dan Streetman <ddstreet@ieee.org>
Cc: Seth Jennings <sjenning@redhat.com>
Cc: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f356aeac
...@@ -20172,7 +20172,6 @@ M: Seth Jennings <sjenning@redhat.com> ...@@ -20172,7 +20172,6 @@ M: Seth Jennings <sjenning@redhat.com>
M: Dan Streetman <ddstreet@ieee.org> M: Dan Streetman <ddstreet@ieee.org>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
F: include/linux/zbud.h
F: mm/zbud.c F: mm/zbud.c
ZD1211RW WIRELESS DRIVER ZD1211RW WIRELESS DRIVER
......
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ZBUD_H_
#define _ZBUD_H_
#include <linux/types.h>
struct zbud_pool;
struct zbud_ops {
int (*evict)(struct zbud_pool *pool, unsigned long handle);
};
struct zbud_pool *zbud_create_pool(gfp_t gfp, const struct zbud_ops *ops);
void zbud_destroy_pool(struct zbud_pool *pool);
int zbud_alloc(struct zbud_pool *pool, size_t size, gfp_t gfp,
unsigned long *handle);
void zbud_free(struct zbud_pool *pool, unsigned long handle);
int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries);
void *zbud_map(struct zbud_pool *pool, unsigned long handle);
void zbud_unmap(struct zbud_pool *pool, unsigned long handle);
u64 zbud_get_pool_size(struct zbud_pool *pool);
#endif /* _ZBUD_H_ */
...@@ -674,6 +674,7 @@ config ZPOOL ...@@ -674,6 +674,7 @@ config ZPOOL
config ZBUD config ZBUD
tristate "Low (Up to 2x) density storage for compressed pages" tristate "Low (Up to 2x) density storage for compressed pages"
depends on ZPOOL
help help
A special purpose allocator for storing compressed pages. A special purpose allocator for storing compressed pages.
It is designed to store up to two compressed pages per physical It is designed to store up to two compressed pages per physical
......
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#include <linux/preempt.h> #include <linux/preempt.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/zbud.h>
#include <linux/zpool.h> #include <linux/zpool.h>
/***************** /*****************
...@@ -73,6 +72,12 @@ ...@@ -73,6 +72,12 @@
#define ZHDR_SIZE_ALIGNED CHUNK_SIZE #define ZHDR_SIZE_ALIGNED CHUNK_SIZE
#define NCHUNKS ((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT) #define NCHUNKS ((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
struct zbud_pool;
struct zbud_ops {
int (*evict)(struct zbud_pool *pool, unsigned long handle);
};
/** /**
* struct zbud_pool - stores metadata for each zbud pool * struct zbud_pool - stores metadata for each zbud pool
* @lock: protects all pool fields and first|last_chunk fields of any * @lock: protects all pool fields and first|last_chunk fields of any
...@@ -104,10 +109,8 @@ struct zbud_pool { ...@@ -104,10 +109,8 @@ struct zbud_pool {
struct list_head lru; struct list_head lru;
u64 pages_nr; u64 pages_nr;
const struct zbud_ops *ops; const struct zbud_ops *ops;
#ifdef CONFIG_ZPOOL
struct zpool *zpool; struct zpool *zpool;
const struct zpool_ops *zpool_ops; const struct zpool_ops *zpool_ops;
#endif
}; };
/* /*
...@@ -126,104 +129,6 @@ struct zbud_header { ...@@ -126,104 +129,6 @@ struct zbud_header {
bool under_reclaim; bool under_reclaim;
}; };
/*****************
* zpool
****************/
#ifdef CONFIG_ZPOOL
static int zbud_zpool_evict(struct zbud_pool *pool, unsigned long handle)
{
if (pool->zpool && pool->zpool_ops && pool->zpool_ops->evict)
return pool->zpool_ops->evict(pool->zpool, handle);
else
return -ENOENT;
}
static const struct zbud_ops zbud_zpool_ops = {
.evict = zbud_zpool_evict
};
static void *zbud_zpool_create(const char *name, gfp_t gfp,
const struct zpool_ops *zpool_ops,
struct zpool *zpool)
{
struct zbud_pool *pool;
pool = zbud_create_pool(gfp, zpool_ops ? &zbud_zpool_ops : NULL);
if (pool) {
pool->zpool = zpool;
pool->zpool_ops = zpool_ops;
}
return pool;
}
static void zbud_zpool_destroy(void *pool)
{
zbud_destroy_pool(pool);
}
static int zbud_zpool_malloc(void *pool, size_t size, gfp_t gfp,
unsigned long *handle)
{
return zbud_alloc(pool, size, gfp, handle);
}
static void zbud_zpool_free(void *pool, unsigned long handle)
{
zbud_free(pool, handle);
}
static int zbud_zpool_shrink(void *pool, unsigned int pages,
unsigned int *reclaimed)
{
unsigned int total = 0;
int ret = -EINVAL;
while (total < pages) {
ret = zbud_reclaim_page(pool, 8);
if (ret < 0)
break;
total++;
}
if (reclaimed)
*reclaimed = total;
return ret;
}
static void *zbud_zpool_map(void *pool, unsigned long handle,
enum zpool_mapmode mm)
{
return zbud_map(pool, handle);
}
static void zbud_zpool_unmap(void *pool, unsigned long handle)
{
zbud_unmap(pool, handle);
}
static u64 zbud_zpool_total_size(void *pool)
{
return zbud_get_pool_size(pool) * PAGE_SIZE;
}
static struct zpool_driver zbud_zpool_driver = {
.type = "zbud",
.sleep_mapped = true,
.owner = THIS_MODULE,
.create = zbud_zpool_create,
.destroy = zbud_zpool_destroy,
.malloc = zbud_zpool_malloc,
.free = zbud_zpool_free,
.shrink = zbud_zpool_shrink,
.map = zbud_zpool_map,
.unmap = zbud_zpool_unmap,
.total_size = zbud_zpool_total_size,
};
MODULE_ALIAS("zpool-zbud");
#endif /* CONFIG_ZPOOL */
/***************** /*****************
* Helpers * Helpers
*****************/ *****************/
...@@ -310,7 +215,7 @@ static int num_free_chunks(struct zbud_header *zhdr) ...@@ -310,7 +215,7 @@ static int num_free_chunks(struct zbud_header *zhdr)
* Return: pointer to the new zbud pool or NULL if the metadata allocation * Return: pointer to the new zbud pool or NULL if the metadata allocation
* failed. * failed.
*/ */
struct zbud_pool *zbud_create_pool(gfp_t gfp, const struct zbud_ops *ops) static struct zbud_pool *zbud_create_pool(gfp_t gfp, const struct zbud_ops *ops)
{ {
struct zbud_pool *pool; struct zbud_pool *pool;
int i; int i;
...@@ -334,7 +239,7 @@ struct zbud_pool *zbud_create_pool(gfp_t gfp, const struct zbud_ops *ops) ...@@ -334,7 +239,7 @@ struct zbud_pool *zbud_create_pool(gfp_t gfp, const struct zbud_ops *ops)
* *
* The pool should be emptied before this function is called. * The pool should be emptied before this function is called.
*/ */
void zbud_destroy_pool(struct zbud_pool *pool) static void zbud_destroy_pool(struct zbud_pool *pool)
{ {
kfree(pool); kfree(pool);
} }
...@@ -358,7 +263,7 @@ void zbud_destroy_pool(struct zbud_pool *pool) ...@@ -358,7 +263,7 @@ void zbud_destroy_pool(struct zbud_pool *pool)
* gfp arguments are invalid or -ENOMEM if the pool was unable to allocate * gfp arguments are invalid or -ENOMEM if the pool was unable to allocate
* a new page. * a new page.
*/ */
int zbud_alloc(struct zbud_pool *pool, size_t size, gfp_t gfp, static int zbud_alloc(struct zbud_pool *pool, size_t size, gfp_t gfp,
unsigned long *handle) unsigned long *handle)
{ {
int chunks, i, freechunks; int chunks, i, freechunks;
...@@ -433,7 +338,7 @@ int zbud_alloc(struct zbud_pool *pool, size_t size, gfp_t gfp, ...@@ -433,7 +338,7 @@ int zbud_alloc(struct zbud_pool *pool, size_t size, gfp_t gfp,
* only sets the first|last_chunks to 0. The page is actually freed * only sets the first|last_chunks to 0. The page is actually freed
* once both buddies are evicted (see zbud_reclaim_page() below). * once both buddies are evicted (see zbud_reclaim_page() below).
*/ */
void zbud_free(struct zbud_pool *pool, unsigned long handle) static void zbud_free(struct zbud_pool *pool, unsigned long handle)
{ {
struct zbud_header *zhdr; struct zbud_header *zhdr;
int freechunks; int freechunks;
...@@ -505,7 +410,7 @@ void zbud_free(struct zbud_pool *pool, unsigned long handle) ...@@ -505,7 +410,7 @@ void zbud_free(struct zbud_pool *pool, unsigned long handle)
* no pages to evict or an eviction handler is not registered, -EAGAIN if * no pages to evict or an eviction handler is not registered, -EAGAIN if
* the retry limit was hit. * the retry limit was hit.
*/ */
int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries) static int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries)
{ {
int i, ret, freechunks; int i, ret, freechunks;
struct zbud_header *zhdr; struct zbud_header *zhdr;
...@@ -587,7 +492,7 @@ int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries) ...@@ -587,7 +492,7 @@ int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries)
* *
* Returns: a pointer to the mapped allocation * Returns: a pointer to the mapped allocation
*/ */
void *zbud_map(struct zbud_pool *pool, unsigned long handle) static void *zbud_map(struct zbud_pool *pool, unsigned long handle)
{ {
return (void *)(handle); return (void *)(handle);
} }
...@@ -597,7 +502,7 @@ void *zbud_map(struct zbud_pool *pool, unsigned long handle) ...@@ -597,7 +502,7 @@ void *zbud_map(struct zbud_pool *pool, unsigned long handle)
* @pool: pool in which the allocation resides * @pool: pool in which the allocation resides
* @handle: handle associated with the allocation to be unmapped * @handle: handle associated with the allocation to be unmapped
*/ */
void zbud_unmap(struct zbud_pool *pool, unsigned long handle) static void zbud_unmap(struct zbud_pool *pool, unsigned long handle)
{ {
} }
...@@ -608,30 +513,120 @@ void zbud_unmap(struct zbud_pool *pool, unsigned long handle) ...@@ -608,30 +513,120 @@ void zbud_unmap(struct zbud_pool *pool, unsigned long handle)
* Returns: size in pages of the given pool. The pool lock need not be * Returns: size in pages of the given pool. The pool lock need not be
* taken to access pages_nr. * taken to access pages_nr.
*/ */
u64 zbud_get_pool_size(struct zbud_pool *pool) static u64 zbud_get_pool_size(struct zbud_pool *pool)
{ {
return pool->pages_nr; return pool->pages_nr;
} }
/*****************
* zpool
****************/
static int zbud_zpool_evict(struct zbud_pool *pool, unsigned long handle)
{
if (pool->zpool && pool->zpool_ops && pool->zpool_ops->evict)
return pool->zpool_ops->evict(pool->zpool, handle);
else
return -ENOENT;
}
static const struct zbud_ops zbud_zpool_ops = {
.evict = zbud_zpool_evict
};
static void *zbud_zpool_create(const char *name, gfp_t gfp,
const struct zpool_ops *zpool_ops,
struct zpool *zpool)
{
struct zbud_pool *pool;
pool = zbud_create_pool(gfp, zpool_ops ? &zbud_zpool_ops : NULL);
if (pool) {
pool->zpool = zpool;
pool->zpool_ops = zpool_ops;
}
return pool;
}
static void zbud_zpool_destroy(void *pool)
{
zbud_destroy_pool(pool);
}
static int zbud_zpool_malloc(void *pool, size_t size, gfp_t gfp,
unsigned long *handle)
{
return zbud_alloc(pool, size, gfp, handle);
}
static void zbud_zpool_free(void *pool, unsigned long handle)
{
zbud_free(pool, handle);
}
static int zbud_zpool_shrink(void *pool, unsigned int pages,
unsigned int *reclaimed)
{
unsigned int total = 0;
int ret = -EINVAL;
while (total < pages) {
ret = zbud_reclaim_page(pool, 8);
if (ret < 0)
break;
total++;
}
if (reclaimed)
*reclaimed = total;
return ret;
}
static void *zbud_zpool_map(void *pool, unsigned long handle,
enum zpool_mapmode mm)
{
return zbud_map(pool, handle);
}
static void zbud_zpool_unmap(void *pool, unsigned long handle)
{
zbud_unmap(pool, handle);
}
static u64 zbud_zpool_total_size(void *pool)
{
return zbud_get_pool_size(pool) * PAGE_SIZE;
}
static struct zpool_driver zbud_zpool_driver = {
.type = "zbud",
.sleep_mapped = true,
.owner = THIS_MODULE,
.create = zbud_zpool_create,
.destroy = zbud_zpool_destroy,
.malloc = zbud_zpool_malloc,
.free = zbud_zpool_free,
.shrink = zbud_zpool_shrink,
.map = zbud_zpool_map,
.unmap = zbud_zpool_unmap,
.total_size = zbud_zpool_total_size,
};
MODULE_ALIAS("zpool-zbud");
static int __init init_zbud(void) static int __init init_zbud(void)
{ {
/* Make sure the zbud header will fit in one chunk */ /* Make sure the zbud header will fit in one chunk */
BUILD_BUG_ON(sizeof(struct zbud_header) > ZHDR_SIZE_ALIGNED); BUILD_BUG_ON(sizeof(struct zbud_header) > ZHDR_SIZE_ALIGNED);
pr_info("loaded\n"); pr_info("loaded\n");
#ifdef CONFIG_ZPOOL
zpool_register_driver(&zbud_zpool_driver); zpool_register_driver(&zbud_zpool_driver);
#endif
return 0; return 0;
} }
static void __exit exit_zbud(void) static void __exit exit_zbud(void)
{ {
#ifdef CONFIG_ZPOOL
zpool_unregister_driver(&zbud_zpool_driver); zpool_unregister_driver(&zbud_zpool_driver);
#endif
pr_info("unloaded\n"); pr_info("unloaded\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment