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 ACF32C3ABD8 for ; Thu, 15 May 2025 01:05:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 559926B00C7; Wed, 14 May 2025 21:05:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5081E6B00FA; Wed, 14 May 2025 21:05:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3AD106B00FB; Wed, 14 May 2025 21:05:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 138136B00C7 for ; Wed, 14 May 2025 21:05:51 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 29EBD1A132B for ; Thu, 15 May 2025 01:05:51 +0000 (UTC) X-FDA: 83443350102.24.FCA8D94 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by imf26.hostedemail.com (Postfix) with ESMTP id 25A92140004 for ; Thu, 15 May 2025 01:05:45 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf26.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.56 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747271149; a=rsa-sha256; cv=none; b=1qIvK7LEu12esSIspH1cS4F7eig2+mzE3wZhb0EbgJLVCkCi6tIRm0GxMMwnOXgyWaDqt/ PRKWUQYRxTGk8REDus+otxHyhgDW8iMMS4Pn8lrjx1MfIFtwXNTvtonQnIFXPbv8OFnFRP D2HYOSD4f7xPbQFZMVaO9D0l2wZ9geU= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf26.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.56 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747271149; 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; bh=YbCNMRbKiqVLq+WTIzPaHhFmjJu2KoEF1dmwawO3PSI=; b=i3FaVMAwP6n5mzzWf3XlV2aO+fGoCaq7u5ltuBImEvlMkmoUXLyBDVTbqy4pKQv4Lhpmtc IlBOUvl3uwLA37WXNcCjtT8DMPlLfC0v9CjkntHRIvPP1tUjtiBxthzRIMIQi4A/3Ftq9D gZlAMmDlt2E2a7MGkG2URHfMPBKiSio= Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4ZyX7Y3Ktsz4f3jd6 for ; Thu, 15 May 2025 09:05:13 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 45A411A1121 for ; Thu, 15 May 2025 09:05:38 +0800 (CST) Received: from [10.174.178.129] (unknown [10.174.178.129]) by APP3 (Coremail) with SMTP id _Ch0CgB3F8LQPSVodxACMQ--.16943S2; Thu, 15 May 2025 09:05:38 +0800 (CST) Subject: Re: [PATCH 3/5] mm/shmem: Fix potential dead loop in shmem_unuse() To: Baolin Wang , 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: Kemeng Shi Message-ID: <634a73ce-a24e-01d4-1d00-86272bc78860@huaweicloud.com> Date: Thu, 15 May 2025 09:05:20 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-CM-TRANSID:_Ch0CgB3F8LQPSVodxACMQ--.16943S2 X-Coremail-Antispam: 1UD129KBjvJXoWxGw4UAFW7WF15WFyrZw48Crg_yoWrury5pr 1kJryUJrW5Ar1kGr1UJr1UGry5Xr1UJw1UJr1UAFy8Jr1UJr1jgr1UXr1jgr1UAr48Jr4U tr1UXr1UZF1UJr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkEb4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x 0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG 6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFV Cjc4AY6r1j6r4UM4x0Y48IcVAKI48JMxk0xIA0c2IEe2xFo4CEbIxvr21lc7CjxVAaw2AF wI0_JF0_Jw1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4 xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1D MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I 0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWU JVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07UK2N tUUUUU= X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ X-Rspam-User: X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 25A92140004 X-Stat-Signature: 47xxtdrzdk38cswrbu8mgfuzcn5ie51u X-HE-Tag: 1747271145-846311 X-HE-Meta: U2FsdGVkX18rJ1sGo75OxnOl7KT9cdfsa+x3oA/x5TbasY2X8C3QfdmB+947vcFXDclPPJDxt122qFjutQF2s2MfikyPSTrBKKU4PX+0xRIHtLnRXkJHXQqW9FmcgFO7ZaeyJRo/xn4N0Z9bKdaZHsPMR2zSmCOdmGZWrAWqjfXNPJ6Y/l0YcMBp0+LwBslI2gmWOBv7SgQud5JApX6r+uTNT18Jc8twXlg/4Id3HeAeePiCb8/oJVGIaO603kJQk/fuhq9n7aJCdgYEwnBdrfZ1bp/wSNaQSt//I3k5rC5HMYmpCPzMtuSYIM7yZurwWfhC3b6R/fIPDBzfsrjEkAV+r9IHRbnFMb7hPvOX21sH0ASyGPOLtQbME+fiFf1hu0HYzpxcQ6LDGut0bMEyHwWp8wWWDqL0r8fMYhSrE2Jk+w1xQjQL1Zp/l929XFTh3ewVI67mPrtxxLiSokr/B5IVqeIyxl2f/NdSzWNqd+UobekIDiQBQVHUQzB4fxZHUYu7ozpM+mso+BZdnumlCwmnNgDphMHz7DaGuNXxmu3eIFOgwwlfmFEdoHGrtqjYNy27ofV4H5OBRuL1f7O+nrEpPbeSv68pLApIOolipJEwZfXuhdcz6SpcIdpzXA4hopAUjl+yYhKQidy2wRD4GI0M/6JcXLwbd2PCdSD5JDgNdq0JzmSujK/RIGzDOYAeW7IWjlOJyM7hUTrILdaGVtbtgqyySm94Qq2up2R2EZqrz0qiqyByUJyjjqMF8KRDvwDNniwR6uIrgJLsayxRrnIf26Yee4AZqE8Vr6etl0wFnVQLUA0vD8mz/gZQ+Lc4OD94WqQrARCnZv406FW8BggDAOkpR3/9O6YqZ41H3TKnoILQ5pi9PI/M2HZKHt/WNJZn/SXBAaPfBY2Ulu2EdUHGawShWQ0y9zKMJfsK7aIIeaSHR6qIJzjYlfrQAvBAhCr6PBuVU3NRp2kn32r Lx9Dpjsa 0efDGrQ76iAWoCCAEx0c2Xqywy75Yj1CHq7EaWp+cbEdpTr1uXSpvzyMjLKqOxTSS3APauhevQKgjMr+vXC7HcrM599ePOtJyXlysOYqoBN5yMsnWlLhYIzusZQbNsV4U8f84A5DDizl0gS6xs5u1LALK3IB3X2h0YNX0MTYTEPu47OTNoqam+s8+cVduZXrrAPqr1avc45FF3/xXHxlh0vR14Q== 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 5/14/2025 5:24 PM, Baolin Wang wrote: > > > 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: Hello, When entry is taken off list, it will be initialized to a valid empty entry with INIT_LIST_HEAD(). So it should be fine to call list_del_init() for off-list entry. Please correct me if I miss anything. Thanks! > > 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); >>   >