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 011D71598EE for ; Mon, 11 Nov 2024 08:28:09 +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=1731313690; cv=none; b=jLX9W7TzlDro/O6rlsEMhMSGlVccA86zj0Vq9/S1AdWrG6XRHywXkSpLOdwHO+/MXXEiZjoq01DjoaFBCUfBJkQP06nODLoJjBOG2IXiZmasc1bY4UADcRMN1rIu1Qos1XYbezfcWmYs2A76vuBNeE4ZfpXvSJvIpqZ8R1gD1Y8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731313690; c=relaxed/simple; bh=1SROUV1D1JYx6oZLsamlqcvhYDgQl044FXTRTj8h/A4=; h=Date:To:From:Subject:Message-Id; b=clyczg8oSLVGdOiZp0Qz2VLsnGHrA+Fw7unkgSmvU6DORbaUVEBKayIdlf8SEQfMDmQ+7GyiTb3PcOoBHE39bdjLrMz+/zSXLN1hg9X19iEZonewAEmOYwNUENHJcDwplNBtL7bpXd0lUtNHZd+tqJRh1uJdKqflarOUfQP5hXw= 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=F3HCC7kO; 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="F3HCC7kO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 65687C4CED0; Mon, 11 Nov 2024 08:28:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1731313689; bh=1SROUV1D1JYx6oZLsamlqcvhYDgQl044FXTRTj8h/A4=; h=Date:To:From:Subject:From; b=F3HCC7kOs+4oAXMAyrv/txgkSbAT2QHzaLtwWKn8BRbDJbwxhopgdSuPNWdwneg0p etZElx6VK/UDbvBf2QffD/6B9iMunn7rXGcgo+IK0r4gPghnZDecxZ1aAoThdEDdXs b4iqxK/Zm1kCRSkYlu/whe3q82luu9jX+siS0H6I= Date: Mon, 11 Nov 2024 00:28:08 -0800 To: mm-commits@vger.kernel.org,yosryahmed@google.com,ying.huang@intel.com,wajdi.k.feghali@intel.com,ryan.roberts@arm.com,nphamcs@gmail.com,hannes@cmpxchg.org,chengming.zhou@linux.dev,kanchana.p.sridhar@intel.com,akpm@linux-foundation.org From: Andrew Morton Subject: [merged mm-stable] mm-zswap-zswap_store_page-will-initialize-entry-after-adding-to-xarray.patch removed from -mm tree Message-Id: <20241111082809.65687C4CED0@smtp.kernel.org> Precedence: bulk X-Mailing-List: mm-commits@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: The quilt patch titled Subject: mm: zswap: zswap_store_page() will initialize entry after adding to xarray. has been removed from the -mm tree. Its filename was mm-zswap-zswap_store_page-will-initialize-entry-after-adding-to-xarray.patch This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm ------------------------------------------------------ From: Kanchana P Sridhar Subject: mm: zswap: zswap_store_page() will initialize entry after adding to xarray. Date: Wed, 2 Oct 2024 10:33:29 -0700 This incorporates Yosry's suggestions in [1] for further simplifying zswap_store_page(). If the page is successfully compressed and added to the xarray, we get the pool/objcg refs, and initialize all the entry's members. Only after this, we add it to the zswap LRU. In the time between the entry's addition to the xarray and it's member initialization, we are protected against concurrent stores/loads/swapoff through the folio lock, and are protected against writeback because the entry is not on the LRU yet. This way, we don't have to drop the pool/objcg refs, now that the entry initialization is centralized to the successful page store code path. zswap_compress() is modified to take a zswap_pool parameter in keeping with this simplification (as against obtaining this from entry->pool). [1]: https://lore.kernel.org/all/CAJD7tkZh6ufHQef5HjXf_F5b5LC1EATexgseD=4WvrO+a6Ni6w@mail.gmail.com/ Link: https://lkml.kernel.org/r/20241002173329.213722-1-kanchana.p.sridhar@intel.com Signed-off-by: Kanchana P Sridhar Cc: Chengming Zhou Cc: Huang Ying Cc: Johannes Weiner Cc: Nhat Pham Cc: Ryan Roberts Cc: Wajdi Feghali Cc: Yosry Ahmed Signed-off-by: Andrew Morton --- mm/zswap.c | 56 +++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) --- a/mm/zswap.c~mm-zswap-zswap_store_page-will-initialize-entry-after-adding-to-xarray +++ a/mm/zswap.c @@ -881,7 +881,8 @@ static int zswap_cpu_comp_dead(unsigned return 0; } -static bool zswap_compress(struct page *page, struct zswap_entry *entry) +static bool zswap_compress(struct page *page, struct zswap_entry *entry, + struct zswap_pool *pool) { struct crypto_acomp_ctx *acomp_ctx; struct scatterlist input, output; @@ -893,7 +894,7 @@ static bool zswap_compress(struct page * gfp_t gfp; u8 *dst; - acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx); + acomp_ctx = raw_cpu_ptr(pool->acomp_ctx); mutex_lock(&acomp_ctx->mutex); @@ -926,7 +927,7 @@ static bool zswap_compress(struct page * if (comp_ret) goto unlock; - zpool = entry->pool->zpool; + zpool = pool->zpool; gfp = __GFP_NORETRY | __GFP_NOWARN | __GFP_KSWAPD_RECLAIM; if (zpool_malloc_support_movable(zpool)) gfp |= __GFP_HIGHMEM | __GFP_MOVABLE; @@ -1414,32 +1415,21 @@ static ssize_t zswap_store_page(struct p struct obj_cgroup *objcg, struct zswap_pool *pool) { + swp_entry_t page_swpentry = page_swap_entry(page); struct zswap_entry *entry, *old; /* allocate entry */ entry = zswap_entry_cache_alloc(GFP_KERNEL, page_to_nid(page)); if (!entry) { zswap_reject_kmemcache_fail++; - goto reject; + return -EINVAL; } - /* zswap_store() already holds a ref on 'objcg' and 'pool' */ - if (objcg) - obj_cgroup_get(objcg); - zswap_pool_get(pool); - - /* if entry is successfully added, it keeps the reference */ - entry->pool = pool; + if (!zswap_compress(page, entry, pool)) + goto compress_failed; - if (!zswap_compress(page, entry)) - goto put_pool_objcg; - - entry->swpentry = page_swap_entry(page); - entry->objcg = objcg; - entry->referenced = true; - - old = xa_store(swap_zswap_tree(entry->swpentry), - swp_offset(entry->swpentry), + old = xa_store(swap_zswap_tree(page_swpentry), + swp_offset(page_swpentry), entry, GFP_KERNEL); if (xa_is_err(old)) { int err = xa_err(old); @@ -1458,6 +1448,16 @@ static ssize_t zswap_store_page(struct p zswap_entry_free(old); /* + * The entry is successfully compressed and stored in the tree, there is + * no further possibility of failure. Grab refs to the pool and objcg. + * These refs will be dropped by zswap_entry_free() when the entry is + * removed from the tree. + */ + zswap_pool_get(pool); + if (objcg) + obj_cgroup_get(objcg); + + /* * We finish initializing the entry while it's already in xarray. * This is safe because: * @@ -1467,25 +1467,21 @@ static ssize_t zswap_store_page(struct p * The publishing order matters to prevent writeback from seeing * an incoherent entry. */ + entry->pool = pool; + entry->swpentry = page_swpentry; + entry->objcg = objcg; + entry->referenced = true; if (entry->length) { INIT_LIST_HEAD(&entry->lru); zswap_lru_add(&zswap_list_lru, entry); } - /* - * We shouldn't have any possibility of failure after the entry is - * added in the xarray. The pool/objcg refs obtained here will only - * be dropped if/when zswap_entry_free() gets called. - */ return entry->length; store_failed: - zpool_free(entry->pool->zpool, entry->handle); -put_pool_objcg: - zswap_pool_put(pool); - obj_cgroup_put(objcg); + zpool_free(pool->zpool, entry->handle); +compress_failed: zswap_entry_cache_free(entry); -reject: return -EINVAL; } _ Patches currently in -mm which might be from kanchana.p.sridhar@intel.com are