From: Yosry Ahmed <yosry.ahmed@linux.dev>
To: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Minchan Kim <minchan@kernel.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Nhat Pham <nphamcs@gmail.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCHv1 2/6] zsmalloc: factor out size-class locking helpers
Date: Wed, 29 Jan 2025 17:01:27 +0000 [thread overview]
Message-ID: <Z5pe50-PaWDfkWZU@google.com> (raw)
In-Reply-To: <20250129064853.2210753-3-senozhatsky@chromium.org>
On Wed, Jan 29, 2025 at 03:43:48PM +0900, Sergey Senozhatsky wrote:
> Move open-coded size-class locking to dedicated helpers.
>
> Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reviewed-by: Yosry Ahmed <yosry.ahmed@linux.dev>
> ---
> mm/zsmalloc.c | 47 ++++++++++++++++++++++++++++-------------------
> 1 file changed, 28 insertions(+), 19 deletions(-)
>
> diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> index 2f8a2b139919..0f575307675d 100644
> --- a/mm/zsmalloc.c
> +++ b/mm/zsmalloc.c
> @@ -254,6 +254,16 @@ static bool pool_lock_is_contended(struct zs_pool *pool)
> return rwlock_is_contended(&pool->migrate_lock);
> }
>
> +static void size_class_lock(struct size_class *class)
> +{
> + spin_lock(&class->lock);
> +}
> +
> +static void size_class_unlock(struct size_class *class)
> +{
> + spin_unlock(&class->lock);
> +}
> +
> static inline void zpdesc_set_first(struct zpdesc *zpdesc)
> {
> SetPagePrivate(zpdesc_page(zpdesc));
> @@ -614,8 +624,7 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
> if (class->index != i)
> continue;
>
> - spin_lock(&class->lock);
> -
> + size_class_lock(class);
> seq_printf(s, " %5u %5u ", i, class->size);
> for (fg = ZS_INUSE_RATIO_10; fg < NR_FULLNESS_GROUPS; fg++) {
> inuse_totals[fg] += class_stat_read(class, fg);
> @@ -625,7 +634,7 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
> obj_allocated = class_stat_read(class, ZS_OBJS_ALLOCATED);
> obj_used = class_stat_read(class, ZS_OBJS_INUSE);
> freeable = zs_can_compact(class);
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
>
> objs_per_zspage = class->objs_per_zspage;
> pages_used = obj_allocated / objs_per_zspage *
> @@ -1400,7 +1409,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
> class = pool->size_class[get_size_class_index(size)];
>
> /* class->lock effectively protects the zpage migration */
> - spin_lock(&class->lock);
> + size_class_lock(class);
> zspage = find_get_zspage(class);
> if (likely(zspage)) {
> obj_malloc(pool, zspage, handle);
> @@ -1411,7 +1420,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
> goto out;
> }
>
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
>
> zspage = alloc_zspage(pool, class, gfp);
> if (!zspage) {
> @@ -1419,7 +1428,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
> return (unsigned long)ERR_PTR(-ENOMEM);
> }
>
> - spin_lock(&class->lock);
> + size_class_lock(class);
> obj_malloc(pool, zspage, handle);
> newfg = get_fullness_group(class, zspage);
> insert_zspage(class, zspage, newfg);
> @@ -1430,7 +1439,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
> /* We completely set up zspage so mark them as movable */
> SetZsPageMovable(pool, zspage);
> out:
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
>
> return handle;
> }
> @@ -1484,7 +1493,7 @@ void zs_free(struct zs_pool *pool, unsigned long handle)
> obj_to_zpdesc(obj, &f_zpdesc);
> zspage = get_zspage(f_zpdesc);
> class = zspage_class(pool, zspage);
> - spin_lock(&class->lock);
> + size_class_lock(class);
> pool_read_unlock(pool);
>
> class_stat_sub(class, ZS_OBJS_INUSE, 1);
> @@ -1494,7 +1503,7 @@ void zs_free(struct zs_pool *pool, unsigned long handle)
> if (fullness == ZS_INUSE_RATIO_0)
> free_zspage(pool, class, zspage);
>
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> cache_free_handle(pool, handle);
> }
> EXPORT_SYMBOL_GPL(zs_free);
> @@ -1828,7 +1837,7 @@ static int zs_page_migrate(struct page *newpage, struct page *page,
> /*
> * the class lock protects zpage alloc/free in the zspage.
> */
> - spin_lock(&class->lock);
> + size_class_lock(class);
> /* the migrate_write_lock protects zpage access via zs_map_object */
> migrate_write_lock(zspage);
>
> @@ -1860,7 +1869,7 @@ static int zs_page_migrate(struct page *newpage, struct page *page,
> * it's okay to release migration_lock.
> */
> pool_write_unlock(pool);
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> migrate_write_unlock(zspage);
>
> zpdesc_get(newzpdesc);
> @@ -1904,10 +1913,10 @@ static void async_free_zspage(struct work_struct *work)
> if (class->index != i)
> continue;
>
> - spin_lock(&class->lock);
> + size_class_lock(class);
> list_splice_init(&class->fullness_list[ZS_INUSE_RATIO_0],
> &free_pages);
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> }
>
> list_for_each_entry_safe(zspage, tmp, &free_pages, list) {
> @@ -1915,10 +1924,10 @@ static void async_free_zspage(struct work_struct *work)
> lock_zspage(zspage);
>
> class = zspage_class(pool, zspage);
> - spin_lock(&class->lock);
> + size_class_lock(class);
> class_stat_sub(class, ZS_INUSE_RATIO_0, 1);
> __free_zspage(pool, class, zspage);
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> }
> };
>
> @@ -1983,7 +1992,7 @@ static unsigned long __zs_compact(struct zs_pool *pool,
> * as well as zpage allocation/free
> */
> pool_write_lock(pool);
> - spin_lock(&class->lock);
> + size_class_lock(class);
> while (zs_can_compact(class)) {
> int fg;
>
> @@ -2013,11 +2022,11 @@ static unsigned long __zs_compact(struct zs_pool *pool,
> putback_zspage(class, dst_zspage);
> dst_zspage = NULL;
>
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> pool_write_unlock(pool);
> cond_resched();
> pool_write_lock(pool);
> - spin_lock(&class->lock);
> + size_class_lock(class);
> }
> }
>
> @@ -2027,7 +2036,7 @@ static unsigned long __zs_compact(struct zs_pool *pool,
> if (dst_zspage)
> putback_zspage(class, dst_zspage);
>
> - spin_unlock(&class->lock);
> + size_class_unlock(class);
> pool_write_unlock(pool);
>
> return pages_freed;
> --
> 2.48.1.262.g85cc9f2d1e-goog
>
next prev parent reply other threads:[~2025-01-29 17:01 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-29 6:43 [PATCHv1 0/6] zsmalloc: preemptible object mapping Sergey Senozhatsky
2025-01-29 6:43 ` [PATCHv1 1/6] zsmalloc: factor out pool locking helpers Sergey Senozhatsky
2025-01-29 16:59 ` Yosry Ahmed
2025-01-30 4:01 ` Sergey Senozhatsky
2025-01-30 16:25 ` Yosry Ahmed
2025-01-31 3:34 ` Sergey Senozhatsky
2025-01-29 6:43 ` [PATCHv1 2/6] zsmalloc: factor out size-class " Sergey Senozhatsky
2025-01-29 17:01 ` Yosry Ahmed [this message]
2025-01-29 6:43 ` [PATCHv1 3/6] zsmalloc: make zspage lock preemptible Sergey Senozhatsky
2025-01-29 11:25 ` Sergey Senozhatsky
2025-01-29 15:22 ` Uros Bizjak
2025-01-30 3:22 ` Sergey Senozhatsky
2025-01-29 6:43 ` [PATCHv1 4/6] zsmalloc: introduce new object mapping API Sergey Senozhatsky
2025-01-29 17:31 ` Yosry Ahmed
2025-01-30 3:21 ` Sergey Senozhatsky
2025-01-30 4:17 ` Sergey Senozhatsky
2025-01-30 16:27 ` Yosry Ahmed
2025-01-29 6:43 ` [PATCHv1 5/6] zram: switch to new zsmalloc " Sergey Senozhatsky
2025-01-29 6:43 ` [PATCHv1 6/6] zram: add might_sleep to zcomp API Sergey Senozhatsky
2025-01-29 15:53 ` [PATCHv1 0/6] zsmalloc: preemptible object mapping Yosry Ahmed
2025-01-30 3:13 ` Sergey Senozhatsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z5pe50-PaWDfkWZU@google.com \
--to=yosry.ahmed@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan@kernel.org \
--cc=nphamcs@gmail.com \
--cc=senozhatsky@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.