From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2425824A3 for ; Sat, 15 Feb 2025 00:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739578700; cv=none; b=Yw6+cR+mANi+lWqJ6qIKUYkFrnMOl31FZJrtlZwKVWtpF57cwOvpXMg+aNLvZfN46Pz0BB0uvT1/1wsAMppzNYYjQMK5LBg2UspnmhRnZr9u3daBHmoY5DWyD63vT1AxIRZJOh8wT8RYa73Fpxinmr5fkHCF5mDROWSn+Ows388= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739578700; c=relaxed/simple; bh=BhEKqoi+6yYJuHFpRtTvJSo9rUBJyjDJ2Bft0nXUTso=; h=Date:To:From:Subject:Message-Id; b=a6krYfvsOovvO1X2FolqyOhPaRbBeI9sdhwkzzuk8PGzPnxzUZ2zvHNyOeymfnaMqHZaAwj7ys2a+zKJFyfeJMYS4QGz80svh7b6mEuLf3qtcVyHFey/tq/F3/AOtci17EhGkM3rfRalAMfnpjPdXVZ4DIMVg+THV4j/dsTraH4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b=nr7Z7vAH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b="nr7Z7vAH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D3CEC4CEE2; Sat, 15 Feb 2025 00:18:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1739578700; bh=BhEKqoi+6yYJuHFpRtTvJSo9rUBJyjDJ2Bft0nXUTso=; h=Date:To:From:Subject:From; b=nr7Z7vAHg+1OGXtuWkEDnFZmC9Smwx42tSie9IBhEgNuNaqjhHZs59eYHzJD7XRdc O1sdZaLWYZgGXGfb64dVwPaiiWI6H2ZuBe2pY82RLme7VwGfeGH4elabNZzsQJaRCa iO57NmBD387T8+hL6Ygcik5LCMdU85SqaNCDIVwY= Date: Fri, 14 Feb 2025 16:18:19 -0800 To: mm-commits@vger.kernel.org,yosry.ahmed@linux.dev,ryncsn@gmail.com,minchan@kernel.org,hdanton@sina.com,bigeasy@linutronix.de,senozhatsky@chromium.org,akpm@linux-foundation.org From: Andrew Morton Subject: + zram-rework-recompression-loop.patch added to mm-unstable branch Message-Id: <20250215001820.2D3CEC4CEE2@smtp.kernel.org> Precedence: bulk X-Mailing-List: mm-commits@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: The patch titled Subject: zram: rework recompression loop has been added to the -mm mm-unstable branch. Its filename is zram-rework-recompression-loop.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/zram-rework-recompression-loop.patch This patch will later appear in the mm-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: Sergey Senozhatsky Subject: zram: rework recompression loop Date: Fri, 14 Feb 2025 13:50:21 +0900 This reworks recompression loop handling: - set a rule that stream-put NULLs the stream pointer If the loop returns with a non-NULL stream then it's a successfull recompression, otherwise the stream should always be NULL. - do not count the number of recompressions Mark object as incompressible as soon as the algorithm with the highest priority failed to compress that object. - count compression errors as resource usage Even if compression has failed, we still need to bump num_recomp_pages counter. Link: https://lkml.kernel.org/r/20250214045208.1388854-10-senozhatsky@chromium.org Signed-off-by: Sergey Senozhatsky Cc: Hillf Danton Cc: Kairui Song Cc: Minchan Kim Cc: Sebastian Andrzej Siewior Cc: Yosry Ahmed Signed-off-by: Andrew Morton --- drivers/block/zram/zram_drv.c | 53 +++++++++++--------------------- 1 file changed, 19 insertions(+), 34 deletions(-) --- a/drivers/block/zram/zram_drv.c~zram-rework-recompression-loop +++ a/drivers/block/zram/zram_drv.c @@ -1929,9 +1929,8 @@ static int recompress_slot(struct zram * unsigned int comp_len_new; unsigned int class_index_old; unsigned int class_index_new; - u32 num_recomps = 0; void *src, *dst; - int ret; + int ret = 0; handle_old = zram_get_handle(zram, index); if (!handle_old) @@ -1974,7 +1973,6 @@ static int recompress_slot(struct zram * if (!zram->comps[prio]) continue; - num_recomps++; zstrm = zcomp_stream_get(zram->comps[prio]); src = kmap_local_page(page); ret = zcomp_compress(zram->comps[prio], zstrm, @@ -1983,7 +1981,8 @@ static int recompress_slot(struct zram * if (ret) { zcomp_stream_put(zstrm); - return ret; + zstrm = NULL; + break; } class_index_new = zs_lookup_class_index(zram->mem_pool, @@ -1993,6 +1992,7 @@ static int recompress_slot(struct zram * if (class_index_new >= class_index_old || (threshold && comp_len_new >= threshold)) { zcomp_stream_put(zstrm); + zstrm = NULL; continue; } @@ -2001,14 +2001,6 @@ static int recompress_slot(struct zram * } /* - * We did not try to recompress, e.g. when we have only one - * secondary algorithm and the page is already recompressed - * using that algorithm - */ - if (!zstrm) - return 0; - - /* * Decrement the limit (if set) on pages we can recompress, even * when current recompression was unsuccessful or did not compress * the page below the threshold, because we still spent resources @@ -2017,38 +2009,31 @@ static int recompress_slot(struct zram * if (*num_recomp_pages) *num_recomp_pages -= 1; - if (class_index_new >= class_index_old) { + /* Compression error */ + if (ret) + return ret; + + if (!zstrm) { /* * Secondary algorithms failed to re-compress the page - * in a way that would save memory, mark the object as - * incompressible so that we will not try to compress - * it again. + * in a way that would save memory. * - * We need to make sure that all secondary algorithms have - * failed, so we test if the number of recompressions matches - * the number of active secondary algorithms. + * Mark the object incompressible if the max-priority + * algorithm couldn't re-compress it. */ - if (num_recomps == zram->num_active_comps - 1) - zram_set_flag(zram, index, ZRAM_INCOMPRESSIBLE); + if (prio < zram->num_active_comps) + return 0; + zram_set_flag(zram, index, ZRAM_INCOMPRESSIBLE); return 0; } - /* Successful recompression but above threshold */ - if (threshold && comp_len_new >= threshold) - return 0; - /* - * No direct reclaim (slow path) for handle allocation and no - * re-compression attempt (unlike in zram_write_bvec()) since - * we already have stored that object in zsmalloc. If we cannot - * alloc memory for recompressed object then we bail out and - * simply keep the old (existing) object in zsmalloc. + * We are holding per-CPU stream mutex and entry lock so better + * avoid direct reclaim. Allocation error is not fatal since + * we still have the old object in the mem_pool. */ handle_new = zs_malloc(zram->mem_pool, comp_len_new, - __GFP_KSWAPD_RECLAIM | - __GFP_NOWARN | - __GFP_HIGHMEM | - __GFP_MOVABLE); + GFP_NOWAIT | __GFP_HIGHMEM | __GFP_MOVABLE); if (IS_ERR_VALUE(handle_new)) { zcomp_stream_put(zstrm); return PTR_ERR((void *)handle_new); _ Patches currently in -mm which might be from senozhatsky@chromium.org are zram-sleepable-entry-locking.patch zram-permit-preemption-with-active-compression-stream.patch zram-remove-unused-crypto-include.patch zram-remove-max_comp_streams-device-attr.patch zram-remove-two-staged-handle-allocation.patch zram-remove-writestall-zram_stats-member.patch zram-limit-max-recompress-prio-to-num_active_comps.patch zram-filter-out-recomp-targets-based-on-priority.patch zram-rework-recompression-loop.patch zsmalloc-rename-pool-lock.patch zsmalloc-make-zspage-lock-preemptible.patch zsmalloc-introduce-new-object-mapping-api.patch zram-switch-to-new-zsmalloc-object-mapping-api.patch zram-permit-reclaim-in-zstd-custom-allocator.patch zram-do-not-leak-page-on-recompress_store-error-path.patch zram-do-not-leak-page-on-writeback_store-error-path.patch zram-add-might_sleep-to-zcomp-api.patch