From patchwork Mon Mar 3 02:03:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13998065 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 68259C282C6 for ; Mon, 3 Mar 2025 02:25:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EB578280012; Sun, 2 Mar 2025 21:25:51 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E3D72280011; Sun, 2 Mar 2025 21:25:51 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CB7D8280012; Sun, 2 Mar 2025 21:25:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id A79A4280011 for ; Sun, 2 Mar 2025 21:25:51 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 6B99E1409D4 for ; Mon, 3 Mar 2025 02:25:51 +0000 (UTC) X-FDA: 83178649302.15.384A72D Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by imf07.hostedemail.com (Postfix) with ESMTP id 7C6DE4000A for ; Mon, 3 Mar 2025 02:25:49 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=gIqNrMao; spf=pass (imf07.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.216.41 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740968749; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=T67dKHYswiGrddgSZiZdCiBHKq1q/ZI+uUwWC6eNCTs=; b=8qiBVp9bXaApguKzk9jqXVoZy3HmrHfig5nAcRn1KNunaea/kduLFZ8tGjmvOI6rILcvf8 EIipPIVQCghGHXGAFDNSGr8+GaOie1iQHcOR8AZMWC2e9Ya5bx/3JwQCdTFQSawL9rqhNP YvgmRVq9HWfyaezwTxXZCcbRxakP1cA= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=gIqNrMao; spf=pass (imf07.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.216.41 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740968749; a=rsa-sha256; cv=none; b=CL9TSnm7vznWU+aKwGvlsBf3eiP8+epLstKFgXaJQSgaFHKJuvXq5r1mdvG0c6RBTgZA6V dDEH23Hv/ddwVWE70U/iY30VVmifA00mGfTJHk10NxiOCbk+T793CkAvT5MMeXsyhE2ob4 YhUftusVX0bestuIAauHaAEQsTJf5UI= Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-2fe96dd93b4so7159851a91.0 for ; Sun, 02 Mar 2025 18:25:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1740968748; x=1741573548; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=T67dKHYswiGrddgSZiZdCiBHKq1q/ZI+uUwWC6eNCTs=; b=gIqNrMaobZUnSkIsqx813SeU6tKI8OeCsc/hVaZ1/34lIJPVZ2AIwCZrScYtQmKHmF 23XMaWxC6gfEM+fbAtIbh8cfWsMMhPnlZVgPcuF1yp0SHIg3TQOQzd//7nsBwos7mKEu VrnnFyWYfPmdkmcQ74eQjj37HxQqIGPWExgdo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740968748; x=1741573548; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T67dKHYswiGrddgSZiZdCiBHKq1q/ZI+uUwWC6eNCTs=; b=SwlvP1IMXC/jVv0oDOzkmkjUQ1zlL3yjuRgcNSZ6G8v2GVLmitoXM33n7umlnfvhRF LHXON/wKcGoD7o2qlqRW/8okVvzPhMsZRfHPvY4/PtQ9BDIQ7B53VUasnvX7H39Y9ygQ 0/VcZZW+ju3/pn5x/wGA2xqCjAYIxKrrXRF+V8B3jdPrsj/NM0wo8xC5ki1/ln5JcJxx NTHHT4xpm/2qPooNyf8pD7eJ+tw+/fQ+DDk4E+86eHfnlpgpsmxts1o6qDhepcE6sZL+ 5ubX4SDtHHVsPspqWUJAveVBAFVORpl0/PDq1DJmuhq0IEVRogNelcrjeQ8sPwvyxIpR gF0w== X-Forwarded-Encrypted: i=1; AJvYcCVP3SLna04Boj3NzAQH0iK7DeKYeoumPqZXfZsFoFxrLZ5bEmV6PcgmQhgK88DQzF0RhhmQjo6/KA==@kvack.org X-Gm-Message-State: AOJu0YzY0Uebmv6o/D1LY+JLY+KgfM3Hypb8NAg8jgVQHyw5V7Clr3hq Npu8lbcmSHO70FSXZ1zm7bU99s3mrnYLJ1uFrt5mlo/isEDYCveGkwlv1U3Ol9Ea8+5e1Gof2nc = X-Gm-Gg: ASbGncvcGtvPFRPP/Tz3PBofzn/Pw+GEZpcMsqW3RjWTowYuW1/1/bZue1PwxCLZ0Mi cKU7VCQ3roOdPxgW+StKWKQJA4aVZ0f1ldFNdnR+k9wiSKjbNQBv1ki6bjr2yrKMinVJ+L9BdOv D0LyQ1F4GM07xGJ4y1wzSOfl82RtnedA21VwjRE8q4SxjZtZJ2bWTaM27D31LGbbdflYK+O5AZp gxDBvkKdRTGTpSEiGSoVx187rmmDkcfj+A/5QejbDrGNK049gKqGFplbdfwh4QzB/OzRradk4Eb 5yrPPa1fxyXH2wLpSd0DmvZZarpFCJJoPxTVi8ce0d/Mw/g= X-Google-Smtp-Source: AGHT+IH55gKbbFLH/4p1SdtWLi5VFnXEFbXHma9n71ec/lgw7BNRJwBiDWwI7fYS8F4jPBgKdgrzew== X-Received: by 2002:a05:6a21:6e03:b0:1f0:e2e6:f41e with SMTP id adf61e73a8af0-1f2f3cee5b8mr17138562637.8.1740968748420; Sun, 02 Mar 2025 18:25:48 -0800 (PST) Received: from localhost ([2401:fa00:8f:203:1513:4f61:a4d3:b418]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7364002f247sm2421551b3a.90.2025.03.02.18.25.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 02 Mar 2025 18:25:48 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Yosry Ahmed , Hillf Danton , Kairui Song , Sebastian Andrzej Siewior , Minchan Kim , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v10 15/19] zram: switch to new zsmalloc object mapping API Date: Mon, 3 Mar 2025 11:03:24 +0900 Message-ID: <20250303022425.285971-16-senozhatsky@chromium.org> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog In-Reply-To: <20250303022425.285971-1-senozhatsky@chromium.org> References: <20250303022425.285971-1-senozhatsky@chromium.org> MIME-Version: 1.0 X-Stat-Signature: i9jtjaddbac4i53a34sf1dmsapjsdx98 X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 7C6DE4000A X-Rspam-User: X-HE-Tag: 1740968749-21691 X-HE-Meta: U2FsdGVkX192jgeHapRJo5QWWxEyG7KUY42UN9WAztk3apeyB9KytcYQNByCX+/JgYf3xe4JBMdliAm7DaxO3P+bR6sv3+YWnHpnUm08nSuRtYVbVdjxmjP/6FTuPqD1slSaITaXef6OqvIH49SPeN8YnLQtGqeCrywLXfKPpU5qTzWEHEC4KoP8A6Ldp9omALcE3mdMMzUKxwcRd5/HQ0SoKJXYm67Tj3HxAMmQ9LxMEFzZArnAMF3hbZG3nJ2Z2yRyFEb5VPwWVapb2BNJkCPlNy84RPv2TSOpa2B3CDyYdK7ds8mLltYMbx46rDFL6CE5q4EBEFgvYZjm8d3J2xwgv/ZT8/2h1CjVwEPdrwqkyij8E2hIAlURLL+GW9RZOfX6n0ambh6iOnqPb4DjQA0GCJndSCoSOe8/97dZRfxUULXRSlIf7B8+NLRkACUjcVmabFtWe/pjsxU02KVdYwYjSIo8UNTTqt84UnAW2CHJW78tg/ThZgEMJMMGYTtfW5aNuF6p1f2iSulm/+R3v4XvH+5sciWG/A35iL09ENAtLZU+iiSvuCts8bLIX8n+yYkM64ALKm1iq8gIEMLZJMajojylkee7xkx5n6DM2f2Ef382rP1DzcZW4v5Lu2TQtdLshoPqo5YQK4Wke2ZqkoI4zzdgoEq3vZ95jECQ8SV1BzS5aXujQ5jrHoryHXPS39EvAB8J0Kn7Fj1vXehIpaFqf8TUtm8N2LpHxCr9u84nKx+g9iLaizy8GGJk4KkQJ5kYaRLiVQeFNgO7jGRU0NusDaM/BSOaJQ9myuRAAsLptZYZnM1SDPX8JHoINsPNvKpJb2i7Bh1cMJdZO0Hmxe94/l1gKX+gj4f6fNWbHuZTgr7HeUV5ERifI1vE9842xk4/vZB0uoqI7o4jOCgA21CkevbuBdft7KSv4CkQ7cXfXT63jnAxKy2GyOtL/Bvk9lpTW7/NrQoE2kImMu6 rUMLL0Wp whITiFJev4EPUmsdF1AvVoIWdYiCeXrzZCfPx8IeMzE7yiBzJJdSoPhikgrD5KdiULR+NRjWGZJBZAdfkGZwEol9N0GN9W1hCYjbnKH0SWmR62EmHFCSWpfHfpQRt9+wzSAjcyb4w/J3s4l6+FF1dLsKVQXn8KlCrh5OQoyW9z5uULUZ7Xdb41fQ0e++4+B7ItaLfQw9mnvcTkSA8Vj6IprDyoISPGGr70UAGtqAFxV9jsWugwn3flBf6ox3t+Rt8WehgYNDkBCHg1vFA+XydVftNPU9RZMUbcXbwcYIabh4n0ya6kT26hjTV7qxRjQJHfi+R X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Use new read/write zsmalloc object API. For cases when RO mapped object spans two physical pages (requires temp buffer) compression streams now carry around one extra physical page. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zcomp.c | 4 +++- drivers/block/zram/zcomp.h | 2 ++ drivers/block/zram/zram_drv.c | 28 ++++++++++------------------ 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index cfdde2e0748a..a1d627054bb1 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -45,6 +45,7 @@ static const struct zcomp_ops *backends[] = { static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) { comp->ops->destroy_ctx(&zstrm->ctx); + vfree(zstrm->local_copy); vfree(zstrm->buffer); zstrm->buffer = NULL; } @@ -57,12 +58,13 @@ static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) if (ret) return ret; + zstrm->local_copy = vzalloc(PAGE_SIZE); /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer = vzalloc(2 * PAGE_SIZE); - if (!zstrm->buffer) { + if (!zstrm->buffer || !zstrm->local_copy) { zcomp_strm_free(comp, zstrm); return -ENOMEM; } diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 23b8236b9090..25339ed1e07e 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -34,6 +34,8 @@ struct zcomp_strm { struct mutex lock; /* compression buffer */ void *buffer; + /* local copy of handle memory */ + void *local_copy; struct zcomp_ctx ctx; }; diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index f6e887f94b71..62aef12417a4 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1561,11 +1561,11 @@ static int read_incompressible_page(struct zram *zram, struct page *page, void *src, *dst; handle = zram_get_handle(zram, index); - src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); + src = zs_obj_read_begin(zram->mem_pool, handle, NULL); dst = kmap_local_page(page); copy_page(dst, src); kunmap_local(dst); - zs_unmap_object(zram->mem_pool, handle); + zs_obj_read_end(zram->mem_pool, handle, src); return 0; } @@ -1583,11 +1583,11 @@ static int read_compressed_page(struct zram *zram, struct page *page, u32 index) prio = zram_get_priority(zram, index); zstrm = zcomp_stream_get(zram->comps[prio]); - src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); + src = zs_obj_read_begin(zram->mem_pool, handle, zstrm->local_copy); dst = kmap_local_page(page); ret = zcomp_decompress(zram->comps[prio], zstrm, src, size, dst); kunmap_local(dst); - zs_unmap_object(zram->mem_pool, handle); + zs_obj_read_end(zram->mem_pool, handle, src); zcomp_stream_put(zstrm); return ret; @@ -1683,7 +1683,7 @@ static int write_incompressible_page(struct zram *zram, struct page *page, u32 index) { unsigned long handle; - void *src, *dst; + void *src; /* * This function is called from preemptible context so we don't need @@ -1701,11 +1701,9 @@ static int write_incompressible_page(struct zram *zram, struct page *page, return -ENOMEM; } - dst = zs_map_object(zram->mem_pool, handle, ZS_MM_WO); src = kmap_local_page(page); - memcpy(dst, src, PAGE_SIZE); + zs_obj_write(zram->mem_pool, handle, src, PAGE_SIZE); kunmap_local(src); - zs_unmap_object(zram->mem_pool, handle); zram_slot_lock(zram, index); zram_set_flag(zram, index, ZRAM_HUGE); @@ -1726,7 +1724,7 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) int ret = 0; unsigned long handle; unsigned int comp_len; - void *dst, *mem; + void *mem; struct zcomp_strm *zstrm; unsigned long element; bool same_filled; @@ -1773,11 +1771,8 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) return -ENOMEM; } - dst = zs_map_object(zram->mem_pool, handle, ZS_MM_WO); - - memcpy(dst, zstrm->buffer, comp_len); + zs_obj_write(zram->mem_pool, handle, zstrm->buffer, comp_len); zcomp_stream_put(zstrm); - zs_unmap_object(zram->mem_pool, handle); zram_slot_lock(zram, index); zram_set_handle(zram, index, handle); @@ -1882,7 +1877,7 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page, unsigned int comp_len_new; unsigned int class_index_old; unsigned int class_index_new; - void *src, *dst; + void *src; int ret = 0; handle_old = zram_get_handle(zram, index); @@ -1993,12 +1988,9 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page, return PTR_ERR((void *)handle_new); } - dst = zs_map_object(zram->mem_pool, handle_new, ZS_MM_WO); - memcpy(dst, zstrm->buffer, comp_len_new); + zs_obj_write(zram->mem_pool, handle_new, zstrm->buffer, comp_len_new); zcomp_stream_put(zstrm); - zs_unmap_object(zram->mem_pool, handle_new); - zram_free_page(zram, index); zram_set_handle(zram, index, handle_new); zram_set_obj_size(zram, index, comp_len_new);