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 1F947C3ABD9 for ; Wed, 14 May 2025 09:24:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6188F6B0118; Wed, 14 May 2025 05:24:20 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5A02B6B0119; Wed, 14 May 2025 05:24:20 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 441D56B011A; Wed, 14 May 2025 05:24:20 -0400 (EDT) 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 210206B0118 for ; Wed, 14 May 2025 05:24:20 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id BDDB2120B2B for ; Wed, 14 May 2025 09:24:20 +0000 (UTC) X-FDA: 83440977480.24.BE7D9A6 Received: from out30-124.freemail.mail.aliyun.com (out30-124.freemail.mail.aliyun.com [115.124.30.124]) by imf19.hostedemail.com (Postfix) with ESMTP id AF4221A000D for ; Wed, 14 May 2025 09:24:17 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=linux.alibaba.com header.s=default header.b=ghzEAr2E; spf=pass (imf19.hostedemail.com: domain of baolin.wang@linux.alibaba.com designates 115.124.30.124 as permitted sender) smtp.mailfrom=baolin.wang@linux.alibaba.com; dmarc=pass (policy=none) header.from=linux.alibaba.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747214659; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yjMo+3hO/FV1JWL2k0Av/+NkF5itKNAXmcU15iNakR4=; b=mtAQ3KaPhlunaH7CicgsoLIrfgq9M1pZZ/VWfHAyr2QAOu0qdbrEQrvAAI/p8+EPNxqjGs Reoydbl+k+Swgv2OEWn3BLzykslufwZ1Tk/M6lEAyCHvSZwW6NBOSiqPLgLyAm7FNGyQh4 d3eTPF1b4LCVR6189XUPLMnJTpVw2lc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747214659; a=rsa-sha256; cv=none; b=zdGf8XIDKwwrvt/KQJWBzfmy+Sv2DksnXTVQsB70O519as52CZqy+PqK1X7M3muVAezmGR ilNJTqUYmg+OhqqbTrQFYNwqfnhLZ94mRYk8yqQMqBxrtS6Bs4qLyASVGvILlb2j2Bk4Ag FHINAZJpkjiY+IYehSSaQyWiBTP4VLg= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=linux.alibaba.com header.s=default header.b=ghzEAr2E; spf=pass (imf19.hostedemail.com: domain of baolin.wang@linux.alibaba.com designates 115.124.30.124 as permitted sender) smtp.mailfrom=baolin.wang@linux.alibaba.com; dmarc=pass (policy=none) header.from=linux.alibaba.com DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1747214654; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; bh=yjMo+3hO/FV1JWL2k0Av/+NkF5itKNAXmcU15iNakR4=; b=ghzEAr2E5aWaRcxtjrMaWnmXXQCjcbXQUpAbdyhc58ZZbQqhTACyizm8HJzolKU0s3wjnoNwT4FAoKFKLZIUrowgJgokGy4DUbgkKcKFYN0TtArSKsujl4mPtp915/Qijf4yTm8q7JhBrNr3135ch4zKxd4f7JV0Qd5nRBoqNJA= Received: from 30.74.144.106(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0WalMTtq_1747214652 cluster:ay36) by smtp.aliyun-inc.com; Wed, 14 May 2025 17:24:13 +0800 Message-ID: Date: Wed, 14 May 2025 17:24:12 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 3/5] mm/shmem: Fix potential dead loop in shmem_unuse() To: Kemeng Shi , hughd@google.com, akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20250514165047.946884-1-shikemeng@huaweicloud.com> <20250514165047.946884-4-shikemeng@huaweicloud.com> From: Baolin Wang In-Reply-To: <20250514165047.946884-4-shikemeng@huaweicloud.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: AF4221A000D X-Stat-Signature: 1hqaomr6oqf1nkffxct7gwxexpwytuhu X-Rspam-User: X-HE-Tag: 1747214657-420327 X-HE-Meta: U2FsdGVkX1/dUFNEqTF3MAOXSIGGM5WGMB7wYw9t9hRgm/8lR7kcGyX47aICVQ+3oEdhneNIZwz8Lneh8Q0DPQh1kSPik0CSim/K3dDXJgfe4DiPdMMbGr54cKci05YuD7EBVtJGtEUvaX5mimR2Ek6z9fJjN/ifsxRwC+1GO6UGbfCWJZikAoXhOSkrmIy1sGgYOmHItmV948i1UbHdbdiPGnocEPZMqgN9nDDFdfij21Xvla0gPha7nytpKLgpEzUdfQnK4qU2vR/wnWrKAveotERQwYLSnOy+bPRSoXt3K+PskGfC6Wv5DA0HdjMzLnHEFLuj9wZt1aGgZrKJ/3X1ZYq2wiVHkoLGDe9J+1Kgtip0P6Y7IIX2IDFIzIzn2i/ZMURuYh4zmTLMnZ1/ICwvKFkCG/X4BQFtztF6eopNfMqxtVTu5YObIp9YaFD85HxD1rSNzxSDcdkSOZvcgA6VTkcbgvx+6C+m3+9o+RYxsitDkXvQ3CQ2jRIrP9t1QY7Yu9P2dsEDeppDgI4IRxixKqzAYmykPxdasOU/1b5nQbxc0t8QlSsRcKdwUgZDzWHOS+k/jIS/ZVgRmy/Mm1aHqHJyeATM3NfShDP/L2T1JfDgoB1Qf32Stfi1JhVDc4qoSw0mRARHMlqgeZjdcMmyfp6C27tn3rFkxurx9lgejgEyp9UB4tEK7tPv4vGNPicODn42SWfXkQexsUS2HcNbsM5946nOmBEscgd1IiFqZh/gUjF1b9OtSMOpBGaQ21c5mcOIwYpoVCuOG0mrrDgps3+JbZ55Rx0H8e1zhqCh0qF+JK3/OhR34hj/EuQHVfIp4ob9aCs2koiP+zeyKmr9uCl63QngcJyFsEtrMIVLwkqpIEQAewoiTa/Yv5wbm2N2C6Mm+1wpeDstLr8HcBHqY0sZQnRwPyi38mm7+0ylruyc96G5AmL2B3vOdz3ANCkktXaFHIg4aWEso3f 7+O0xcr3 mUUwX4tkKHxwBlvO/JhCQjanOUGtRxEDaUBjYMLvBNBmLoPCQ6iTffP9siR+kdzo36jNhcGG5Tng/DhCyi+98yzd9JcVJfiH7N5I2qOoWpmHFMnciCTcwfCQBDfhIlFQ5oPYDCh0xV0QuaJb5A9cwXVJfm2cIV16TetZFNy9s1UQHxbCusTYazFc7+6zHtnD18vFk58CBtWPbIY2SuEG4wkoXB83SPvZyTHluOhTNn4JePX7zo/AVApyh0b2ojIJLkuxcnGv28LXlvyLuneEBUoVLVVAeYUHAo093LBy78nc6BWOXfFetIdKrkqnJ9rS4TJ7xJQ4hL2Ov8gcJ9If65ks+DRa1o9cGKr3S 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: On 2025/5/15 00:50, Kemeng Shi wrote: > If multi shmem_unuse() for different swap type is called concurrently, > a dead loop could occur as following: > shmem_unuse(typeA) shmem_unuse(typeB) > mutex_lock(&shmem_swaplist_mutex) > list_for_each_entry_safe(info, next, ...) > ... > mutex_unlock(&shmem_swaplist_mutex) > /* info->swapped may drop to 0 */ > shmem_unuse_inode(&info->vfs_inode, type) > > mutex_lock(&shmem_swaplist_mutex) > list_for_each_entry(info, next, ...) > if (!info->swapped) > list_del_init(&info->swaplist) > > ... > mutex_unlock(&shmem_swaplist_mutex) > > mutex_lock(&shmem_swaplist_mutex) > /* iterate with offlist entry and encounter a dead loop */ > next = list_next_entry(info, swaplist); > ... > > Restart the iteration if the inode is already off shmem_swaplist list > to fix the issue. > > Fixes: b56a2d8af9147 ("mm: rid swapoff of quadratic complexity") > Signed-off-by: Kemeng Shi > --- > mm/shmem.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/mm/shmem.c b/mm/shmem.c > index 495e661eb8bb..0fed94c2bc09 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -1505,6 +1505,7 @@ int shmem_unuse(unsigned int type) > return 0; > > mutex_lock(&shmem_swaplist_mutex); > +start_over: > list_for_each_entry_safe(info, next, &shmem_swaplist, swaplist) { > if (!info->swapped) { > list_del_init(&info->swaplist); > @@ -1530,6 +1531,8 @@ int shmem_unuse(unsigned int type) next = list_next_entry(info, swaplist); if (!info->swapped) list_del_init(&info->swaplist); if (atomic_dec_and_test(&info->stop_eviction)) wake_up_var(&info->stop_eviction); We may still hit the list warning when calling list_del_init() for the off-list info->swaplist? So I hope we can add a check for the possible off-list: diff --git a/mm/shmem.c b/mm/shmem.c index 99327c30507c..f5ae5e2d6fb4 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1523,9 +1523,11 @@ int shmem_unuse(unsigned int type) cond_resched(); mutex_lock(&shmem_swaplist_mutex); - next = list_next_entry(info, swaplist); - if (!info->swapped) - list_del_init(&info->swaplist); + if (!list_empty(&info->swaplist)) { + next = list_next_entry(info, swaplist); + if (!info->swapped) + list_del_init(&info->swaplist); + } if (atomic_dec_and_test(&info->stop_eviction)) wake_up_var(&info->stop_eviction); if (error) > wake_up_var(&info->stop_eviction); > if (error) > break; > + if (list_empty(&info->swaplist)) > + goto start_over; > } > mutex_unlock(&shmem_swaplist_mutex); >