From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9C023A6EF7 for ; Tue, 2 Jun 2026 21:56:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437367; cv=none; b=uMQNp0jPNSVoWH1M6DAnF5F0EeOYU/3cKIWG3s8eZim7o1TVJc9+Cfts3dS6auuRte0K3aqjRzXl1a9eirgeIJp8d/Hnob+ZNdzDqI1EYKxGK3FTCb0RjYii5Zx/0adJjJv2z/R0WH1vxg9hR4tahpgWm0rZNbcXxsfZ56LB9FU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437367; c=relaxed/simple; bh=eDCJmE+ukj/QmiRfjhh4tiNP2lmAkBpX7X42rYIjVPg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=EEPcWhbAa5mJBPpk0zDCIK32xQr1suEXwd1LtEZXTNz+zQKBN9mdFq23QSTcQNk/4c1asCTJHBodZGmrnNkV4qbkMVL0orlMbbwSRgHP7/jnNAPxGUFaZBmlf6aOVN6WoflVc17z4OrrlaHgZY7yhpUoVTe/eB5okvkQL0Ee+Yc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FVHMQ5mt; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FVHMQ5mt" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2bf335549b8so54888765ad.1 for ; Tue, 02 Jun 2026 14:56:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437365; x=1781042165; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=IodJjZi5r7h0hIvWeeU29JYBpcZRZhnAZAUBtd3riDg=; b=FVHMQ5mtmSeIfohMz54I3zBYQVu3f5WT9tNk/XSE71azpt9WW6ygJyBSzNZoCe2lGn hjIpwezmgVBFVDT0ZwKAEMpR9aZTpYyRr6mWUJlaqzAOQWsPSiarUQxqbavAeWEH/XVQ 1M1OVPkIqXrnBkbWGIaxQWKRsisaEB8bVn5BYCmLjsyuYXbvjJKMCSkoe1nOH2D3ncZb /MTAL7D+qNvKVxhSXfmiw2drSCtCZS+/c1XCyo+J/U042S4aTKfhmC6KwHqORczLwlfj DOCdm7w4WDAErrt5UgwtXI3B97iU2u6qUlayiiODKGzxeMm4CUmCr4biV4W3DMdjaoHS IvcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437365; x=1781042165; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IodJjZi5r7h0hIvWeeU29JYBpcZRZhnAZAUBtd3riDg=; b=ie3b7u6wvJiSD6Z4b/zPRCUWWCSnhYsKk4nfHgBMs0NY6v4VYgi8v0V5LzyYxUIdgt CPPlzXVgJdznichpoUJ2noAymGvSnUv0Jo6MjbarACF/wSJh5+33KSU/5UdcXCv+YitF hmCeSu60iDXHHLevUmHZUc0m088HHAmHU66K1w8hD2IfG69qzuzuywwBsEebF4WzMBPP NYrohH2Kf8kcK8QFRhN4Kj8PaUBy7eWTub217yQxLo0HRUkWx/EczY9Wj5vhg4U3JCBT uyYOeZqC3aRagwj43gCWE5jYElpViAObnWHW74ENNLowUlM74xkCYPhgS78dmn197KVe 3j9w== X-Forwarded-Encrypted: i=1; AFNElJ8By802BTcPZnjCcfF5fpxGEmf5l9DGaHtM3XC67Q/u/plIOQvP+uYztcd5NNUb6PiMwZbJdkDlPvpIDf4=@vger.kernel.org X-Gm-Message-State: AOJu0YxPW0DQ5juQJ0AgHg3mVffwX2xXwB31TqmiPfxTaRlbXvefVu5q wn2p/Le5zpEeMECKLLKo09EyrxkmWUBMM8BSIE85ZuJNHYhd4cGSY1N2lR8V+OoFev8D4/MBQ2r OdnX9JA== X-Received: from pljf15.prod.google.com ([2002:a17:902:ff0f:b0:2bd:e92a:169b]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:b8d:b0:2c0:cbd8:5ff9 with SMTP id d9443c01a7336-2c163fa8268mr4999375ad.21.1780437365088; Tue, 02 Jun 2026 14:56:05 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:41 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=2390; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=eDCJmE+ukj/QmiRfjhh4tiNP2lmAkBpX7X42rYIjVPg=; b=qlOZ4DnpysCVCE4RR3aGPdX4Di/mOUwwaTmtW26PG+ejDM/9AkmX+V6nOEdYaPJYt6sl8ORav 5QxNZfYotzjAiPo92LoZAmJK1I57WL8Zcm0X9kR0EJD3OR5c59Nwoco X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-1-a5bc7db5a9b2@google.com> Subject: [PATCH v4 1/7] mm: memory_failure: Clarify the MF_DELAYED definition From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This patch clarifies the definition of MF_DELAYED to represent cases where a folio's removal is initiated but not immediately completed (e.g., due to remaining metadata references). Signed-off-by: Lisa Wang Acked-by: David Hildenbrand (Arm) --- mm/memory-failure.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index ee42d4361309..2e53b3024391 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -849,24 +849,25 @@ static int kill_accessing_process(struct task_struct = *p, unsigned long pfn, } =20 /* - * MF_IGNORED - The m-f() handler marks the page as PG_hwpoisoned'ed. + * MF_IGNORED - The m-f() handler marks the page as PG_hwpoison'ed. * But it could not do more to isolate the page from being accessed again, * nor does it kill the process. This is extremely rare and one of the * potential causes is that the page state has been changed due to * underlying race condition. This is the most severe outcomes. * - * MF_FAILED - The m-f() handler marks the page as PG_hwpoisoned'ed. + * MF_FAILED - The m-f() handler marks the page as PG_hwpoison'ed. * It should have killed the process, but it can't isolate the page, * due to conditions such as extra pin, unmap failure, etc. Accessing * the page again may trigger another MCE and the process will be killed * by the m-f() handler immediately. * - * MF_DELAYED - The m-f() handler marks the page as PG_hwpoisoned'ed. - * The page is unmapped, and is removed from the LRU or file mapping. - * An attempt to access the page again will trigger page fault and the - * PF handler will kill the process. + * MF_DELAYED - The m-f() handler marks the page as PG_hwpoison'ed. + * It means the page was unmapped and partially isolated (e.g. removed from + * file mapping or the LRU) but full cleanup is deferred (e.g. the metadata + * for the memory, as in struct page/folio, is still referenced). Any + * further access to the page will result in the process being killed. * - * MF_RECOVERED - The m-f() handler marks the page as PG_hwpoisoned'ed. + * MF_RECOVERED - The m-f() handler marks the page as PG_hwpoison'ed. * The page has been completely isolated, that is, unmapped, taken out of * the buddy system, or hole-punched out of the file mapping. */ --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A3B73B19B4 for ; Tue, 2 Jun 2026 21:56:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437369; cv=none; b=cE1df1X4dR8SYbdLDASSwgtL1ltT5+83fIuTG4ysXYiR8lyh/4BGz1Cdhyj8NiQ6Ra3N3lCUYB6jNeO4yt93JM5MU3NbuJjILNddu/P31uTrDJr8/EDBHo8DCQKtuO/YuDnHLVao4mR8qWdUaWSn04k5c7MIpaM1f8RJJbuDTk8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437369; c=relaxed/simple; bh=5N67K9Z/FRb4/h9EDb/dnLOi0/eD6cgQqD0Ji0Ch9S8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=U/MSY6bWXtIb1ubVx6pOjF90DYkVBarE6mzeVIw45rW0oSxfJr3ECd0bgv03sMbgiClCrwcimdC4XBqAq6JO87MOq1KwOi8auzhngkjmf7uuc2icIXdvN0IQ51pVr0QOfXL9iiskP1d5QgedJT5VCQZi0HioKbmEap7Mdhuj0Vg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Sl/0/0KH; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Sl/0/0KH" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-8423f544944so2115779b3a.3 for ; Tue, 02 Jun 2026 14:56:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437367; x=1781042167; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=fr6YOv97JYHN5mxeGTDHXogTsZjg8n737cnMXei3iU4=; b=Sl/0/0KHt79BK4GkQ6Nv+ICqS3qDOXkVhLG1erz6ahCVp3VKMc6Yj4SSWMA3GHojfF hsNIeYRSzMY0O6vIvWwcNRVTQvU8lSHnReO8hnW2m3scC8Gh9S39mpckDMVkeUhDG0eA dSBed0mIA9C7R0uwNTUZiIioG4w/BhuhJfhl2q5UHdJQd3Drul1Q6Yg2FZLiAPr+9wqG QqI1lPOcw9t8sMnIMwnY9mX5TJ/+rFnb1o90MfEFvVpP3u3kpzb+LhCBUVmK+aN7vIM5 bkKkv+oZT38qUcA7rYDzkKRctm2J5Lxpg4zCUNZMpBFrT5Atva4edhCbdP0pmEoKOkFu B5nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437367; x=1781042167; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fr6YOv97JYHN5mxeGTDHXogTsZjg8n737cnMXei3iU4=; b=F8RLVFjhxYqaaqafVQQmmrlzJZgqZf/fzztSEmQRsVzYxVmp/+h0Safx39uUIg8NPX SbEPVydkZbrRxoDsiEMfcle07+WCS3qYXJ50+GjunTZVqxO7BR6FhWJRBHJNPH3xY7r/ KAPCevuJPdnGXGl9/Kq7yWYXiS3NcuMnC/M/MtmdH4Ir++H1El33U+eWLmiLYxamytGD g+7ZII7mVpGswDtyE6Jl0sYU1VIgQM3OOYWvwLIgm82pSp+q/HoLBMBNPDR1A7It/GAc hCAVd5Hr4Osh9/Edt5sCuq0LKYBCJxK+oqoZvUTW5X3Vc8IQXU52yI+tncW1lN+pqB9F Pdgg== X-Forwarded-Encrypted: i=1; AFNElJ/1nx4o+yTW9Ipic6o8eqMRfBSXxX/Y77Vkt5e4S8MGwDzwiSLiOQAsrWn+YbA/eiw9D9oA7IqUYaJqcKg=@vger.kernel.org X-Gm-Message-State: AOJu0YwxpIP1Lf77IERsUaSNB67ZvSe7/xss5m8iLfHLs5+y08WK/NDY iqqOLiSxIc52ezPnTlRbjdH3vnewdB4/fWtdUSBfwHaRTaUuU38hGDe69qA+MdnQ45CCzhCBjfH XPmUtaw== X-Received: from pfblc6.prod.google.com ([2002:a05:6a00:4f46:b0:835:4c30:5576]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2303:b0:835:4291:6978 with SMTP id d2e1a72fcca58-84284eed054mr629183b3a.41.1780437366524; Tue, 02 Jun 2026 14:56:06 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:42 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=1676; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=5N67K9Z/FRb4/h9EDb/dnLOi0/eD6cgQqD0Ji0Ch9S8=; b=L2txlDOSMZsr95mUVivDSrgEhoDq/mzN2uDs+L0Ji+lu2zWe5JuwFpcRNcm4/kttQfOvt/J4k N1cIM99c8fBCfTGaJcARyRhDonF5fnRnZi7h6lhqe8lIMDM6tkfeAqm X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-2-a5bc7db5a9b2@google.com> Subject: [PATCH v4 2/7] mm: memory_failure: Allow truncate_error_folio to return MF_DELAYED From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The .error_remove_folio a_ops is used by different filesystems to handle folio truncation upon discovery of a memory failure in the memory associated with the given folio. Currently, MF_DELAYED is treated as an error, causing "Failed to punch page" to be written to the console. MF_DELAYED is then relayed to the caller of truncate_error_folio() as MF_FAILED. This further causes memory_failure() to return -EBUSY, which then always causes a SIGBUS. This is also implies that regardless of whether the thread's memory corruption kill policy is PR_MCE_KILL_EARLY or PR_MCE_KILL_LATE, a memory failure with MF_DELAYED will always cause a SIGBUS. Update truncate_error_folio() to return MF_DELAYED to the caller if the .error_remove_folio() callback reports MF_DELAYED. Signed-off-by: Lisa Wang Acked-by: David Hildenbrand (Arm) --- mm/memory-failure.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2e53b3024391..3aff0c981fcd 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -941,10 +941,12 @@ static int truncate_error_folio(struct folio *folio, = unsigned long pfn, if (mapping->a_ops->error_remove_folio) { int err =3D mapping->a_ops->error_remove_folio(mapping, folio); =20 - if (err !=3D 0) + if (err =3D=3D MF_DELAYED) + ret =3D err; + else if (err !=3D 0) pr_info("%#lx: Failed to punch page: %d\n", pfn, err); else if (!filemap_release_folio(folio, GFP_NOIO)) - pr_info("%#lx: failed to release buffers\n", pfn); + pr_info("%#lx: Failed to release buffers\n", pfn); else ret =3D MF_RECOVERED; } else { --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A1373B3BF2 for ; Tue, 2 Jun 2026 21:56:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437369; cv=none; b=Vhhl0RSdPaf6PUmqZUZbffGRW4kSeS/ygCoi8a29MHtZOsCQJZIXby9Yn7yOvElPZ8GruZT92/qeDVMk94wf70jD1ohPVi9SXvYpj+gj71TWHxCi9DluRKQ9kfO5Jhd8tt3T3Z1APbk0ZiZhVHMkmjXVDiXAvTLt58zUdysXb1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437369; c=relaxed/simple; bh=lKnN7DFJZ1CI7P/ecQkLCNO048bsr9CmYWTgdYN3YTE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=o0bpa8/PuMUogIuUKwT9hwemqkCNn3JG4QAbR4V56dhSKQG2vbU85hqECKqR1k9d3vh6PC5aNs8IT7Sp5ul4rgS1+GiC7/SBeQ3T5+nDzfEdes9HaY9q2AmGiIooMSZefE8JVDB8tWgLEd5KrjH84xgG7oNagVtv+iJJ0FmdXMI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=DvVWIgnx; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DvVWIgnx" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c85a2c305d0so1764710a12.1 for ; Tue, 02 Jun 2026 14:56:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437368; x=1781042168; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=rZN9q1aHIL9jEfZ2MGsblaqq1tdWrGmvs3WWbS54Ns4=; b=DvVWIgnxsyNuzketKi/SgKDhpxcBt2BnRyiG4P836sdHvzEPQSRdOqE2rOur+ij+wP ENoNtMivk8tmSIe7hUMc/M0gk7zCve1merDV9vd74wWwTOxN/SBe5NeMblrJGnYVL/gv yCcBx2Y6S77F9oDqOCxAl8vMVnDXlzTFrNIEhA85bBj5KR6yYrY3VEgAdW1COaEwHyED cE5a+BeoCbrzLda10q2g3pWQ8+ndCE2d/EtRwc3RRTbJZxeIYO65pTx28WNiyBZlZAOA HRRm3Wlv3WZIh2RSK12IhkphJZfr3d6cGEugcXeAGxhrO4/Gr3W9TegBGBOSBVe7ME22 CvBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437368; x=1781042168; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rZN9q1aHIL9jEfZ2MGsblaqq1tdWrGmvs3WWbS54Ns4=; b=Hso20BsFezs+Y0IpWDDdRugxnuzREdRn89ZHROad6yY0/QgTgSMIiQInTXlufwlgT/ ZBrwwmu3JNNoz6+pBnjyd0UQqFvIbORxt/T5K2b/lmkXOXIR7hlcbbLmUzRtMjo1nU1D S0VTnzZ7G/LFRobv/kv+rIel0dxLX2OdeGcOmMswe95c0wLpsE7oY6OX5Cl/inXUB52X vptcFlsap5GIa4dfhC3w++fXnJMxi3awZSdAOhDv39AjqxXcVlVw4iRpFvfew5T7tl39 3HAaJH/cllAHTVhcGA+9dsMz2plUuCoY4Vdv73k37ki8a6148qiwtk6cB5n4fvIsd9fG /2bw== X-Forwarded-Encrypted: i=1; AFNElJ8/htDpM/RExyYBhqWLAhPkb45DCDhyNqRQrlu7wwZM0d8a6RFGUxGFi9/fs4lxeqKmqPqrETh3eIO3Zv8=@vger.kernel.org X-Gm-Message-State: AOJu0YzLoxTw4VOPiQnPJklvLIfEHDLsQr0upCADhd/X0ALnIvsWeGLY vxc7derHIY4D/c7n5QF3nhlAr33nb6KO+J629VFgNFfP7ohq8wBCp5I7NUUVAY/7acBQkObjWtz Uy1mCIg== X-Received: from pgip16.prod.google.com ([2002:a63:c150:0:b0:c85:735b:ca4a]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:86:b0:3b3:241f:66c6 with SMTP id adf61e73a8af0-3b49798aa66mr679970637.26.1780437367409; Tue, 02 Jun 2026 14:56:07 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:43 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=1598; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=lKnN7DFJZ1CI7P/ecQkLCNO048bsr9CmYWTgdYN3YTE=; b=rBFtlvQ/7oSruMlAmmH25URviunGUIx5ao2QShrhRD8hR/bXLQAXAsiiyW2j5GrH1cgJI/Yfg qeemVXBKeqQAGqv0RcyXpSDAWZQbBi9Qjq/DWMSLzr8eBsxskS4WHVg X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-3-a5bc7db5a9b2@google.com> Subject: [PATCH v4 3/7] mm: shmem: Update shmem handler to the MF_DELAYED definition From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable To align with the definition of MF_DELAYED, update shmem_error_remove_folio() to return MF_DELAYED. shmem handles memory failures but defers the actual file truncation. The function's return value should therefore be MF_DELAYED to accurately reflect the state. Currently, this logical error does not cause a bug, because: - For shmem folios, folio->private is not set. - As a result, filemap_release_folio() is a no-op and returns true. - This, in turn, causes truncate_error_folio() to incorrectly return MF_RECOVERED. - The caller then treats MF_RECOVERED as a success condition, masking the issue. The previous patch relays MF_DELAYED to the caller of truncate_error_folio() before any logging, so returning MF_DELAYED from shmem_error_remove_folio() will retain the original behavior of not adding any logs. The return value of truncate_error_folio() is consumed in action_result(), which treats MF_DELAYED the same way as MF_RECOVERED, hence action_result() also returns the same thing after this change. Signed-off-by: Lisa Wang Acked-by: David Hildenbrand (Arm) --- mm/shmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/shmem.c b/mm/shmem.c index b40f3cd48961..fd8f90540361 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -5207,7 +5207,7 @@ static void __init shmem_destroy_inodecache(void) static int shmem_error_remove_folio(struct address_space *mapping, struct folio *folio) { - return 0; + return MF_DELAYED; } =20 static const struct address_space_operations shmem_aops =3D { --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5F01D3B6C16 for ; Tue, 2 Jun 2026 21:56:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437371; cv=none; b=qR9qW0kJ7tq8miG/l0Kr38SzjegMn23P4RVhp13FxMPoW7IWZS2foCWhwYcB9VthU8Jz0w7Q/QfAu8FgSXMUSzPj5/NKnrcRAVY0/FwoHhtfbwwlpULF7wvLe0908qbRMIMxaWF+8nPuX0+J9PRSDzBoPhlbMlGZ0cbXr2VWo38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437371; c=relaxed/simple; bh=L7ogU8losQ0qpIb9WkPmejB/jf99wccvfK1O3XZC+fU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gOfgAdM4KUNVQroggjlBEbm3N3TWfUAbQ7YStKfi4x63MQTDV7OYgpPkWERoQAhIgIVDX2eGe394W1aZXl9xejlADOsoz6GjXAl6yJ7vcdLknSFA/Pghi+kNWyiTFTYdF3wDVVT3W9buLDWo5jHgiiNs19oAxpLgk03EEcZkQ1Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vxxzu1v6; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vxxzu1v6" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-8423f424d5bso2137936b3a.3 for ; Tue, 02 Jun 2026 14:56:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437369; x=1781042169; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=KByQd5D9+h5QFxoMWwNO5RLzWEY8UhS0HfK4sny+Tpg=; b=vxxzu1v663FMgvFjCiQBorScJe/yEJXg5NbwGXQdAcAeBPRlu+Iq98ee1ZNKWAav+X Ge83OV+lbvJdS/LJbGwOdVDTYYHW1ylNLBHRknwZ4rYGhZtbHWBcLU4cN0DqBrzgmvAW f+gZqHWw7yr4rLcr4D40+HmTQCxduto6HceHcR6NGbvshUuP1tPEUvCfE08/gqjPDDkd bHRWd21JxC9/UO7UDgVZJbkmyXuDrOMTk0A6eaFHuJFsBXcW/csQx2qsiYCvQJ6D7pVi uMZoYo+G05nr3+/cdoWwX+ZlRN5dKXYky1r06MVG5gCraQWUybyK97qG/yK4VRcmJLiC mY1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437369; x=1781042169; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=KByQd5D9+h5QFxoMWwNO5RLzWEY8UhS0HfK4sny+Tpg=; b=T4NiNiuBVWJIrUYjUS74nBPV3mAz2MyzGQMLaP7o6+PWVDgbSxWeXk+Guedak6QCqv g85ZvYSByZnCvs9FLWXrlwZdC8wvpjTwV/hRm+yQAOqcEUE0/M14WPYDfABngf7Ai19k spvLWr+tbIBq2oX1zVh3Ra2VKhOj5XGIvjefaQg4A5jvHA7zHYgC2vkAJxK+tBR3pcxd aWqsJ/dERfUCiDPCFhtMwPMPuDHo4Fv8mClWo4wOAJYem8xF7Lv+7FTUp4g5MR1kX12W J5KCFGYI7UCLe4UCcv2OQTCZOrLLO+DutYCTx8J6DXh17XeAui8qPyhWZ54c8RcqhDSI NA/g== X-Forwarded-Encrypted: i=1; AFNElJ+kf9II8BVu4zWj97+ltIUE3g6IVNufqZfWZ/yTSIjNNYG4fvcbVHg8s59fv4xcGryzoVNNHZbOnP70b90=@vger.kernel.org X-Gm-Message-State: AOJu0Ywcvqynq+zCADfwHqTSTnqoTdUMnil2GdSlYcIDvW+ud8S/q6dB OWQaducFY/Hfy9AttnIjNrhV6IKScdWsvZgd6Fs1BCzky4JW3PMLDLCzBo64/JQ3JUneiwEJ30S frgnDhA== X-Received: from pfde1.prod.google.com ([2002:aa7:8c41:0:b0:83f:2c4a:9b48]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2e88:b0:842:1ffc:55b4 with SMTP id d2e1a72fcca58-84284fbcdc1mr620204b3a.36.1780437368298; Tue, 02 Jun 2026 14:56:08 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:44 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=1543; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=L7ogU8losQ0qpIb9WkPmejB/jf99wccvfK1O3XZC+fU=; b=mJlrN/uELijxS3oSODYirh2cPSOXjWPWaEt54M4JmmDGGXz9+ycPvbHqL2O2MpPVcM6A3OFJ6 Nb+TJ/2LXYfArqbI0EbK+iXy8Yktn8BPbCJxnp/bU2rKdKwJHdiTrWI X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-4-a5bc7db5a9b2@google.com> Subject: [PATCH v4 4/7] mm: memory_failure: Generalize extra_pins handling to all MF_DELAYED cases From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Generalize extra_pins handling to all MF_DELAYED cases not only shmem_mapping. If MF_DELAYED is returned, the filemap continues to hold refcounts on the folio. Hence, take that into account when checking for extra refcounts. As clarified in an earlier patch, a return value of MF_DELAYED implies that the page still has elevated refcounts. Hence, set extra_pins to true if the return value is MF_DELAYED. This is aligned with the implementation in me_swapcache_dirty(), where, if a folio is still in the swap cache, ret is set to MF_DELAYED and extra_pins is set to true. Signed-off-by: Lisa Wang Acked-by: David Hildenbrand (Arm) --- mm/memory-failure.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 3aff0c981fcd..dcc56bedcb28 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1052,18 +1052,14 @@ static int me_pagecache_clean(struct page_state *ps= , struct page *p) goto out; } =20 - /* - * The shmem page is kept in page cache instead of truncating - * so is expected to have an extra refcount after error-handling. - */ - extra_pins =3D shmem_mapping(mapping); - /* * Truncation is a bit tricky. Enable it per file system for now. * * Open: to take i_rwsem or not for this? Right now we don't. */ ret =3D truncate_error_folio(folio, page_to_pfn(p), mapping); + + extra_pins =3D ret =3D=3D MF_DELAYED; if (has_extra_refcount(ps, p, extra_pins)) ret =3D MF_FAILED; =20 --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 679393BB678 for ; Tue, 2 Jun 2026 21:56:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437373; cv=none; b=EQ3d2PJIcgP50RthqoJXZwXKxDtawzvD2lQ+LtwwgoK3pSlENz664ii608S8U9pxJ3UodqmpLE8rPNRJtYnjsSIWIP9fmAozw9eLI32P6aYl2QATh9fZSOABTIzfKloNH6SUMKTojbrB9KWL+h55M0eF96TJg5fX6rp1bgEswSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437373; c=relaxed/simple; bh=ERS9n/C66Pu/CFQvxwGbdMovjGhnOPXiuO/oE3uJErA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YGiJVQ5XsNVUZ2StFhsCS0jRWH3TdfW/WgTPFjlGi6SfY38pP2aItMXxpg9aT1fdfdDwGMvG5Wsr/Sk5nzwuOH8YrFHinWw2cQ9IIlfvZbnIFr0iAzaqZY3DTppIrRS5OHyZ8Lwx4SRXxeVIamNodBMSeWRvO/ZGhFBidGehHYY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nShnSK9o; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nShnSK9o" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8425a9979e1so1605046b3a.2 for ; Tue, 02 Jun 2026 14:56:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437371; x=1781042171; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=PVk9IZSmeQ2ojFO9YakU9Uvjo4C4aXJx9fyWGDEUtbc=; b=nShnSK9oIb9Ut4FZZyGYi6Yjc5kBZyxSAQCdJ7pUvW/K/s181MOZZchyVg08bZvVF3 SDw9KLiPm26ENxV6pyZpAdSvFf6CUx7nMPcERLo3risyGpE5saU/6Wm7Q9gwenqZKRfQ tmdPObCZkEwzZBQ83aUL67OVKJ1tL5xtaQa65yb5U0R+XGPs1+OQ2IO3t1YPpN2roPjw f4WgKID5jxHMZCE9H2djohvREGNmSr2cHDT0lokgltf25RT6G9bybmtIkyrczHvlRIEj uoPXTt7OfBEZkTy8c9Yioa1cNyRsn3coVNnul3gYYM8szLd2JORdCRgC8GN0VXTrTQHB vynw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437371; x=1781042171; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=PVk9IZSmeQ2ojFO9YakU9Uvjo4C4aXJx9fyWGDEUtbc=; b=CZdbfuzaPsRGaamTB1FrlMFLhcbmwwqitDFVty/fMbggIAwz7qz+Y4XfcHC1R4awLn jO9XRtkuNDr9zrzbgzjCaxV7ed2Yul5Xj1OSe71Fh16YlKApsnRM5z54WVCPpHPe9vPS Xj4WTiRqFs362Sk42ZQV+Vu1I9eU6/x2GUj2LReVFafc4vrC8p7z8jIzO1C7I23290+2 Ezx50WSnWFHm3AfjV2vsg+f4iWX8uHTCk+xiXdbRHYDiEmSrUiSSiR+vctQ8FGT7/N8C nWz4g4YljVTOMUysqEs7osARC7P06Y5GtOHUxncbk14QIujIFs+D+HO+l9R6pYiM07ur NjoQ== X-Forwarded-Encrypted: i=1; AFNElJ++ASCTsjO6+s12NGWTfss15mYZKC3soKPE2wZTJB84G8QkusXdHC/8SXlsqSibdgT+wYKCIyC76uHsbWc=@vger.kernel.org X-Gm-Message-State: AOJu0YypXtIVlIeslFDMJkZfYWR5Ul73r1RXllajucbTSH5fMPgj7hbT WLlQAI92TW3H3sLjCx71l0Ku0APOAAc15Odm0wqZsU+9GImF6Z0l6kScHVWy5sRiXGbDtc9kOID ZCnhnlg== X-Received: from pfih3.prod.google.com ([2002:a05:6a00:2183:b0:842:2674:ba4e]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4aca:b0:842:6e9f:9d3 with SMTP id d2e1a72fcca58-84284f61a4cmr515894b3a.43.1780437370305; Tue, 02 Jun 2026 14:56:10 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:45 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=5052; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=ERS9n/C66Pu/CFQvxwGbdMovjGhnOPXiuO/oE3uJErA=; b=gl04QDueWfY5Mz/UMSTqZqEfqFAcCz8GPZv3rivd+R/DZnODOzzs+ShfEwjBLFL8XbbcCoOEl EknEUQ6a+G2AsmhRcocPCnKsgzKYa/SK4ZFwcl1YJ+i0YPAHx/u9JBc X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-5-a5bc7db5a9b2@google.com> Subject: [PATCH v4 5/7] mm: selftests: Add shmem into memory failure test From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a shmem memory failure selftest to test the shmem memory failure is correct after modifying shmem return value. Specifically, test the expected behavior under various scenarios combining page dirtiness (dirty vs clean) and failure types (hard vs soft): + Dirty + Hard: Trigger a SIGBUS on injection, and trigger another SIGBUS when reading the page again. + Dirty + Soft: No SIGBUS is triggered, and the original value can be read successfully. + Clean + Hard: No SIGBUS is triggered on injection, but trigger a SIGBUS when trying to read the page again. + Clean + Soft: No SIGBUS is triggered, and the page can be read successfully. Signed-off-by: Lisa Wang --- tools/testing/selftests/mm/memory-failure.c | 111 ++++++++++++++++++++++++= +++- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/mm/memory-failure.c b/tools/testing/se= lftests/mm/memory-failure.c index 3d9e0b9ffb41..43949b3b3565 100644 --- a/tools/testing/selftests/mm/memory-failure.c +++ b/tools/testing/selftests/mm/memory-failure.c @@ -30,9 +30,14 @@ enum result_type { MADV_HARD_ANON, MADV_HARD_CLEAN_PAGECACHE, MADV_HARD_DIRTY_PAGECACHE, + MADV_HARD_CLEAN_SHMEM, + MADV_HARD_DIRTY_SHMEM, MADV_SOFT_ANON, MADV_SOFT_CLEAN_PAGECACHE, MADV_SOFT_DIRTY_PAGECACHE, + MADV_SOFT_CLEAN_SHMEM, + MADV_SOFT_DIRTY_SHMEM, + READ_ERROR, }; =20 static jmp_buf signal_jmp_buf; @@ -165,17 +170,21 @@ static void check(struct __test_metadata *_metadata, = FIXTURE_DATA(memory_failure case MADV_HARD_CLEAN_PAGECACHE: case MADV_SOFT_CLEAN_PAGECACHE: case MADV_SOFT_DIRTY_PAGECACHE: - /* It is not expected to receive a SIGBUS signal. */ - ASSERT_EQ(setjmp, 0); - + case MADV_SOFT_DIRTY_SHMEM: /* The page content should remain unchanged. */ ASSERT_TRUE(check_memory(vaddr, self->page_size)); + case MADV_HARD_CLEAN_SHMEM: + case MADV_SOFT_CLEAN_SHMEM: + /* It is not expected to receive a SIGBUS signal. */ + ASSERT_EQ(setjmp, 0); =20 /* The backing pfn of addr should have changed. */ ASSERT_NE(pagemap_get_pfn(self->pagemap_fd, vaddr), self->pfn); break; case MADV_HARD_ANON: case MADV_HARD_DIRTY_PAGECACHE: + case MADV_HARD_DIRTY_SHMEM: + case READ_ERROR: /* The SIGBUS signal should have been received. */ ASSERT_EQ(setjmp, 1); =20 @@ -260,6 +269,20 @@ static int prepare_file(const char *fname, unsigned lo= ng size) return fd; } =20 +static int prepare_shmem(const char *fname, unsigned long size) +{ + int fd; + + fd =3D memfd_create(fname, 0); + if (fd < 0) + return -1; + if (ftruncate(fd, size) < 0) { + close(fd); + return -1; + } + return fd; +} + /* Borrowed from mm/gup_longterm.c. */ static int get_fs_type(int fd) { @@ -356,4 +379,86 @@ TEST_F(memory_failure, dirty_pagecache) ASSERT_EQ(close(fd), 0); } =20 +TEST_F(memory_failure, dirty_shmem) +{ + int fd; + char *addr; + int ret; + + fd =3D prepare_shmem("shmem-file", self->page_size); + if (fd < 0) + SKIP(return, "failed to open test shmem-file.\n"); + + addr =3D mmap(0, self->page_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr =3D=3D MAP_FAILED) { + close(fd); + SKIP(return, "mmap failed, not enough memory.\n"); + } + memset(addr, 0xce, self->page_size); + + prepare(_metadata, self, addr); + + ret =3D sigsetjmp(signal_jmp_buf, 1); + if (ret =3D=3D 0) + ASSERT_EQ(variant->inject(self, addr), 0); + + if (variant->type =3D=3D MADV_HARD) { + check(_metadata, self, addr, MADV_HARD_DIRTY_SHMEM, ret); + ret =3D sigsetjmp(signal_jmp_buf, 1); + if (ret =3D=3D 0) + FORCE_READ(*addr); + check(_metadata, self, addr, READ_ERROR, ret); + } else { + check(_metadata, self, addr, MADV_SOFT_DIRTY_SHMEM, ret); + } + + ASSERT_EQ(munmap(addr, self->page_size), 0); + + ASSERT_EQ(close(fd), 0); + cleanup(_metadata, self, addr); +} + +TEST_F(memory_failure, clean_shmem) +{ + int fd; + char *addr; + int ret; + + fd =3D prepare_shmem("shmem-file", self->page_size); + if (fd < 0) + SKIP(return, "failed to open test shmem-file.\n"); + + addr =3D mmap(0, self->page_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr =3D=3D MAP_FAILED) { + close(fd); + SKIP(return, "mmap failed, not enough memory.\n"); + } + FORCE_READ(*addr); + + prepare(_metadata, self, addr); + + ret =3D sigsetjmp(signal_jmp_buf, 1); + if (ret =3D=3D 0) + ASSERT_EQ(variant->inject(self, addr), 0); + + if (variant->type =3D=3D MADV_HARD) { + check(_metadata, self, addr, MADV_HARD_CLEAN_SHMEM, ret); + ret =3D sigsetjmp(signal_jmp_buf, 1); + if (ret =3D=3D 0) + FORCE_READ(*addr); + check(_metadata, self, addr, READ_ERROR, ret); + } else { + /* Test the address accessability without check_memory(). */ + FORCE_READ(*addr); + check(_metadata, self, addr, MADV_SOFT_CLEAN_SHMEM, ret); + } + + ASSERT_EQ(munmap(addr, self->page_size), 0); + + ASSERT_EQ(close(fd), 0); + cleanup(_metadata, self, addr); +} + TEST_HARNESS_MAIN --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6002D3BE17C for ; Tue, 2 Jun 2026 21:56:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437374; cv=none; b=jGtZLW9xOjeTq7hd7UPFg1mBp58NxOQ6xKonTa6a4t2uSjCe9oU0pqxE/Mb3BwOmDw6e4YH2rKhPH1uqr7UoJjBpLnQ29ClFenW8w2MAvXil54qLzmswrj9qfvvWCI+H1kVlbgGQCUlPapfrqZCiLoOfqCsKDqOT16B0BRPZyUg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437374; c=relaxed/simple; bh=WaZ1Bk+9kgTkd/esD3bnBTyyH1p1bTgRbaMwG3iAxos=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qKlb25taoxWhKA6NMTFM1QyyEwVFIbNhm6YcLWfoXJbma1W/9SbwiMqjta+l9pGwO1VNyYEKyoPhITa6R0YxRfacMjFtmge43rWMp6r/uUmEHuPrCzVbDxcnTWJZGtK0nsO8LQ7HdzoZxKJmuT5aDbLU33thQ8O5+RJ+kohmc4Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fIFHTx1q; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fIFHTx1q" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-36bd4146cb2so37065a91.1 for ; Tue, 02 Jun 2026 14:56:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437372; x=1781042172; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=y6mFy3Z3SyWCwRgM9+haQtSvrdq+maoP5fqUQtJx+eo=; b=fIFHTx1qqf6q/q7OSVb2egdYixGtILDEAsY2wZmyFZJDKmlw2AP7hz7kwK9JRBth5y KnE4n15zFlOIYFZciYbUHnSMG1kp8Z1hNMQxD1ilzyEysK0qzSPCFiXFF+2FcseEucDP daSF5Vzk038BUKTM+vtDxKhKWMks0jQIZ+s+cOwzEZteMOSasAquoPMoe8aB7SXuRbA4 rB1hTcPf1ubh/kx5Np290SzeeYqTBmnpCXNuOx3c2CjWYXggPvCa5BAQbuGm1El6mA9m H17W/lFeOkkt3XRDHsHIL3dsEVnIGauM5D6dZcLmWaVFpoEQ9a2vbm349ZqmCbsWrpWn vP8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437372; x=1781042172; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=y6mFy3Z3SyWCwRgM9+haQtSvrdq+maoP5fqUQtJx+eo=; b=tGv+yrdGbeoiuet0jQ9H+pEqIqapXD1JciU7o0LXZ2y+nJwnOyZOk0+W/ie/wMY45v RbRO27JXUsTODj0GeVSwiKLSu5OmfFK+NJ8tDR9faJMLl2eDKxf6aLLtYzejij8Blyis cgR26D1KtWTB72owZD+tWFoeVgQsTAztvleuCTOTNaowbia2xsvjCbVaVhRphvTPlwrC StoF1CPa5Fkj6wjRGgQVAv/MZ0mCMERvHia8ehQVVP6cfI0uBhamG2oWs/lxR9MX4hZG GfmCS7GLthy4MsKQqFIOvkK3UTRTa5oGiEA/bo9/PCuatL4es4JyWDQr0+oFVk30p+i8 QcOw== X-Forwarded-Encrypted: i=1; AFNElJ+fFR3nAMOBkqkYwG8vF2U43YGoAe8QrJGguS8BXDnYV6d4ZLlwoksmqUVY2kwnTd0EDCmympxSG1n7ZCI=@vger.kernel.org X-Gm-Message-State: AOJu0YzCuCVIWlIb7tPoFUOC+bi5EuNIaZ4o/A8F7vtTjdihbF+4queH 6m1u73M1ZIvSW14mPZt11Mmhr7wPutBGLvyW8mYHO/1n5xLvqCltEW1JFVbNiQ+HPnd35WqjJ2E Abl1AtQ== X-Received: from pjpo18.prod.google.com ([2002:a17:90a:9f92:b0:36b:8abb:86c4]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1649:b0:36b:769c:c037 with SMTP id 98e67ed59e1d1-36e38a5ad7dmr345225a91.5.1780437371243; Tue, 02 Jun 2026 14:56:11 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:46 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=11908; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=WaZ1Bk+9kgTkd/esD3bnBTyyH1p1bTgRbaMwG3iAxos=; b=SqAeAWv52UAEPcGkYpzMv8o5FzSIWZT3SZsD5NXiIh5u8IVpFEgGcT6WhIU7Nbk8K5YYCl77a 5qnW7u/sLqaBTavQ2v5y2TwTStw+KcVVyLhpWWs2BMC6Z/Ltn+6hZu5 X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-6-a5bc7db5a9b2@google.com> Subject: [PATCH v4 6/7] KVM: selftests: Add the guest_memfd memory failure test From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable After modifying truncate_error_folio(), we expect memory_failure() will return 0 instead of MF_FAILED. Also, we want to make sure memory_failure() signaling function is same. Test that memory_failure() returns 0 for guest_memfd, where .error_remove_folio() is handled by not actually truncating, and returning MF_DELAYED. In addition, test that SIGBUS signaling behavior is not changed before and after this modification. There are two kinds of guest memory failure injections - madvise or debugfs. When memory failure is injected using madvise, the MF_ACTION_REQUIRED flag is set, and the page is mapped and dirty, the process should get a SIGBUS. When memory is failure is injected using debugfs, the KILL_EARLY machine check memory corruption kill policy is set, and the page is mapped and dirty, the process should get a SIGBUS. Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/Makefile.kvm | 2 + .../kvm/guest_memfd_memory_failure_test.c | 336 +++++++++++++++++= ++++ 2 files changed, 338 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index fdec90e85467..9409ded6cbce 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -146,6 +146,7 @@ TEST_GEN_PROGS_x86 +=3D access_tracking_perf_test TEST_GEN_PROGS_x86 +=3D coalesced_io_test TEST_GEN_PROGS_x86 +=3D dirty_log_perf_test TEST_GEN_PROGS_x86 +=3D guest_memfd_test +TEST_GEN_PROGS_x86 +=3D guest_memfd_memory_failure_test TEST_GEN_PROGS_x86 +=3D hardware_disable_test TEST_GEN_PROGS_x86 +=3D memslot_modification_stress_test TEST_GEN_PROGS_x86 +=3D memslot_perf_test @@ -186,6 +187,7 @@ TEST_GEN_PROGS_arm64 +=3D coalesced_io_test TEST_GEN_PROGS_arm64 +=3D dirty_log_perf_test TEST_GEN_PROGS_arm64 +=3D get-reg-list TEST_GEN_PROGS_arm64 +=3D guest_memfd_test +TEST_GEN_PROGS_arm64 +=3D guest_memfd_memory_failure_test TEST_GEN_PROGS_arm64 +=3D memslot_modification_stress_test TEST_GEN_PROGS_arm64 +=3D memslot_perf_test TEST_GEN_PROGS_arm64 +=3D mmu_stress_test diff --git a/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c = b/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c new file mode 100644 index 000000000000..6c8032d390ae --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c @@ -0,0 +1,336 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright Intel Corporation, 2026 + * + * Author: Ackerley Tng + * Author: Lisa Wang + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "kvm_util.h" +#include "test_util.h" +#include "kselftest_harness.h" + +static size_t page_size, total_size; + +enum memory_failure_injection_method { + MF_INJECT_DEBUGFS, + MF_INJECT_MADVISE, +}; + +FIXTURE(guest_memfd_failure) { + struct kvm_vm *vm; + int fd; + unsigned long poisoned_pfn; +}; + +FIXTURE_VARIANT(guest_memfd_failure) { + enum memory_failure_injection_method method; + int kill_config; + bool map_page; + bool dirty_page; + bool sigbus_expected; + int return_code; +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_early_dirty) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_EARLY, + .map_page =3D true, + .dirty_page =3D true, + .sigbus_expected =3D true, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_early_clean) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_EARLY, + .map_page =3D true, + .dirty_page =3D false, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_early_unmapped) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_EARLY, + .map_page =3D false, + .dirty_page =3D true, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_late_dirty) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_LATE, + .map_page =3D true, + .dirty_page =3D true, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_late_clean) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_LATE, + .map_page =3D true, + .dirty_page =3D false, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, debugfs_late_unmapped) { + .method =3D MF_INJECT_DEBUGFS, + .kill_config =3D PR_MCE_KILL_LATE, + .map_page =3D false, + .dirty_page =3D true, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, madvise_dirty) { + .method =3D MF_INJECT_MADVISE, + .kill_config =3D PR_MCE_KILL_DEFAULT, + .map_page =3D true, + .dirty_page =3D true, + .sigbus_expected =3D true, + .return_code =3D 0, +}; + +FIXTURE_VARIANT_ADD(guest_memfd_failure, madvise_clean) { + .method =3D MF_INJECT_MADVISE, + .kill_config =3D PR_MCE_KILL_DEFAULT, + .map_page =3D true, + .dirty_page =3D false, + .sigbus_expected =3D false, + .return_code =3D 0, +}; + +FIXTURE_SETUP(guest_memfd_failure) +{ + self->vm =3D NULL; + self->fd =3D -1; + self->poisoned_pfn =3D 0; +} + +static void write_memory_failure(unsigned long pfn, bool mark, int expecte= d_return_code) +{ + char path[PATH_MAX]; + char *filename; + char buf[20]; + int ret; + int len; + int fd; + + filename =3D mark ? "corrupt-pfn" : "unpoison-pfn"; + snprintf(path, PATH_MAX, "/sys/kernel/debug/hwpoison/%s", filename); + + fd =3D open(path, O_WRONLY); + TEST_ASSERT(fd >=3D 0, "Failed to open %s.", path); + + len =3D snprintf(buf, sizeof(buf), "0x%lx\n", pfn); + if (len < 0 || (unsigned int)len >=3D sizeof(buf)) + TEST_ASSERT(0, "snprintf failed or truncated."); + + ret =3D write(fd, buf, len); + if (expected_return_code =3D=3D 0) { + /* + * If the memory_failure() returns 0, write() should be successful, + * which returns how many bytes it writes. + */ + TEST_ASSERT(ret > 0, "Writing memory failure (path: %s) failed: %s", pat= h, + strerror(errno)); + } else { + TEST_ASSERT_EQ(ret, -1); + /* errno is memory_failure() return code. */ + TEST_ASSERT_EQ(errno, expected_return_code); + } + + close(fd); +} + +static void mark_memory_failure(unsigned long pfn, int expected_return_cod= e) +{ + write_memory_failure(pfn, true, expected_return_code); +} + +static void unmark_memory_failure(unsigned long pfn, int expected_return_c= ode) +{ + write_memory_failure(pfn, false, expected_return_code); +} + +FIXTURE_TEARDOWN(guest_memfd_failure) +{ + if (self->fd >=3D 0) + close(self->fd); + if (self->vm) + kvm_vm_free(self->vm); + if (self->poisoned_pfn) + unmark_memory_failure(self->poisoned_pfn, 0); +} + +static unsigned long addr_to_pfn(void *addr) +{ + const uint64_t pagemap_pfn_mask =3D BIT(54) - 1; + const uint64_t pagemap_page_present =3D BIT(63); + uint64_t page_info; + ssize_t n_bytes; + int pagemap_fd; + + pagemap_fd =3D open("/proc/self/pagemap", O_RDONLY); + TEST_ASSERT(pagemap_fd >=3D 0, "Opening pagemap should succeed."); + + n_bytes =3D pread(pagemap_fd, &page_info, 8, (uint64_t)addr / page_size *= 8); + TEST_ASSERT(n_bytes =3D=3D 8, "pread of pagemap failed. n_bytes=3D%ld", n= _bytes); + + close(pagemap_fd); + + TEST_ASSERT(page_info & pagemap_page_present, "The page for addr should b= e present"); + return page_info & pagemap_pfn_mask; +} + +static void do_test_memory_failure(FIXTURE_DATA(guest_memfd_failure) * sel= f, + const FIXTURE_VARIANT(guest_memfd_failure) * variant) +{ + unsigned long memory_failure_pfn; + char *memory_failure_addr; + char *mem; + int ret; + + mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, self->= fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + memory_failure_addr =3D mem + page_size; + if (variant->dirty_page) + *memory_failure_addr =3D 'A'; + else + READ_ONCE(*memory_failure_addr); + + /* Fault in page to read pfn, then unmap page for testing if needed. */ + memory_failure_pfn =3D addr_to_pfn(memory_failure_addr); + if (!variant->map_page) + madvise(memory_failure_addr, page_size, MADV_DONTNEED); + + ret =3D prctl(PR_MCE_KILL, PR_MCE_KILL_SET, variant->kill_config, 0, 0); + TEST_ASSERT_EQ(ret, 0); + + self->poisoned_pfn =3D memory_failure_pfn; + + ret =3D 0; + switch (variant->method) { + case MF_INJECT_DEBUGFS: { + /* DEBUGFS injection handles return_code test inside the mark_memory_fai= lure(). */ + if (variant->sigbus_expected) + TEST_EXPECT_SIGBUS(mark_memory_failure(memory_failure_pfn, + variant->return_code)); + else + mark_memory_failure(memory_failure_pfn, variant->return_code); + break; + } + case MF_INJECT_MADVISE: { + /* + * MADV_HWPOISON uses get_user_pages() so the page will always + * be faulted in at the point of memory_failure() + */ + if (variant->sigbus_expected) + TEST_EXPECT_SIGBUS(ret =3D madvise(memory_failure_addr, + page_size, MADV_HWPOISON)); + else + ret =3D madvise(memory_failure_addr, page_size, MADV_HWPOISON); + + if (variant->return_code =3D=3D 0) + TEST_ASSERT(ret =3D=3D variant->return_code, "Memory failure failed. Er= rno: %s", + strerror(errno)); + else { + /* errno is memory_failure() return code. */ + TEST_ASSERT_EQ(errno, variant->return_code); + } + break; + } + default: + TEST_FAIL("Unhandled memory failure injection method %d.", variant->meth= od); + } + + TEST_EXPECT_SIGBUS(READ_ONCE(*memory_failure_addr)); + TEST_EXPECT_SIGBUS(*memory_failure_addr =3D 'A'); + + ret =3D munmap(mem, total_size); + TEST_ASSERT(!ret, "munmap() should succeed."); + + ret =3D fallocate(self->fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0= , total_size); + TEST_ASSERT(!ret, "Truncate the entire file (cleanup) should succeed."); + + ret =3D prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_DEFAULT, 0, 0); + TEST_ASSERT_EQ(ret, 0); + + unmark_memory_failure(memory_failure_pfn, 0); + self->poisoned_pfn =3D 0; +} + +TEST_F(guest_memfd_failure, test_memory_failure) +{ + unsigned long vm_types, vm_type; + + total_size =3D page_size * 4; + + vm_types =3D kvm_check_cap(KVM_CAP_VM_TYPES); + if (!vm_types) + vm_types =3D BIT(VM_TYPE_DEFAULT); + + for_each_set_bit(vm_type, &vm_types, BITS_PER_TYPE(vm_types)) { + uint64_t flags; + + self->vm =3D vm_create_barebones_type(vm_type); + flags =3D vm_check_cap(self->vm, KVM_CAP_GUEST_MEMFD_FLAGS); + if (!(flags & GUEST_MEMFD_FLAG_INIT_SHARED)) { + kvm_vm_free(self->vm); + self->vm =3D NULL; + continue; + } + + self->fd =3D vm_create_guest_memfd(self->vm, total_size, + GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SHARED); + ASSERT_GE(self->fd, 0) TH_LOG("vm_create_guest_memfd failed"); + + do_test_memory_failure(self, variant); + + close(self->fd); + self->fd =3D -1; + kvm_vm_free(self->vm); + self->vm =3D NULL; + } +} + +static bool can_inject_memory_failure(void) +{ + int fd; + + fd =3D open("/sys/kernel/debug/hwpoison/corrupt-pfn", O_WRONLY); + if (fd < 0) + return false; + + close(fd); + return true; +} + +int main(int argc, char **argv) +{ + TEST_REQUIRE(kvm_check_cap(KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLAG_= INIT_SHARED); + __TEST_REQUIRE(can_inject_memory_failure(), + "Insufficient permissions to access hwpoison debugfs (requires CA= P_SYS_ADMIN / root))"); + page_size =3D getpagesize(); + + return test_harness_run(argc, argv); +} --=20 2.54.0.1013.g208068f2d8-goog From nobody Mon Jun 8 05:25:24 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2325D3BFE31 for ; Tue, 2 Jun 2026 21:56:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437374; cv=none; b=VXtCFwZG4WjfbuvrN/NHatVzn97P4Sg7PFWOPZovutFztTK5kWDj/eO8xC2Rj0blMlLw989Hm8bz8TIjRY1ONvkRlsyG4hWcOmYe2JPKVBG4V5wOAfSvH9FUNOtQcmQ6PUyrRzTRd9v7+pXmR/BVSfdzqGJxpZzxU9IWYKov21c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780437374; c=relaxed/simple; bh=uanUhuG5chBI7iGRiYb/NQJAUXfg811Uv7P0B8yjofM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VhzXh82N96MYGVONA1/gLxAZl8d0+EdyizH1tHE3cLCeEI0BrA/lREzANTgtrgv345KyDQ2q/U2BpAjP3F2C02OUZ537iZbHcEQVUxn58FsNeTMbn6tqhIiRYWjfhMxBN86b88I6isiXXHXxBadfWErb1UYgF3g8KYhxorLu0JQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YsrltzuQ; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YsrltzuQ" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-36b7f696b40so4918273a91.1 for ; Tue, 02 Jun 2026 14:56:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780437372; x=1781042172; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ZQ6ZTIKmnZDIm2PqykNUkTYiLD4CQXsPT3VeVYf4kfY=; b=YsrltzuQg6r8vvBGRRQl6NBQBolG2j3VmiiuPv7n27jc14LhiwcvNwQ+HYUdq1+gNJ makdmZA9+8PncYMuIlvRbklo0eK8MMZYPrPHR2XZO5wzS+cJRwEU90o4K9RNFX0MdBuj /t+azHEOfiVUbEW8/k/LYvwxdFQIQvvsjZbNIt6OxfxV/rfgIKa3LMCnE8tL9H9nPPzR jW7hsgBcCOB2rkIL0EKC/goPffDx0MPHYw9V/4t2eCBkV6jdX8ktPbRy/WH7uikUDQea DyuOSwOIrQIhpzFakfwFGc2F+inU2FCQZZarSZ19KaNuWsnDuan6xBIsapaaBq0atBDF Sg/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780437372; x=1781042172; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZQ6ZTIKmnZDIm2PqykNUkTYiLD4CQXsPT3VeVYf4kfY=; b=k/Ad5hbj2eDjq2ROM8JswI+AfzGom6na58j6j38ln7HGZs76vl0FUA44tCoYxlTOQM OjBiSuavXtqKKtQmb/HjnnJ3VhCfB/pWsadgq6YOcL54hLGzccF3FZfprvBJrKKgRcIP 0Lr4Q+nyuFOT6w6rkIpcxO+5IAdBMHU9Cl4YFuAnfuVzA0kbWSqRViRQW1t5dVvk8vph RdCzpQN2e+Be2Evo6WKm3ibN3xF3PChEqL0Ef1cwJWuP21dlDs2Qm/uDR7tGuhJVqnj/ B4ebn+F73tB322XBeDFDKYu6B3i5tYf7o9Pdzjr8e+69NUd3Rsj31yYPcW+cq4wYXgkp 6teQ== X-Forwarded-Encrypted: i=1; AFNElJ8+QkVZShre5m+lNXBoDnV46q7FHuKpTI6FO6FZvMn9EqBhS/0DulMdUtkqnYUztP+xXdXMOxK0kPBQTeI=@vger.kernel.org X-Gm-Message-State: AOJu0YxCfWDklJ4041TH7uSEMJ+Cyp+Xzi2UlOuBgLgl5dAPlJGZDGms iT1jOT8vVHlq1nMQ7GAZ3ra5aA5SFqi16SxRRWpbqxuyk0jEYV0jo+1tRf/g4Sa/31xRExU8rgR 0rDuEEA== X-Received: from pju15.prod.google.com ([2002:a17:90a:d4f:b0:36b:89e6:3ee5]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3e4e:b0:35f:b647:d98a with SMTP id 98e67ed59e1d1-36e30552788mr686479a91.5.1780437372149; Tue, 02 Jun 2026 14:56:12 -0700 (PDT) Date: Tue, 02 Jun 2026 21:55:47 +0000 In-Reply-To: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260602-memory-failure-mf-delayed-fix-v4-0-a5bc7db5a9b2@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1780437363; l=3092; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=uanUhuG5chBI7iGRiYb/NQJAUXfg811Uv7P0B8yjofM=; b=onjoJh2jwfvgE5J9KsFufxaaM/BBUoZUbER0Iv4yiEZbnHtSt3LZi3VagZRC8gVSTIjS36l5y WirOgE+fH18CGioPV6fp/j5ijMuy/gRGi7+ecGc+dvu8oYZZXqd01R3 X-Mailer: b4 0.14.3 Message-ID: <20260602-memory-failure-mf-delayed-fix-v4-7-a5bc7db5a9b2@google.com> Subject: [PATCH v4 7/7] KVM: selftests: Test guest_memfd behavior with respect to stage 2 page tables From: Lisa Wang To: Miaohe Lin , Naoya Horiguchi , Andrew Morton , Paolo Bonzini , Shuah Khan , Hugh Dickins , Baolin Wang , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: rientjes@google.com, seanjc@google.com, ackerleytng@google.com, vannapurve@google.com, michael.roth@amd.com, jiaqiyan@google.com, tabba@google.com, dave.hansen@linux.intel.com, Lisa Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Test that + memory failure handling results in unmapping of bad memory from stage 2 page tables, hence requiring faulting on next guest access + when the guest tries to fault a poisoned page from guest_memfd, the userspace VMM informed with EHWPOISON Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Lisa Wang --- .../kvm/guest_memfd_memory_failure_test.c | 66 ++++++++++++++++++= ++++ 1 file changed, 66 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c = b/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c index 6c8032d390ae..e6f4c327bd5a 100644 --- a/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_memory_failure_test.c @@ -24,6 +24,7 @@ #include "kvm_util.h" #include "test_util.h" #include "kselftest_harness.h" +#include "ucall_common.h" =20 static size_t page_size, total_size; =20 @@ -313,6 +314,71 @@ TEST_F(guest_memfd_failure, test_memory_failure) } } =20 +static void __guest_code_read(uint64_t gpa) +{ + uint8_t *mem =3D (uint8_t *)gpa; + + READ_ONCE(*mem); + GUEST_SYNC(0); + READ_ONCE(*mem); + GUEST_DONE(); +} + +static void guest_read(struct kvm_vcpu *vcpu, int expected_errno) +{ + if (expected_errno) { + TEST_ASSERT_EQ(_vcpu_run(vcpu), -1); + TEST_ASSERT_EQ(errno, expected_errno); + } else { + vcpu_run(vcpu); + TEST_ASSERT_EQ(get_ucall(vcpu, NULL), UCALL_SYNC); + } +} + +TEST_F(guest_memfd_failure, test_memory_failure_guest) +{ + const uint64_t gpa =3D SZ_4G; + const int slot =3D 1; + + unsigned long memory_failure_pfn; + struct kvm_vcpu *vcpu; + uint8_t *mem; + + /* Limit guest test execution to a single variant to avoid redundant runs= . */ + if (variant->method !=3D MF_INJECT_DEBUGFS || + variant->kill_config !=3D PR_MCE_KILL_EARLY || + !variant->map_page || !variant->dirty_page) + return; + + self->vm =3D __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, = __guest_code_read); + vcpu_args_set(vcpu, 1, gpa); + + self->fd =3D vm_create_guest_memfd(self->vm, self->vm->page_size, + GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED); + vm_set_user_memory_region2(self->vm, slot, KVM_MEM_GUEST_MEMFD, gpa, + self->vm->page_size, NULL, self->fd, 0); + + mem =3D mmap(NULL, self->vm->page_size, PROT_READ | PROT_WRITE, + MAP_SHARED, self->fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + virt_pg_map(self->vm, gpa, gpa); + + /* Fault in page to read pfn, then unmap page for testing. */ + READ_ONCE(*mem); + + memory_failure_pfn =3D addr_to_pfn(mem); + munmap(mem, self->vm->page_size); + + /* Fault page into stage2 page tables. */ + guest_read(vcpu, 0); + + self->poisoned_pfn =3D memory_failure_pfn; + mark_memory_failure(memory_failure_pfn, 0); + + guest_read(vcpu, EHWPOISON); +} + static bool can_inject_memory_failure(void) { int fd; --=20 2.54.0.1013.g208068f2d8-goog