zsmalloc: use all available 24 bits of page_type
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 21 Aug 2024 17:39:12 +0000 (18:39 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 4 Sep 2024 04:15:43 +0000 (21:15 -0700)
Now that we have an extra 8 bits, we don't need to limit ourselves to
supporting a 64KiB page size.  I'm sure both Hexagon users are grateful,
but it does reduce complexity a little.  We can also remove
reset_first_obj_offset() as calling __ClearPageZsmalloc() will now reset
all 32 bits of page_type.

Link: https://lkml.kernel.org/r/20240821173914.2270383-5-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Cc: Kent Overstreet <kent.overstreet@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/Kconfig
mm/Kconfig
mm/zsmalloc.c

index eacf1cba7bf4536c3dda9ea7feda9f45fc3978db..7b29cce60ab2f2a26e3808797331200826a20d59 100644 (file)
@@ -2,7 +2,6 @@
 config ZRAM
        tristate "Compressed RAM block device support"
        depends on BLOCK && SYSFS && MMU
-       depends on HAVE_ZSMALLOC
        depends on CRYPTO_LZO || CRYPTO_ZSTD || CRYPTO_LZ4 || CRYPTO_LZ4HC || CRYPTO_842
        select ZSMALLOC
        help
index 3936fe4d26d91b69dde4868bc0377039989b1ab1..5946dcdcaedac8909b25f83959d7020d44d33f36 100644 (file)
@@ -128,7 +128,7 @@ config ZSWAP_COMPRESSOR_DEFAULT
 choice
        prompt "Default allocator"
        depends on ZSWAP
-       default ZSWAP_ZPOOL_DEFAULT_ZSMALLOC if HAVE_ZSMALLOC
+       default ZSWAP_ZPOOL_DEFAULT_ZSMALLOC if MMU
        default ZSWAP_ZPOOL_DEFAULT_ZBUD
        help
          Selects the default allocator for the compressed cache for
@@ -154,7 +154,6 @@ config ZSWAP_ZPOOL_DEFAULT_Z3FOLD
 
 config ZSWAP_ZPOOL_DEFAULT_ZSMALLOC
        bool "zsmalloc"
-       depends on HAVE_ZSMALLOC
        select ZSMALLOC
        help
          Use the zsmalloc allocator as the default allocator.
@@ -187,15 +186,10 @@ config Z3FOLD
          page. It is a ZBUD derivative so the simplicity and determinism are
          still there.
 
-config HAVE_ZSMALLOC
-       def_bool y
-       depends on MMU
-       depends on PAGE_SIZE_LESS_THAN_256KB # we want <= 64 KiB
-
 config ZSMALLOC
        tristate
        prompt "N:1 compression allocator (zsmalloc)" if ZSWAP
-       depends on HAVE_ZSMALLOC
+       depends on MMU
        help
          zsmalloc is a slab-based memory allocator designed to store
          pages of various compression levels efficiently. It achieves
index 2d3163e4da96a565f7c2f8bcc6ac122ed64aa2f0..73a3ec5b21ad0015141feab1b49b4e5359b3d483 100644 (file)
@@ -20,7 +20,7 @@
  *     page->index: links together all component pages of a zspage
  *             For the huge page, this is always 0, so we use this field
  *             to store handle.
- *     page->page_type: PG_zsmalloc, lower 16 bit locate the first object
+ *     page->page_type: PGTY_zsmalloc, lower 24 bits locate the first object
  *             offset in a subpage of a zspage
  *
  * Usage of struct page flags:
@@ -452,13 +452,7 @@ static inline struct page *get_first_page(struct zspage *zspage)
        return first_page;
 }
 
-#define FIRST_OBJ_PAGE_TYPE_MASK       0xffff
-
-static inline void reset_first_obj_offset(struct page *page)
-{
-       VM_WARN_ON_ONCE(!PageZsmalloc(page));
-       page->page_type |= FIRST_OBJ_PAGE_TYPE_MASK;
-}
+#define FIRST_OBJ_PAGE_TYPE_MASK       0xffffff
 
 static inline unsigned int get_first_obj_offset(struct page *page)
 {
@@ -468,8 +462,8 @@ static inline unsigned int get_first_obj_offset(struct page *page)
 
 static inline void set_first_obj_offset(struct page *page, unsigned int offset)
 {
-       /* With 16 bit available, we can support offsets into 64 KiB pages. */
-       BUILD_BUG_ON(PAGE_SIZE > SZ_64K);
+       /* With 24 bits available, we can support offsets into 16 MiB pages. */
+       BUILD_BUG_ON(PAGE_SIZE > SZ_16M);
        VM_WARN_ON_ONCE(!PageZsmalloc(page));
        VM_WARN_ON_ONCE(offset & ~FIRST_OBJ_PAGE_TYPE_MASK);
        page->page_type &= ~FIRST_OBJ_PAGE_TYPE_MASK;
@@ -808,7 +802,6 @@ static void reset_page(struct page *page)
        ClearPagePrivate(page);
        set_page_private(page, 0);
        page->index = 0;
-       reset_first_obj_offset(page);
        __ClearPageZsmalloc(page);
 }