]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/zsmalloc: convert __free_zspage() to use zpdesc
authorHyeonggon Yoo <42.hyeyoo@gmail.com>
Mon, 16 Dec 2024 15:04:43 +0000 (00:04 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 26 Jan 2025 04:22:34 +0000 (20:22 -0800)
Introduce zpdesc_is_locked() and convert __free_zspage() to use zpdesc.

Link: https://lkml.kernel.org/r/20241216150450.1228021-13-42.hyeyoo@gmail.com
Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Signed-off-by: Alex Shi <alexs@kernel.org>
Acked-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Tested-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/zpdesc.h
mm/zsmalloc.c

index 193d40226188b408d51da9887bfd8d8fa7a22926..4a4e68446f5a2e6ae9624cb89bbb1a29a6e0e6fd 100644 (file)
@@ -165,4 +165,8 @@ static inline struct zone *zpdesc_zone(struct zpdesc *zpdesc)
        return page_zone(zpdesc_page(zpdesc));
 }
 
+static inline bool zpdesc_is_locked(struct zpdesc *zpdesc)
+{
+       return folio_test_locked(zpdesc_folio(zpdesc));
+}
 #endif
index 98b152a0b264388b9399d6a6484134eace3aafd0..ad54fd8e934fa314b7bed09e89d2bcc02ff76c4f 100644 (file)
@@ -878,23 +878,23 @@ unlock:
 static void __free_zspage(struct zs_pool *pool, struct size_class *class,
                                struct zspage *zspage)
 {
-       struct page *page, *next;
+       struct zpdesc *zpdesc, *next;
 
        assert_spin_locked(&class->lock);
 
        VM_BUG_ON(get_zspage_inuse(zspage));
        VM_BUG_ON(zspage->fullness != ZS_INUSE_RATIO_0);
 
-       next = page = get_first_page(zspage);
+       next = zpdesc = get_first_zpdesc(zspage);
        do {
-               VM_BUG_ON_PAGE(!PageLocked(page), page);
-               next = get_next_page(page);
-               reset_zpdesc(page_zpdesc(page));
-               unlock_page(page);
-               dec_zone_page_state(page, NR_ZSPAGES);
-               put_page(page);
-               page = next;
-       } while (page != NULL);
+               VM_BUG_ON_PAGE(!zpdesc_is_locked(zpdesc), zpdesc_page(zpdesc));
+               next = get_next_zpdesc(zpdesc);
+               reset_zpdesc(zpdesc);
+               zpdesc_unlock(zpdesc);
+               zpdesc_dec_zone_page_state(zpdesc);
+               zpdesc_put(zpdesc);
+               zpdesc = next;
+       } while (zpdesc != NULL);
 
        cache_free_zspage(pool, zspage);