From mboxrd@z Thu Jan 1 00:00:00 1970 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 2E289C47DD9 for ; Wed, 28 Feb 2024 15:18:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BE12C6B00A2; Wed, 28 Feb 2024 10:18:51 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id B92806B00A3; Wed, 28 Feb 2024 10:18:51 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A5A3E6B00A4; Wed, 28 Feb 2024 10:18:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 947296B00A2 for ; Wed, 28 Feb 2024 10:18:51 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 251E240CD5 for ; Wed, 28 Feb 2024 15:18:51 +0000 (UTC) X-FDA: 81841570062.13.CBB768F Received: from out-181.mta0.migadu.com (out-181.mta0.migadu.com [91.218.175.181]) by imf16.hostedemail.com (Postfix) with ESMTP id 39DFB180023 for ; Wed, 28 Feb 2024 15:18:48 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=H9isTi+Z; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf16.hostedemail.com: domain of chengming.zhou@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=chengming.zhou@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1709133529; a=rsa-sha256; cv=none; b=Sp/Nz7Hl71j/QIjoiVAU6YzE4brOROj6ZDySvO96F2g9Pxx5yXS+ocgH23LAs/ee1aQ8dt xBsSlFw30Lgo+R+KP15iubbFjzEb8x9CkJqmO6Xgut2JBRZNvd+73lXgYRPkXYycUqlG40 5ERMiUDg5YMtqBXusjP8vjxChQVnCzI= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=H9isTi+Z; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf16.hostedemail.com: domain of chengming.zhou@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=chengming.zhou@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1709133529; 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=dQ/GDqUz6wZpxgKFsr9ka4SjiFzrDvg9/BbQeXQM+7g=; b=6G6L5ZKSsUFw3Z5rxrglMqOxrxdreHdRQcH/ukJH0QXBQAvy7Lp6yrEe/IDkxxHs/JqmGn ocGfvXfbzJX/7X1ING7CVfGGCjFz/Jq2zELxIy1amT0iTZbGLxmlmwIN7Mckjm8qQjBH17 mBssyKOuUHPXbJG/JAu0fTl2RJr8s7Q= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1709133526; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dQ/GDqUz6wZpxgKFsr9ka4SjiFzrDvg9/BbQeXQM+7g=; b=H9isTi+ZhtCmS+Oppv/gIrbAUAkhjlICKB+k/lnApdMQ3QJJpeqyg2taL+x2pYwXu2nrAu 8GaheRZYXPFBCrw3hgG2vfHe4PO/QhyZgg6cUtRLuLObphL7HPw75W0F7HGgL4giMnMfMq yAoP2fDyrijAgjA0MJuybdimHhVNphI= From: Chengming Zhou To: akpm@linux-foundation.org Cc: hannes@cmpxchg.org, yosryahmed@google.com, nphamcs@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Chengming Zhou Subject: [PATCH mm-unstable hotfix] mm/zswap: fix zswap_pools_lock usages after changing to percpu_ref Date: Wed, 28 Feb 2024 15:18:32 +0000 Message-Id: <20240228151832.2431993-1-chengming.zhou@linux.dev> In-Reply-To: <20240210-zswap-global-lru-v3-2-200495333595@bytedance.com> References: <20240210-zswap-global-lru-v3-2-200495333595@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 39DFB180023 X-Stat-Signature: eprydtzkeg4ndhb91uruopyt8zhqqmum X-HE-Tag: 1709133528-193225 X-HE-Meta: U2FsdGVkX1+p6z1o/4/qwd+gxF1ljFqNeJa67yVvDe2jcCtXunLMEOsW4OKJjtaNtT2GgckzK962jgMDMOfN7bSGkWoP+OSxp0auHqVg46IlTx1U/cw3ImxGcVkJsCl4f9B4ygTYk7wF6vWggnEF0w7q/c/OJcw9brqkBe3nXpbhmKVHykpoVqxOWAw1ZB+JEKu/oUg7DwTwR8dZAvH8dvB9tJpt68YbBmZv0KM+spLCdoirxX5NSunNw9PeYegXOGENfkGDM85+WNSMgzF9VQFHPT0mAwH9/MfUvpuzy67e2g+eiu+2RKIX9FXDlwhIA/jWP2ytfOnsJia6OxLs+aoO7VCW2MZKEdsSMKPL9MgH1E512Fxf8IVkDgHlBrtHPbf1gOJQ+w4nsA1AbV6lMLr+z9l5ae0O8VPfMfJyCEVltLwOmpN5v5qYFmPivdU8g/bSpRr5KXVZK8N7aGxfOBkuXii/PFIwA4GoE04a2GnN5pzfzLZ+GSMZQ8S2YxAnqohT9xZN63y5DsjPc30SqcuB9K2nFRms61g9Sb6rYSDETkq4WMw7xCKUvYkvmDdB6pLi+lCaDZBgkuov8RrMRqP7mSimn6l9d753NXmy1Dip4cbedHxcnbM5lAwde8xjOCSsCIV+yBBcjMtN/0/FuRZJXWf5OafSA4FnzsQDx0r1xmlMdSCj4lvjccCOc90smM0gkDJwHhbi7seKsMAzmSpXK1NEz6WT4i/egoDPQyUqwHRdF0355NWuMuhhxwW11YWQkzcQp28UnPK/S3fhMTYVhCiqC/7qpxuioFKBYrHzvbukxaOo4wJQmwvLMqoJHGoiciWhUOvrIbekiiJRsC0axhSbIiWHTbsYTj2VNZaLNmX3soCSvkedXZBFgxUF 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: Now the release of zswap pool is controlled by percpu_ref, its release callback (__zswap_pool_empty()) will be called when percpu_ref hit 0. But this release callback may potentially be called from RCU callback context by percpu_ref_kill(), which maybe in the interrupt context. So we need to use spin_lock_irqsave() and spin_unlock_irqrestore() in the release callback: __zswap_pool_empty(). In other task context places, spin_lock_irq() and spin_unlock_irq() are enough to avoid potential deadlock. This problem is introduced by the commit f3da427e82c4 ("mm/zswap: change zswap_pool kref to percpu_ref"), which is in mm-unstable branch now. It can be reproduced by testing kernel build in tmpfs with zswap and CONFIG_LOCKDEP enabled, meanwhile changing the zswap compressor setting dynamically. Signed-off-by: Chengming Zhou --- mm/zswap.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mm/zswap.c b/mm/zswap.c index 011e068eb355..894bd184f78e 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -456,10 +456,11 @@ static struct zswap_pool *zswap_pool_current(void); static void __zswap_pool_empty(struct percpu_ref *ref) { struct zswap_pool *pool; + unsigned long flags; pool = container_of(ref, typeof(*pool), ref); - spin_lock(&zswap_pools_lock); + spin_lock_irqsave(&zswap_pools_lock, flags); WARN_ON(pool == zswap_pool_current()); @@ -468,7 +469,7 @@ static void __zswap_pool_empty(struct percpu_ref *ref) INIT_WORK(&pool->release_work, __zswap_pool_release); schedule_work(&pool->release_work); - spin_unlock(&zswap_pools_lock); + spin_unlock_irqrestore(&zswap_pools_lock, flags); } static int __must_check zswap_pool_get(struct zswap_pool *pool) @@ -598,7 +599,7 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, return -EINVAL; } - spin_lock(&zswap_pools_lock); + spin_lock_irq(&zswap_pools_lock); pool = zswap_pool_find_get(type, compressor); if (pool) { @@ -607,7 +608,7 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, list_del_rcu(&pool->list); } - spin_unlock(&zswap_pools_lock); + spin_unlock_irq(&zswap_pools_lock); if (!pool) pool = zswap_pool_create(type, compressor); @@ -628,7 +629,7 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, else ret = -EINVAL; - spin_lock(&zswap_pools_lock); + spin_lock_irq(&zswap_pools_lock); if (!ret) { put_pool = zswap_pool_current(); @@ -643,7 +644,7 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, put_pool = pool; } - spin_unlock(&zswap_pools_lock); + spin_unlock_irq(&zswap_pools_lock); if (!zswap_has_pool && !pool) { /* if initial pool creation failed, and this pool creation also -- 2.40.1