From patchwork Sat Feb 22 02:46:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mawupeng X-Patchwork-Id: 13986519 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 1E9E9C021B3 for ; Sat, 22 Feb 2025 02:56:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A17DE6B0083; Fri, 21 Feb 2025 21:56:03 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 9C6FF6B0085; Fri, 21 Feb 2025 21:56:03 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8B584280001; Fri, 21 Feb 2025 21:56:03 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 6DFB16B0083 for ; Fri, 21 Feb 2025 21:56:03 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id F218FA3190 for ; Sat, 22 Feb 2025 02:56:02 +0000 (UTC) X-FDA: 83146066164.14.3D1FE8A Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by imf24.hostedemail.com (Postfix) with ESMTP id F0B37180007 for ; Sat, 22 Feb 2025 02:55:59 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf24.hostedemail.com: domain of mawupeng1@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=mawupeng1@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740192961; 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: references; bh=NYiVptSN3L5ha46yZSpxzsT95OHUdtLbCqXYgy6oqWo=; b=NajxHxPpVSkhkXCXqDl/xplWw1wRm3odYyAM5yVyLvyzWIBS0Gy7Q+o35K1+3nNfc2uezO efYwVC+d/TZP/zKkXxDz8M5LK+hRXojNdcyW0cMZATm2yVdYaJxAwmAcpSEH8Lsp7eLfwf vSDbODebPzqutJeYZ8aysJnuNaYV3dY= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf24.hostedemail.com: domain of mawupeng1@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=mawupeng1@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740192961; a=rsa-sha256; cv=none; b=Tuj6QbGFWg41wdMJofIgfciViiZhftzxeOyorTGUOSZuo8cPRmxNy6h7SD3BemhpOASFj6 ov8+AhV05EQ9F0qv51Df3b/pyzU0SevaXoKxO089heKafulWtyWPTFSpufzGZqlvBbBvw6 iEZ4+kBZRTy9tZbe0G0oRqsvVc8f7zI= Received: from mail.maildlp.com (unknown [172.19.88.194]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4Z0BRL1vgyzWvFM; Sat, 22 Feb 2025 10:54:22 +0800 (CST) Received: from kwepemg100017.china.huawei.com (unknown [7.202.181.58]) by mail.maildlp.com (Postfix) with ESMTPS id 249D21400FD; Sat, 22 Feb 2025 10:55:55 +0800 (CST) Received: from huawei.com (10.175.124.71) by kwepemg100017.china.huawei.com (7.202.181.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 22 Feb 2025 10:55:54 +0800 From: Wupeng Ma To: CC: , , , , , , , , , , , Subject: [PATCH] mm: swap: Avoid infinite loop if no valid swap entry found during do_swap_page Date: Sat, 22 Feb 2025 10:46:17 +0800 Message-ID: <20250222024617.2790609-1-mawupeng1@huawei.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Originating-IP: [10.175.124.71] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To kwepemg100017.china.huawei.com (7.202.181.58) X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: F0B37180007 X-Stat-Signature: wcbsz5r6q4tyab4163n4omj7xcezbjhq X-HE-Tag: 1740192959-747266 X-HE-Meta: U2FsdGVkX18+FL34RVhIYPbHPHYfhahCoox9+y5d24Gh41RHuqXIQWV3zMe96M7em5X19f4VwapS/ol5PXVdnYZoyRxSpD+B/keXiv5sFLqOCdVrM9bQLMkNz79MwhIy5eMQweziYjeACBV2zzr6XQZ62E2tY13jjAO0QgBjFUy8OHk6iU+t86iBRuOjrBqn3DqY7hLpqv9/MYBo7WxWQeSEevK5g0aMmyZUH2SFQdvCfabSpz/jXDvb1TIf0jkQZBl/8YlQ4/bOUD+sXvG6t1sTA25yQdBC8I1l18i66rKQJ7KmX6lo7A8ed8/LMWWnVT9ZytyaLHz5TYcMvjBaavfVaukZfvQhtnpZuXuywAl5GavX4X59T+pYvOUM/338uIG7ZZgOTtTKzcISOJdNVuF+jaiVwZ9ZqRthml5bq6m+H64PVmBUDyjzZedYSDHov8kpcz7B677IYDssDM1/Y6skkP5sVQuYk4quY2ha9Iug+fWHZWtWbMlI2nJA4qHOrpuUam/usbs8bEHpfeuLYD11x1jeZlVGzFMoRSXJxPX9TTtEfDrDTFqYktDWb7xrNghNoQB60FtMllK04IjvStg/BM4hrkh7MIZjbOYDy7oyB3CKZfRJ8i4rbp/76AgZ/mpDUE252oxOikO5bcBzzmv12cVw2+jgmorh8qws1peso8h7iPRN9HDfDLN3rg0WP2Ur6Gvc5tqBgfARFL/aRML2qkYBMH8EMaWa9T4OgagVXh7S7GTcXgkgwvVa7pFKuv6pGOzJcoDMj/hEoS1SIFwDwDbUYs/5CJB13DSBEAc+nGp1QOpzATEMIYsJwhmdCs/aPEy/dhEN+G82RaysSOYLowRidMmhWifz8Kn8LONW7yg7rJpw24USZxGIDkqQHOVDd5UCqvfjncU126fbe2Rl0l9rNl7BqV4AvGV/IFN+5H8EAPysKgzO1eSMKxm2SmU9ItWV9P1CdYS6ZOw dbkhDzg1 Y2sETlUvE57sYpQmnDvMUXrncO2bS8rT/t7Ie0Nc71kDpp5PXNBxqKZaRdM8BIydluJ2+TLzM96VJUWdO8mxvgY1cHSGDdAU9M7Mq6uJPoXuw80rfiqjoO24JfOVs3aMl6xucoDktIIOAx/b+of4IZiVOD3ai9xSVx3Q5LkE0I8lurctt/SrWuCjedCY+AIBQU6DDOxRwaJam34NU/DJN4FR4z0OVZrvXgMKVL3sPM6LdmFltjtVOQzexEQFYlcWLm5DGNaaR1SLa7sI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000013, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Ma Wupeng During our test, infinite loop is produced during #PF will lead to infinite error log as follow: get_swap_device: Bad swap file entry 114000000 Digging into the source, we found that the swap entry is invalid due to unknown reason, and this lead to invalid swap_info_struct. Excessive log printing can fill up the prioritized log space, leading to the purging of originally valid logs and hindering problem troubleshooting. To make this more robust, kill this task. Signed-off-by: Ma Wupeng --- include/linux/swap.h | 1 + mm/memory.c | 9 ++++++++- mm/swapfile.c | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index b13b72645db3..0fa39cf66bc4 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -508,6 +508,7 @@ struct backing_dev_info; extern int init_swap_address_space(unsigned int type, unsigned long nr_pages); extern void exit_swap_address_space(unsigned int type); extern struct swap_info_struct *get_swap_device(swp_entry_t entry); +struct swap_info_struct *_swap_info_get(swp_entry_t entry); sector_t swap_folio_sector(struct folio *folio); static inline void put_swap_device(struct swap_info_struct *si) diff --git a/mm/memory.c b/mm/memory.c index b4d3d4893267..2d36e5a644d1 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4365,8 +4365,15 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) /* Prevent swapoff from happening to us. */ si = get_swap_device(entry); - if (unlikely(!si)) + if (unlikely(!si)) { + if (unlikely(!_swap_info_get(entry))) + /* + * return VM_FAULT_SIGBUS for invalid swap entry to + * avoid infinite #PF. + */ + ret = VM_FAULT_SIGBUS; goto out; + } folio = swap_cache_get_folio(entry, vma, vmf->address); if (folio) diff --git a/mm/swapfile.c b/mm/swapfile.c index ba19430dd4ea..8f580eff0ecb 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1287,7 +1287,7 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_order) return n_ret; } -static struct swap_info_struct *_swap_info_get(swp_entry_t entry) +struct swap_info_struct *_swap_info_get(swp_entry_t entry) { struct swap_info_struct *si; unsigned long offset;