From patchwork Sun Feb 4 08:26:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tong Tiangen X-Patchwork-Id: 13544560 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 95273C4828F for ; Sun, 4 Feb 2024 08:26:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C4B986B0081; Sun, 4 Feb 2024 03:26:43 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C285D6B007E; Sun, 4 Feb 2024 03:26:43 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 98D0A6B007E; Sun, 4 Feb 2024 03:26:43 -0500 (EST) 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 830F36B007E for ; Sun, 4 Feb 2024 03:26:43 -0500 (EST) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 58441A036C for ; Sun, 4 Feb 2024 08:26:43 +0000 (UTC) X-FDA: 81753440286.02.55A4AF9 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf28.hostedemail.com (Postfix) with ESMTP id 874D5C0009 for ; Sun, 4 Feb 2024 08:26:40 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=none; spf=pass (imf28.hostedemail.com: domain of tongtiangen@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=tongtiangen@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1707035201; 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=1/hfG/AoTUNScs9lTyBC3Hj5z+BtwGolZlOronaGEbY=; b=bK4RChtCa6UQroyXjcOcyUkTPIYu5cJEz7DXhvtwcTbxDFUWgpdNwqzBg9bFYxmoPFL/IC BfsJF17O2fdvnXY/PY/am9mqO1r7WbWHBaa9RgzL6RXpTFCVWdfH89l+OkifHKIra75gzN NpEsEPQdoZqHjTqNNnhZnzRztScGJDk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1707035201; a=rsa-sha256; cv=none; b=J3GbSSKnM4hXR1JxkcsbWT+rIqHO26vMcbmJKyqdLYxFKPTggkNiZguyzOQlfWQCWX5qmy RwEt1v/xtCh0+wkCbm4EwjYLtA/mjuhMW7ZVScEXPuyBsoTbyqNLD1i0cLpce+k4pj0VaF fxTEYmt9dOGrt90Db02mbJf/hUI3XkY= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=none; spf=pass (imf28.hostedemail.com: domain of tongtiangen@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=tongtiangen@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com Received: from mail.maildlp.com (unknown [172.19.162.254]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4TSMyQ0lJtzsWrZ; Sun, 4 Feb 2024 16:25:18 +0800 (CST) Received: from kwepemm600017.china.huawei.com (unknown [7.193.23.234]) by mail.maildlp.com (Postfix) with ESMTPS id 3DF7618001A; Sun, 4 Feb 2024 16:26:35 +0800 (CST) Received: from localhost.localdomain (10.175.112.125) by kwepemm600017.china.huawei.com (7.193.23.234) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Sun, 4 Feb 2024 16:26:33 +0800 From: Tong Tiangen To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , , Dave Hansen , , "H. Peter Anvin" , Tony Luck , Andy Lutomirski , Peter Zijlstra , Andrew Morton , Naoya Horiguchi CC: , , , Tong Tiangen , Guohanjun Subject: [PATCH -next v5 2/3] x86/mce: set MCE_IN_KERNEL_COPYIN for DEFAULT_MCE_SAFE exception Date: Sun, 4 Feb 2024 16:26:26 +0800 Message-ID: <20240204082627.3892816-3-tongtiangen@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240204082627.3892816-1-tongtiangen@huawei.com> References: <20240204082627.3892816-1-tongtiangen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.112.125] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To kwepemm600017.china.huawei.com (7.193.23.234) X-Rspamd-Queue-Id: 874D5C0009 X-Rspam-User: X-Stat-Signature: ifz9arbwug7xaq8hxymxgoq13mx8etbs X-Rspamd-Server: rspam03 X-HE-Tag: 1707035200-391876 X-HE-Meta: U2FsdGVkX1/mrXDZj534BzmF8Ebc2HFRyoTjKkO/O2bv9K61GpM7UYbR/XTE13iOZCT02UnaON6f8VspJKbk7dLBSRWi7Rh6kI7pFewoT6caZkNRajJAz9RLVW+p8PKMnxjOmoCujugy0W0rZsnWVyVDuUB8OtSOXgnGjJG8cB8BFTmOxRaR29DfoeGliMCYHQEt0tUoQ0CNpTn6j65hn/oGH5RiJ6XoufMm0UvZ362tRU+p+Lxz6mGpXhZ8G6XWSWRJoFIYiVRnXAdP5yPM8GHLk/iNlKeBCI54OK83KWMqFnaCpTAW4vKbEcK+QYEC2iBOtjIKODQPbypqoizRiVDugPSfapqhhdEFJneAlaAGAxMRp1gaVpk9rLqEN8hXIWjMylddN1UREyD1iWNMWMfrzCiqgjNA3/m2HVwRqf75fP/M6OatWGqndVWxE0N7+hwD13osJlD4wmyOvPvfDJMaMAJe4zHezQ6o3plror7yrMwwZyjsyqdJeDHUzvlR2YL6s5UHaDfoINJavWIw4TvvFcRMQmomxD2PY1S86eYRvr+siz+cUmLyQ7y5QmDZ4VOuXQJllWi45OmpfD7daKO1ACZUgWtXjk/jIQyBh/SKLS7lImpxOnXC54wYyN47JT7n2MsZszGo1Glh34brCJJcPsZFuc8Pp8ShabagE1ExnDZpKmf86bIUBynis0YalABEiDXkhtDL64H2gBodCWiM8f+9+kWubjf59FtwdwUPhk8HSpIMAbJfszAZyBPMrSOjClckpaCEAA22EWOqDVGl+uWMYvjkzoYdoF7KpwSbpcn/g/0afjnnFvj8gAwTA8rT1xVzseqwgVQUOmChg2qc9nITEuvf/416STcwczoPlose2DnKpMNgOEYog+TB/QL7Wqo2aUmL0fQJylLy2xJUuSJNJFAfGnicyvVp5lTCHx53E5F08/UEvEtzsoPQoh7T0ldiBAsnYnd0noo qT8aKa8D Ok7FKe9bFJzgbsmyKK2MHmSYpigXUuMasoK9aJmnK3rxIFmHiItCirY4yVb0vSKtqzKPyYnObv4w8QrSkmCyJ3+bDK8JQ+xEtPSEei2DVehtSLaDt87OyY3OiEEFAxnQtKhvOg4jcCGOJ47iXVUQ6yitzt+PtpF6QSNnYUVKhbjbmBYpWnt5qMzblLCG0P0ZIXLndNbji/3V6dtZfwdnny8124gqpuJ+POCtzWqB+6Oyk/Oe//Ts83QYZTA== 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: From: Kefeng Wang Currently, some kernel memory copy scenarios[1][2][3] which use copy_mc_{user_}highpage() to safely abort copy and report 'bytes not copied' when accessing the poisoned source page, a recoverable synchronous exception generated in the processing and the fixup type EX_TYPE_DEFAULT_MCE_SAFE is used to distinguish from other exceptions, and an asynchronous memory_failure_queue() is called to handle memory failure of the source page , but scheduling someone else to handle it at some future point is unpredictable and risky. The better way is immediately deal with it during current context, fortunately, there is already a framework to synchronously call memory_failure(), see kill_me_never() in do_machine_check(), a task work is triggered once MCE_IN_KERNEL_COPYIN is set, in order to fix above issue, setting MCE_IN_KERNEL_COPYIN for EX_TYPE_DEFAULT_MCE_SAFE case too. [1] commit d302c2398ba2 ("mm, hwpoison: when copy-on-write hits poison, take page offline") [2] commit 1cb9dc4b475c ("mm: hwpoison: support recovery from HugePage copy-on-write faults") [3] commit 6b970599e807 ("mm: hwpoison: support recovery from ksm_might_need_to_copy()") Reviewed-by: Naoya Horiguchi Reviewed-by: Tony Luck Signed-off-by: Kefeng Wang Signed-off-by: Tong Tiangen --- arch/x86/kernel/cpu/mce/severity.c | 4 ++-- mm/ksm.c | 1 - mm/memory.c | 13 ++++--------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/cpu/mce/severity.c b/arch/x86/kernel/cpu/mce/severity.c index bca780fa5e57..b2cce1b6c96d 100644 --- a/arch/x86/kernel/cpu/mce/severity.c +++ b/arch/x86/kernel/cpu/mce/severity.c @@ -292,11 +292,11 @@ static noinstr int error_context(struct mce *m, struct pt_regs *regs) case EX_TYPE_UACCESS: if (!copy_user) return IN_KERNEL; + fallthrough; + case EX_TYPE_DEFAULT_MCE_SAFE: m->kflags |= MCE_IN_KERNEL_COPYIN; fallthrough; - case EX_TYPE_FAULT_MCE_SAFE: - case EX_TYPE_DEFAULT_MCE_SAFE: m->kflags |= MCE_IN_KERNEL_RECOV; return IN_KERNEL_RECOV; diff --git a/mm/ksm.c b/mm/ksm.c index 8c001819cf10..ba9d324ea1c6 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -3084,7 +3084,6 @@ struct folio *ksm_might_need_to_copy(struct folio *folio, if (copy_mc_user_highpage(folio_page(new_folio, 0), page, addr, vma)) { folio_put(new_folio); - memory_failure_queue(folio_pfn(folio), 0); return ERR_PTR(-EHWPOISON); } folio_set_dirty(new_folio); diff --git a/mm/memory.c b/mm/memory.c index 8d14ba440929..ee06a8f766ab 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2846,10 +2846,8 @@ static inline int __wp_page_copy_user(struct page *dst, struct page *src, unsigned long addr = vmf->address; if (likely(src)) { - if (copy_mc_user_highpage(dst, src, addr, vma)) { - memory_failure_queue(page_to_pfn(src), 0); + if (copy_mc_user_highpage(dst, src, addr, vma)) return -EHWPOISON; - } return 0; } @@ -6179,10 +6177,8 @@ static int copy_user_gigantic_page(struct folio *dst, struct folio *src, cond_resched(); if (copy_mc_user_highpage(dst_page, src_page, - addr + i*PAGE_SIZE, vma)) { - memory_failure_queue(page_to_pfn(src_page), 0); + addr + i*PAGE_SIZE, vma)) return -EHWPOISON; - } } return 0; } @@ -6199,10 +6195,9 @@ static int copy_subpage(unsigned long addr, int idx, void *arg) struct page *dst = nth_page(copy_arg->dst, idx); struct page *src = nth_page(copy_arg->src, idx); - if (copy_mc_user_highpage(dst, src, addr, copy_arg->vma)) { - memory_failure_queue(page_to_pfn(src), 0); + if (copy_mc_user_highpage(dst, src, addr, copy_arg->vma)) return -EHWPOISON; - } + return 0; }