From patchwork Thu Jul 27 11:56:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miaohe Lin X-Patchwork-Id: 13330021 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 A4FE0C41513 for ; Thu, 27 Jul 2023 11:57:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3D7266B007E; Thu, 27 Jul 2023 07:57:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2EBAF6B0078; Thu, 27 Jul 2023 07:57:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 13D726B007D; Thu, 27 Jul 2023 07:57:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id E46A86B0078 for ; Thu, 27 Jul 2023 07:57:01 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id C4233B2B05 for ; Thu, 27 Jul 2023 11:57:01 +0000 (UTC) X-FDA: 81057240642.14.450FF90 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf18.hostedemail.com (Postfix) with ESMTP id 6BEA21C000A for ; Thu, 27 Jul 2023 11:56:56 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf18.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690459018; 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=azj0KAbXklqebPEZBU9V1Om7Khs08O1+vwe8Evny4eU=; b=LSj6qSeo/p6I91fxn8PLpvcfWY6T4/KN49wmPoZ2iBWbA8WA95Bldnm4Eiztvx0Puqc4W2 Z2qBBc+Kk2hAZ73KQGZG5hY70I91bf49jxKLKjBsiCJ1F4LH4ThxjAG7a8M/+QDP5Tcg76 Rjcj9SADYAOkVe9G6kFAxN0z8u0jPAQ= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf18.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690459018; a=rsa-sha256; cv=none; b=AjVdMXOR4yDUWRPzaObsqafQFnsvz8fflyqMu65LuddJfcLZ//Z7xPKtxuZWXbYhG5VJBe v6DI1F20XsNBcNDQEzA1uvyp8mTWGAHAFAh45uTjkWWl+hH9Os2Gz7UUl7nNE0c/3Z7Gf5 QR6YQ/+P5hh+ayGXE7jN+nae8OIu4DM= Received: from canpemm500002.china.huawei.com (unknown [172.30.72.55]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4RBTk351PczrS0M; Thu, 27 Jul 2023 19:55:55 +0800 (CST) Received: from huawei.com (10.174.151.185) by canpemm500002.china.huawei.com (7.192.104.244) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Thu, 27 Jul 2023 19:56:50 +0800 From: Miaohe Lin To: , CC: , , , Subject: [PATCH v2 1/4] mm/swapfile: fix wrong swap entry type for hwpoisoned swapcache page Date: Thu, 27 Jul 2023 19:56:40 +0800 Message-ID: <20230727115643.639741-2-linmiaohe@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20230727115643.639741-1-linmiaohe@huawei.com> References: <20230727115643.639741-1-linmiaohe@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.174.151.185] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To canpemm500002.china.huawei.com (7.192.104.244) X-CFilter-Loop: Reflected X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 6BEA21C000A X-Stat-Signature: bjzhix641usw4s1naysjt7uhq3ukjnq4 X-Rspam-User: X-HE-Tag: 1690459016-198131 X-HE-Meta: U2FsdGVkX18VGvXH6Ve9pjqVqFy0zbtQG2X/1LNyOC1YlonqMftaG/+ByW7D2YPtPFKIaylnn7aTo8ZDMIZlzmb0IEbHbhS7WLE42q3+Yqr8W0qvwRtcs6fUkyiMXRicwlZH/U+o7bnrKu9gsHLYNUhyh8tytkyiCtQuqyB8lzIZhTxrKXvS8E5tjunV+anq+uy83kl3Md82/F7i3iHPGs7YSU3jybvFuiKpEUasZOBBeKb9EkpPQbs8e4P6Yng5Vux/97XjpNmWhmpecpYL0f/aHX5nTh31THuS4k/MLHeVjUz75cyo45yXOSu2FcR7SVQW9nMF+dDthe+ShX0rNnnm0Cw9qQQhJXrboclItKC7TeHxNatpLSwsqGdUQouJd8c6GWd5CejPvc+G85P1EBUJ1w9qSAOWIVmA41y9tArWd+rBLSxM5RhbSsXHy2a9mtOEYzHy/A3jVTi7HowrNWktPNDa8rIfpNg9DkGEvD1YTTsaf472zveYKYHdDbJR1M/HdcCE8ENgyawEUi8k2mxOcMR1xj+m7zpO/J992rGpsXwGSOxg0H1/wxef3nLQ3ptZ/D5ok1j5p3zZJUh82wOjiCWrqfLR1lQ/UFpWKl1dyPz5bQbFJEE7Yfvz80qdsVTNr0llhKD3FySDnHcpleIdNNps8BzgXv6Eyy50sDV2mPY/ZCfVzdO8naDL2NuMuiQ4okJb0U1+PXFbR1yxa2guk6mxI0YHsAqI9piAKlIpRXktnb5ihbd6iIAUjk6IJcFAE/iUD2ye+F6Wv5er6mVsF4i6KghIrExmHpMz96jUKLZ9qJtg+6l4+H3c+hqg3eaamj1Iv5upmNbhslA21n4B4GglpKvyb2ziIwWW50/oklttpI9as6pNfh3N19BECQpqn0jZdowE8dTWw/SS25FiLx/Fztn3Z/GqB/66A121s62YJM98DGV3uluoWsVmCBm43f12jLwmOobLe4v gP7pxfz6 r7Y7WzJNIzPz5my7owAv8tB4XYNPE8gy11nvwHj+zw1Jdk4xNzuC8gl8ybvfRBWMiiCABV0BIyo2ZbvYrPWpb17ughcTrUBL3pV2qbmcVtHLTKZdCT5PEAJ8rqPFJz4eWwmlKzYIILZMwasQ= 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: Hwpoisoned dirty swap cache page is kept in the swap cache and there's simple interception code in do_swap_page() to catch it. But when trying to swapoff, unuse_pte() will wrongly install a general sense of "future accesses are invalid" swap entry for hwpoisoned swap cache page due to unaware of such type of page. The user will receive SIGBUS signal without expected BUS_MCEERR_AR payload. BTW, typo 'hwposioned' is fixed. Fixes: 6b970599e807 ("mm: hwpoison: support recovery from ksm_might_need_to_copy()") Signed-off-by: Miaohe Lin --- mm/ksm.c | 2 ++ mm/swapfile.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 97a9627116fa..74804158ee02 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -2794,6 +2794,8 @@ struct page *ksm_might_need_to_copy(struct page *page, anon_vma->root == vma->anon_vma->root) { return page; /* still no need to copy it */ } + if (PageHWPoison(page)) + return ERR_PTR(-EHWPOISON); if (!PageUptodate(page)) return page; /* let do_swap_page report the error */ diff --git a/mm/swapfile.c b/mm/swapfile.c index e04eb9c0482d..0df94c4000ea 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1744,7 +1744,7 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, struct page *swapcache; spinlock_t *ptl; pte_t *pte, new_pte, old_pte; - bool hwposioned = false; + bool hwpoisoned = PageHWPoison(page); int ret = 1; swapcache = page; @@ -1752,7 +1752,7 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, if (unlikely(!page)) return -ENOMEM; else if (unlikely(PTR_ERR(page) == -EHWPOISON)) - hwposioned = true; + hwpoisoned = true; pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); if (unlikely(!pte || !pte_same_as_swp(ptep_get(pte), @@ -1763,11 +1763,11 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, old_pte = ptep_get(pte); - if (unlikely(hwposioned || !PageUptodate(page))) { + if (unlikely(hwpoisoned || !PageUptodate(page))) { swp_entry_t swp_entry; dec_mm_counter(vma->vm_mm, MM_SWAPENTS); - if (hwposioned) { + if (hwpoisoned) { swp_entry = make_hwpoison_entry(swapcache); page = swapcache; } else {