From patchwork Mon Oct 31 05:41:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13025390 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 A5842FA3745 for ; Mon, 31 Oct 2022 05:41:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 048016B0073; Mon, 31 Oct 2022 01:41:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F3B0F8E0001; Mon, 31 Oct 2022 01:41:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E02C16B0075; Mon, 31 Oct 2022 01:41:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id B58E06B0073 for ; Mon, 31 Oct 2022 01:41:21 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 44C73160499 for ; Mon, 31 Oct 2022 05:41:21 +0000 (UTC) X-FDA: 80080146762.23.C15D762 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by imf23.hostedemail.com (Postfix) with ESMTP id D2CE6140008 for ; Mon, 31 Oct 2022 05:41:20 +0000 (UTC) Received: by mail-pf1-f175.google.com with SMTP id 17so5533988pfv.4 for ; Sun, 30 Oct 2022 22:41:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; 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=9v+j7YIhXu2E5hbe6+G2o2cWhQoPLQTweQOnVfkUv2E=; b=HHA2qvPEXFBXVL0y35D/gKbkMA3J8JE7u+qse7jccRNYRVFeZl1ZI8qGbNMOVHXSHf v40uZihi/8P1v4QSHUvJCAjLlzOeQ9qeN0ngXzT5Xo41WcZ2vMNTKZiUV4bOmY+SSXQ3 Byk0Lm156jYYKOSKcsI020PV+WW+rdYOEU3jQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=9v+j7YIhXu2E5hbe6+G2o2cWhQoPLQTweQOnVfkUv2E=; b=Hd5bQ4+ya0RPostL9OEpGeTbAKpNDel+xMHd8x0mNKFtehGxF38wlhhNHnETisjDE0 lzgU8gkCa1su1D5bEDSsVHxIjPLjF+uFyI9uFXV+RpjqGvWjwsxALpXZz7XgRYWbobuJ o5766iPrenFdPjXvYbRAzqYUAmoFsBRr+57+DPkVc91MrDQNrV0zB9T8OSDOvMpgWgLD cGvL7ZBinUbXRYpsLZF7mlEV+cfnDQjR8gdKN/SEGikZJo1kKwkh7p//2yOppMhth5AJ 9VVMc92RLEHszuUQmnf0zJjGAYZ3qGA4Hyk8jnrHN8no5UUEKPos7dVDrViQlgnclRoj QUxg== X-Gm-Message-State: ACrzQf024GJ8aDeECB/CVJbJcqDp0V5wNdJUHB52ayu35ynq6IkcufRR WiyaQG3qFAyZvMUi+iIXd3JFXA== X-Google-Smtp-Source: AMsMyM729ihr9fgmUqPg4KMVep0S/XyIpWy1ij2ONm3nVQwOjuSAsnZN6ZOCyx8QyEgYr7CDgaOUiA== X-Received: by 2002:a62:e40e:0:b0:56b:add7:fc22 with SMTP id r14-20020a62e40e000000b0056badd7fc22mr12547815pfh.63.1667194879706; Sun, 30 Oct 2022 22:41:19 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:7616:afe0:ba6c:96f4]) by smtp.gmail.com with ESMTPSA id w12-20020aa79a0c000000b0056befcd7958sm3573308pfj.84.2022.10.30.22.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Oct 2022 22:41:19 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Alexey Romanov , Sergey Senozhatsky Subject: [PATCHv4 1/9] zram: add size class equals check into recompression Date: Mon, 31 Oct 2022 14:41:00 +0900 Message-Id: <20221031054108.541190-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.1.273.g43a17bfeac-goog In-Reply-To: <20221031054108.541190-1-senozhatsky@chromium.org> References: <20221031054108.541190-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1667194880; 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=9v+j7YIhXu2E5hbe6+G2o2cWhQoPLQTweQOnVfkUv2E=; b=mYIq84Z740Wz2dx/pb571GdjuzdLePrlTAVYJifkIMz+5HMzzY+8Sc/OOWY6CF6TajXXFd 7ZP6Nx6DICCvqbxe2Htr5d7xKuZw3E8//WPzvkgmioGVed3nMHOFzlK/Z9uWOwVn+4fxBy MsqX+lKXLPyJF2p61IbK5al+wWmzsSE= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=HHA2qvPE; spf=pass (imf23.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.175 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=1667194880; a=rsa-sha256; cv=none; b=P3YDmSuDXPs676HNhqZU38r+ZcHYqw8fqxTjwrpnUrThFQyImVqN1tHMZ+R88QbTrHt04S LOzBw6olE0uZqmLwprz9bfJ8BMZex6PfpVsJQnb29lmYk15DA1fpibMV8VdOGnXkg9fPxz heh3zqOUb5/nsGU64MYP2UsThjr6X2o= X-Stat-Signature: yoxdadhok1p5csjoru1gzdducqfinhfi X-Rspamd-Queue-Id: D2CE6140008 X-Rspam-User: Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=HHA2qvPE; spf=pass (imf23.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.175 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org X-Rspamd-Server: rspam04 X-HE-Tag: 1667194880-244460 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: From: Alexey Romanov It makes no sense for us to recompress the object if it will be in the same size class. We anyway don't get any memory gain. But, at the same time, we get a CPU time overhead when inserting this object into zspage and decompressing it afterwards. Signed-off-by: Alexey Romanov Reviewed-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 5 +++++ include/linux/zsmalloc.h | 2 ++ mm/zsmalloc.c | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 364323713393..fd31beb6491a 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1632,6 +1632,8 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page, unsigned long handle_next; unsigned int comp_len_next; unsigned int comp_len_prev; + unsigned int class_index_prev; + unsigned int class_index_next; struct zcomp_strm *zstrm; void *src, *dst; int ret; @@ -1656,6 +1658,8 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page, ret = zcomp_compress(zstrm, src, &comp_len_next); kunmap_atomic(src); + class_index_prev = zs_lookup_class_index(zram->mem_pool, comp_len_prev); + class_index_next = zs_lookup_class_index(zram->mem_pool, comp_len_next); /* * Either a compression error or we failed to compressed the object * in a way that will save us memory. Mark the object so that we @@ -1663,6 +1667,7 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page, */ if (comp_len_next >= huge_class_size || comp_len_next >= comp_len_prev || + class_index_next >= class_index_prev || ret) { zram_set_flag(zram, index, ZRAM_RECOMP_SKIP); zram_clear_flag(zram, index, ZRAM_IDLE); diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h index 2a430e713ce5..a48cd0ffe57d 100644 --- a/include/linux/zsmalloc.h +++ b/include/linux/zsmalloc.h @@ -55,5 +55,7 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle); unsigned long zs_get_total_pages(struct zs_pool *pool); unsigned long zs_compact(struct zs_pool *pool); +unsigned int zs_lookup_class_index(struct zs_pool *pool, unsigned int size); + void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats); #endif diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index d03941cace2c..065744b7e9d8 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -1205,6 +1205,27 @@ static bool zspage_full(struct size_class *class, struct zspage *zspage) return get_zspage_inuse(zspage) == class->objs_per_zspage; } +/** + * zs_lookup_class_index() - Returns index of the zsmalloc &size_class + * that hold objects of the provided size. + * @pool: zsmalloc pool to use + * @size: object size + * + * Context: Any context. + * + * Return: the index of the zsmalloc &size_class that hold objects of the + * provided size. + */ +unsigned int zs_lookup_class_index(struct zs_pool *pool, unsigned int size) +{ + struct size_class *class; + + class = pool->size_class[get_size_class_index(size)]; + + return class->index; +} +EXPORT_SYMBOL_GPL(zs_lookup_class_index); + unsigned long zs_get_total_pages(struct zs_pool *pool) { return atomic_long_read(&pool->pages_allocated);