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 B5A0AC63797 for ; Sat, 4 Feb 2023 01:46:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DEAC56B0071; Fri, 3 Feb 2023 20:46:06 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D9A5B6B0072; Fri, 3 Feb 2023 20:46:06 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C89C26B0073; Fri, 3 Feb 2023 20:46:06 -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 B5FC46B0071 for ; Fri, 3 Feb 2023 20:46:06 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 7DEC580708 for ; Sat, 4 Feb 2023 01:46:06 +0000 (UTC) X-FDA: 80427918732.15.5F20856 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by imf24.hostedemail.com (Postfix) with ESMTP id 84B6018000F for ; Sat, 4 Feb 2023 01:46:04 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b="1oN/7nLV"; spf=pass (imf24.hostedemail.com: domain of akpm@linux-foundation.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1675475164; 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=9GNjhmKV2mJiwiepxHTizB0Y7zw6dukpXxT6LpEtOsE=; b=LDHa8+p/zNPdEhb3Ai97a4FrHb/iBiwj2mJiIsYighpbRxUvPYETxaGe3MP7sG6FwNLmWE 6/J6xZtdOunZ0+zA7iErgANHzUC4vFG8SPdGkAWacJbFy6Hk3VVaxwvRijv6whJoPLxdQJ 3YPWaV48LNWcrYkJcT0/Oq3u8BI9kHk= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b="1oN/7nLV"; spf=pass (imf24.hostedemail.com: domain of akpm@linux-foundation.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1675475164; a=rsa-sha256; cv=none; b=6LZGxI4fB0OBKZlM7gCjd4OZMUOaJX4xuffZ40cfQVst9w7MZN3dyYBY+e3CPPmymNvGu2 gZuGUaK93Iak+qc3hF/o/kac1vsliGVFb8DbDs7ReGWLA6dOaGexfgICLOKJ8w5DHFawOl D5SBN9+wZglVpsuZM4XSxYux1ANIKJo= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 00B30B82C52; Sat, 4 Feb 2023 01:46:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D175C433EF; Sat, 4 Feb 2023 01:46:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1675475161; bh=H/i6B4QCS1pFRvxe1XgeIybEfQ/L4+Kf60VEnVS8tmY=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=1oN/7nLVldsnrQpC9YZxwmNErwjbLUG9DWnrTudXeEqJGK4UBu+8UvWq8MyrHjj74 Ty3HyyfXRj9Eih4rxLptMt9uVRgdGZSSP3x0P/vUY4P/EuSzNCCil1rxDzg+D4HR44 aHdJiTEvFS1bJH1DtJgK4R84UU0rsNHs1jWNVHvQ= Date: Fri, 3 Feb 2023 17:46:00 -0800 From: Andrew Morton To: Kefeng Wang Cc: , , , , Subject: Re: [PATCH v4] mm: hwposion: support recovery from ksm_might_need_to_copy() Message-Id: <20230203174600.fd5a60663ae1d98cb44ea5e3@linux-foundation.org> In-Reply-To: <20230201074433.96641-1-wangkefeng.wang@huawei.com> References: <20230201074433.96641-1-wangkefeng.wang@huawei.com> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.33; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 84B6018000F X-Stat-Signature: xkz5hghpyt75sbfe55x5c83jn7cbe8ij X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1675475164-948873 X-HE-Meta: U2FsdGVkX19Fk9GjHDDYWYqkYxzXLVANgBELxyy9sqrIKBfYN5CzM1b9qi6EsDoCPIv38QHtWSL5AXPLyfFhavCqp4aQgGQJyLHZHPxHpfjFEnvoGIXIuf1+cnFqfG8bSHcUnY3OSIrSxAAZ1UTUdA4wLRuaDMADy0Hvrk4+bE8J/0U8rZu5pGCUlcw91zYRBh9dGlLrkuRNYRX0CGx5uJnio/ZCRXUbhlECa5Ey1V17hbI0Bj+b2vGiIpaZFWPrIjJEtTwSVMzvwGqRMtUYtUYt1k3Wk0O8V3Y5MSS0cgfwVDx//j5bqNkpGRDzIXT3oLP3OnT7KlGMbVB7UtdlU1o2PnIp/te5Kk923iiuN1+KyZ+6144aihbLCUqrm4e3W9DMJ+GK27iRPmU4upgJh6SKzw9LGRUzPwuUsND+Ap06WmR2II21eMxYJhCXAkVOektIGCTVpaPx7GxQDFSa/kVCb8+TBNRWGs+FEeqjWn+O5sTLXsVSSEHFk9IFRwK2I+MfDq10NEpmz6jHzJ9OBK75oiz4wDdfXd+eIRj9Ao/IDqluo2hrR7xXhXVCGvA4Ojny8cQpz7QSVnCmdgzuqLStrzyBUfe1F0QUZM0zBvWtZRHJfLp0cmb10vS6b9DyBPlM5OYdeR1+XyN66e30hqUtrZHR60jOD7VM+M2FTXcl2ifQLgehNr4AqM4LYervfARyExSQ489TCXHWZFlRedkYtuSa9RqC6GwBiCDmF9PMi8HBSPF8lI12XQpSXjWGeMWg4TIgbgMpQqibaZhKlhwxdX7aOdSn7XhzcIZ1Uvu68/I/efvLcwg0l7mSI1AWi3Go7bJaGIl5YfbbBn57k8JFCSoa72vnA5OZN2dZWwGG8O0o1Qy6aK5EHLKVOhExdMR49j5Ugkg4Gurj6uIA6T9pX13Iwmo8YOUBzpU+YxWcaHK5AenNTo3b/4dAZVgTZZn9GzHppqsX6477Ssm DFaWv4bP SlgzYXLNWkIrOb12/S3WD8QaWoeIPLBAlN/9Omjcku0uJep/Mp1pLuVH+dnEytq/Sutkwy6+TIN11Uwp1eP4lFN8I5oaNV3eANoAH9kgEZyoIs1SxV1XU28bssJcbH0MFCS5cdVh//i5qpG2TbzUSW2sNKWtp5oPh/L9HlUhevEmadXOp5A2i91qsZQ0wdBXXshiCKQsO5jREza9V0MciRHhdpgPnkoAfSTHp1tzHxa4yHThVZ/GzJRU1UJ4jpduITPZpF077YvzsmisqZWyrqsxbO0H1qvQECf4CzjW558XQ+gBxgFBqvafZX97gb/icuJ0qngi5V1LD+L4dCKBXWFJ0rkS8UG5ZwDdh27TaAh7x8Yyx7CB3+AFuo4Lq2ky+aVeUc3+prFPbNhmlkEsgHkaotziaOckJ0uow 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: On Wed, 1 Feb 2023 15:44:33 +0800 Kefeng Wang wrote: > When the kernel copy a page from ksm_might_need_to_copy(), but runs > into an uncorrectable error, it will crash since poisoned page is > consumed by kernel, this is similar to the issue recently fixed by > Copy-on-write poison recovery. > > When an error is detected during the page copy, return VM_FAULT_HWPOISON > in do_swap_page(), and install a hwpoison entry in unuse_pte() when > swapoff, which help us to avoid system crash. Note, memory failure on > a KSM page will be skipped, but still call memory_failure_queue() to > be consistent with general memory failure process, and we could support > KSM page recovery in the feature. > Some review input would be helpful. Are we able to identify a Fixes: target for this? I assume that a -stable backport is desirable? Thanks. > --- a/mm/ksm.c > +++ b/mm/ksm.c > @@ -2629,8 +2629,11 @@ struct page *ksm_might_need_to_copy(struct page *page, > new_page = NULL; > } > if (new_page) { > - copy_user_highpage(new_page, page, address, vma); > - > + if (copy_mc_user_highpage(new_page, page, address, vma)) { > + put_page(new_page); > + memory_failure_queue(page_to_pfn(page), 0); > + return ERR_PTR(-EHWPOISON); > + } > SetPageDirty(new_page); > __SetPageUptodate(new_page); > __SetPageLocked(new_page); > diff --git a/mm/memory.c b/mm/memory.c > index aad226daf41b..5b2c137dfb2a 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -3840,6 +3840,9 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) > if (unlikely(!page)) { > ret = VM_FAULT_OOM; > goto out_page; > + } else if (unlikely(PTR_ERR(page) == -EHWPOISON)) { > + ret = VM_FAULT_HWPOISON; > + goto out_page; > } > folio = page_folio(page); > > diff --git a/mm/swapfile.c b/mm/swapfile.c > index 908a529bca12..3ef2468d7130 100644 > --- a/mm/swapfile.c > +++ b/mm/swapfile.c > @@ -1763,12 +1763,15 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, > struct page *swapcache; > spinlock_t *ptl; > pte_t *pte, new_pte; > + bool hwposioned = false; > int ret = 1; > > swapcache = page; > page = ksm_might_need_to_copy(page, vma, addr); > if (unlikely(!page)) > return -ENOMEM; > + else if (unlikely(PTR_ERR(page) == -EHWPOISON)) > + hwposioned = true; > > pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); > if (unlikely(!pte_same_as_swp(*pte, swp_entry_to_pte(entry)))) { > @@ -1776,15 +1779,19 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, > goto out; > } > > - if (unlikely(!PageUptodate(page))) { > - pte_t pteval; > + if (unlikely(hwposioned || !PageUptodate(page))) { > + swp_entry_t swp_entry; > > dec_mm_counter(vma->vm_mm, MM_SWAPENTS); > - pteval = swp_entry_to_pte(make_swapin_error_entry()); > - set_pte_at(vma->vm_mm, addr, pte, pteval); > - swap_free(entry); > + if (hwposioned) { > + swp_entry = make_hwpoison_entry(swapcache); > + page = swapcache; > + } else { > + swp_entry = make_swapin_error_entry(); > + } > + new_pte = swp_entry_to_pte(swp_entry); > ret = 0; > - goto out; > + goto setpte; > } > > /* See do_swap_page() */ > @@ -1816,6 +1823,7 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, > new_pte = pte_mksoft_dirty(new_pte); > if (pte_swp_uffd_wp(*pte)) > new_pte = pte_mkuffd_wp(new_pte); > +setpte: > set_pte_at(vma->vm_mm, addr, pte, new_pte); > swap_free(entry); > out: > -- > 2.35.3 >