All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Cleanups for zbud
@ 2021-06-05  7:51 Miaohe Lin
  2021-06-05  7:51 ` [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool Miaohe Lin
  2021-06-05  7:51 ` [PATCH 2/2] mm/zbud: don't export any zbud API Miaohe Lin
  0 siblings, 2 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-06-05  7:51 UTC (permalink / raw)
  To: akpm, sjenning, ddstreet; +Cc: linux-kernel, linux-mm, linmiaohe

Hi all,
This series contains just cleanups to save some possible memory in
zbud_pool and avoid exporting any unneeded zbud API. More details
can be found in the respective changelogs. Thanks!

Miaohe Lin (2):
  mm/zbud: reuse unbuddied[0] as buddied in zbud_pool
  mm/zbud: don't export any zbud API

 MAINTAINERS          |   1 -
 include/linux/zbud.h |  23 ---
 mm/zbud.c            | 372 ++++++++++++++++++++++---------------------
 3 files changed, 189 insertions(+), 207 deletions(-)
 delete mode 100644 include/linux/zbud.h

-- 
2.23.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool
  2021-06-05  7:51 [PATCH 0/2] Cleanups for zbud Miaohe Lin
@ 2021-06-05  7:51 ` Miaohe Lin
  2021-06-07 23:10   ` Andrew Morton
  2021-06-05  7:51 ` [PATCH 2/2] mm/zbud: don't export any zbud API Miaohe Lin
  1 sibling, 1 reply; 5+ messages in thread
From: Miaohe Lin @ 2021-06-05  7:51 UTC (permalink / raw)
  To: akpm, sjenning, ddstreet; +Cc: linux-kernel, linux-mm, linmiaohe

Since commit 9d8c5b5284e4 ("mm: zbud: fix condition check on allocation
size"), zbud_pool.unbuddied[0] is always unused. We can reuse it as buddied
field to save some possible memory.

Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
---
 mm/zbud.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/zbud.c b/mm/zbud.c
index a200121da400..91543be47e3d 100644
--- a/mm/zbud.c
+++ b/mm/zbud.c
@@ -96,7 +96,7 @@
 struct zbud_pool {
 	spinlock_t lock;
 	struct list_head unbuddied[NCHUNKS];
-	struct list_head buddied;
+#define buddied unbuddied[0]
 	struct list_head lru;
 	u64 pages_nr;
 	const struct zbud_ops *ops;
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] mm/zbud: don't export any zbud API
  2021-06-05  7:51 [PATCH 0/2] Cleanups for zbud Miaohe Lin
  2021-06-05  7:51 ` [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool Miaohe Lin
@ 2021-06-05  7:51 ` Miaohe Lin
  1 sibling, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-06-05  7:51 UTC (permalink / raw)
  To: akpm, sjenning, ddstreet; +Cc: linux-kernel, linux-mm, linmiaohe

The zbud doesn't need to export any API and it is meant to be used via
zpool API since the commit 12d79d64bfd3 ("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.

Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
---
 MAINTAINERS          |   1 -
 include/linux/zbud.h |  23 -----
 mm/zbud.c            | 219 ++++++++++++++++++++++---------------------
 3 files changed, 112 insertions(+), 131 deletions(-)
 delete mode 100644 include/linux/zbud.h

diff --git a/MAINTAINERS b/MAINTAINERS
index d8648ee43199..625d66d7aacc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20264,7 +20264,6 @@ M:	Seth Jennings <sjenning@redhat.com>
 M:	Dan Streetman <ddstreet@ieee.org>
 L:	linux-mm@kvack.org
 S:	Maintained
-F:	include/linux/zbud.h
 F:	mm/zbud.c
 
 ZD1211RW WIRELESS DRIVER
diff --git a/include/linux/zbud.h b/include/linux/zbud.h
deleted file mode 100644
index b1eaf6e31735..000000000000
--- a/include/linux/zbud.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* 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_ */
diff --git a/mm/zbud.c b/mm/zbud.c
index 91543be47e3d..3a048f603255 100644
--- a/mm/zbud.c
+++ b/mm/zbud.c
@@ -51,7 +51,6 @@
 #include <linux/preempt.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
-#include <linux/zbud.h>
 #include <linux/zpool.h>
 
 /*****************
@@ -73,6 +72,12 @@
 #define ZHDR_SIZE_ALIGNED CHUNK_SIZE
 #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
  * @lock:	protects all pool fields and first|last_chunk fields of any
@@ -122,104 +127,6 @@ struct zbud_header {
 	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
 *****************/
@@ -306,7 +213,7 @@ static int num_free_chunks(struct zbud_header *zhdr)
  * Return: pointer to the new zbud pool or NULL if the metadata allocation
  * 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;
 	int i;
@@ -330,7 +237,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.
  */
-void zbud_destroy_pool(struct zbud_pool *pool)
+static void zbud_destroy_pool(struct zbud_pool *pool)
 {
 	kfree(pool);
 }
@@ -354,7 +261,7 @@ void zbud_destroy_pool(struct zbud_pool *pool)
  * gfp arguments are invalid or -ENOMEM if the pool was unable to allocate
  * 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)
 {
 	int chunks, i, freechunks;
@@ -429,7 +336,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
  * 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;
 	int freechunks;
@@ -501,7 +408,7 @@ void zbud_free(struct zbud_pool *pool, unsigned long handle)
  * no pages to evict or an eviction handler is not registered, -EAGAIN if
  * 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;
 	struct zbud_header *zhdr;
@@ -583,7 +490,7 @@ int zbud_reclaim_page(struct zbud_pool *pool, unsigned int retries)
  *
  * 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);
 }
@@ -593,7 +500,7 @@ void *zbud_map(struct zbud_pool *pool, unsigned long handle)
  * @pool:	pool in which the allocation resides
  * @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)
 {
 }
 
@@ -604,11 +511,109 @@ void zbud_unmap(struct zbud_pool *pool, unsigned long handle)
  * Returns: size in pages of the given pool.  The pool lock need not be
  * 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;
 }
 
+/*****************
+ * 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 */
+
 static int __init init_zbud(void)
 {
 	/* Make sure the zbud header will fit in one chunk */
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool
  2021-06-05  7:51 ` [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool Miaohe Lin
@ 2021-06-07 23:10   ` Andrew Morton
  2021-06-08  1:41     ` Miaohe Lin
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2021-06-07 23:10 UTC (permalink / raw)
  To: Miaohe Lin; +Cc: sjenning, ddstreet, linux-kernel, linux-mm

On Sat, 5 Jun 2021 15:51:40 +0800 Miaohe Lin <linmiaohe@huawei.com> wrote:

> Since commit 9d8c5b5284e4 ("mm: zbud: fix condition check on allocation
> size"), zbud_pool.unbuddied[0] is always unused. We can reuse it as buddied
> field to save some possible memory.
> 
> ...
>
> --- a/mm/zbud.c
> +++ b/mm/zbud.c
> @@ -96,7 +96,7 @@
>  struct zbud_pool {
>  	spinlock_t lock;
>  	struct list_head unbuddied[NCHUNKS];
> -	struct list_head buddied;
> +#define buddied unbuddied[0]
>  	struct list_head lru;
>  	u64 pages_nr;
>  	const struct zbud_ops *ops;

That looks a bit hacky.  Can we at least have a comment explaining
what's going on?

Would it be better to implement this with a union, rather than a #define?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool
  2021-06-07 23:10   ` Andrew Morton
@ 2021-06-08  1:41     ` Miaohe Lin
  0 siblings, 0 replies; 5+ messages in thread
From: Miaohe Lin @ 2021-06-08  1:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: sjenning, ddstreet, linux-kernel, linux-mm

On 2021/6/8 7:10, Andrew Morton wrote:
> On Sat, 5 Jun 2021 15:51:40 +0800 Miaohe Lin <linmiaohe@huawei.com> wrote:
> 
>> Since commit 9d8c5b5284e4 ("mm: zbud: fix condition check on allocation
>> size"), zbud_pool.unbuddied[0] is always unused. We can reuse it as buddied
>> field to save some possible memory.
>>
>> ...
>>
>> --- a/mm/zbud.c
>> +++ b/mm/zbud.c
>> @@ -96,7 +96,7 @@
>>  struct zbud_pool {
>>  	spinlock_t lock;
>>  	struct list_head unbuddied[NCHUNKS];
>> -	struct list_head buddied;
>> +#define buddied unbuddied[0]
>>  	struct list_head lru;
>>  	u64 pages_nr;
>>  	const struct zbud_ops *ops;
> 
> That looks a bit hacky.  Can we at least have a comment explaining
> what's going on?
> 
> Would it be better to implement this with a union, rather than a #define?

It seems union is better and comment is necessary. Will try to do this.
Many thanks for your comment and reply!

> .
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-06-08  1:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-05  7:51 [PATCH 0/2] Cleanups for zbud Miaohe Lin
2021-06-05  7:51 ` [PATCH 1/2] mm/zbud: reuse unbuddied[0] as buddied in zbud_pool Miaohe Lin
2021-06-07 23:10   ` Andrew Morton
2021-06-08  1:41     ` Miaohe Lin
2021-06-05  7:51 ` [PATCH 2/2] mm/zbud: don't export any zbud API Miaohe Lin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.