From nobody Sun Jun 21 02:30:14 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 052343D7D9A for ; Wed, 8 Apr 2026 17:26:11 +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=1775669173; cv=none; b=PLRPMv0NhpVgfG1Ya2Ne6brXXbTWBvdAqGvoDhH026hyQvhUcKOOJnJjf6+WkF7VJNpgGrXgANeB/6sBM51HsOLEIwOJGG0Mr7d7MAZ5aMPqggMkt+22CXCpF9b3U+6CiAICrCkl3nucRYNfm7hx52mPwfioZ9NxXZYZ0X5MSVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669173; c=relaxed/simple; bh=tCUAER8XAOCDEwqKOePrak2HLKwWUrDfij0Iac7Dp58=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=iKBbfjJOgwUBZnd5TUpsORniiSJafiLi2nfjmeEVmprPWJE8usVviw8mpzfOTiK+U9j1Eu6+eCiBhn9l4p9m2c0l7TpuHM2iIA9gK7l1i+KxrVtaio+E3d+Dq7k+u1HzYqeKqRi+rO4bwAScgI5L4CdMjjpJ3In3ONFK5+D8WX8= 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=GXzzrlOB; 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="GXzzrlOB" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82cf084fe58so30457b3a.1 for ; Wed, 08 Apr 2026 10:26:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669171; x=1776273971; 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=i55NDozws+Qi2zC4BPESxJxfrP5x0dQcJH7CMgcHTvw=; b=GXzzrlOBkBKi2Fkrvfxbn4IUUV1j3G+8+tfLRE7Mz1LP2PCVgByg9v6S6h9EKK1nIO B8uaRqGhcn0Lur1eu6WM70vBWN5t85w5djkltLdHpyD8Er5ut1p8sKJ/iRI55r9l8BlA SQiCYY2blS8cfjbHSZ0vDk9pbbm9TxWGLgMTC3+OaPz80WnT9x0LexLv9/JbX+QvBwF5 FTL31niw8r5GTdZisfXIVlEVUwqKshzUZHBdz0RjN5LcGsgOKIw4UMyDqt4pmPqjqz+r sFAe9pTBO7D07zSwUeiKT6wHIoAJAme8CTLyW4UWr5bzwSCdvXs15L1HuiOl+czg0YSt 96wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669171; x=1776273971; 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=i55NDozws+Qi2zC4BPESxJxfrP5x0dQcJH7CMgcHTvw=; b=s9caSUOnmCLerimq5F35iHk1EL7JZpyD7Mx8GUJpBZUDmB01EReL5TK/Wa+5ND/CwA PXIpucUhEFZvIvnakl1rB3WzwKvXncR00w9GP7o/xiuYwscNWcUDHVmXpLJ2GpbF7JvA IwhZ501SrRCQhG5uTAq1fMUXxLV21cb1tW41Q7hV2KaRfyzd1SYReyTejOKKBGZ3RDCW PXr1qOc/jCV2bg2eY1vA5pZacE4mD1QplrAl1p/7UFg8w78UVU6WQYWZvebAZFigjAed Ul5ju3tjOKnjOT3Zz8/BHA5AlMNpnzjLEsNQsdWXiPNxjpGxjcPOj5D8969jFtzF8jEi AK4g== X-Forwarded-Encrypted: i=1; AJvYcCW/3m415KWnV90xCtjrz0NgGUJiYmnqxkqRQ7QVHQveoYJ+LMe65zZFcs3+ngKKIxoDoksWK3o2UmCgbnA=@vger.kernel.org X-Gm-Message-State: AOJu0YwjN4dU6ZJ0pkaSx1v4AeNOnTKs1Ubc16Kl+8C/MoQihtKwkGo7 HmSDy0M3uprXwNvLGfHSsFRvS8uU0UzCA3BrrwRSRCZ7dfUnmSDKS6Zo59jBCF69sFjVwYA9vzs OREhDXA== X-Received: from pfx30.prod.google.com ([2002:a05:6a00:a45e:b0:82a:6bbe:c0dd]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:6c9e:b0:821:81ef:5de8 with SMTP id d2e1a72fcca58-82d0da4680bmr20598726b3a.12.1775669171123; Wed, 08 Apr 2026 10:26:11 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:42 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=2390; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=tCUAER8XAOCDEwqKOePrak2HLKwWUrDfij0Iac7Dp58=; b=buXgD0W2k9Th2g3W9/TO/6Ez7VzKspI14jx1Q91h6/d29lN7r5B3H1yOm0SeG+gIqR4hNTHhQ 1k5jFUJpx39BlVEg10kkWolRIctuvMivfofoisa1Uv7IEef0KJmZW7e X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-1-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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 --- 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.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.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 AA1DA3D9022 for ; Wed, 8 Apr 2026 17:26:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669176; cv=none; b=JGFjgNARV5cPorFm/N7zNvjc9OAoAxV/juj9gQwbLDOvd+9bPw+TMQNesgXURR3kAlGl8SWWkbcJbner+ytPZNwEUjYhJIJBpgCTOmGLaRc5HSKu7QiRUET6DjA7+qMwKLDEEzyf6xBcjkVOGKuI0at6nEFPlz84Y775UEFhdSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669176; c=relaxed/simple; bh=ko2N+a8bmW24/l4K/at+f1QHh6ITswHFEAcwikZm7g8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VUNJee3gAmcO9iiEaFnKMKga6Mn0VTokjRzkd+63Pi+txW5g0XRv/REqNGbzZ79Rkwp0tNCRokZ+E1XzbKwNJhCZX9zPajLsd5/wOC5nCD/8UCKixA4ZYdI94e8fK++LeYCSSHWrk/+6wdfd4tnqGxgdze+LRwZ/UHwWDvLCDsU= 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=aOqJhO9M; arc=none smtp.client-ip=209.85.214.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="aOqJhO9M" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b23af7d7e8so2367005ad.0 for ; Wed, 08 Apr 2026 10:26:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669173; x=1776273973; 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=pPHYp8i7UG9LnNHrv4AlFKYXMB/HImkpdvlYCa2u69A=; b=aOqJhO9MvY2+lVizoNWvmo9CmAb6H0Mf/FePghLYJ5p8VhX55Yc0qmBnedRc6w72Os FiifERRatnO5PwBVSS1qr7HHAI5guMT4KhMpuboOGhdA5BF/sbnkl/uaC1imBUC+CjkW /cxo0frtMyznTBovnntgJJcsNucKGsVquce7Phq/Fhf6tMZfANNMm8V7Aql1CPjDIR/c cV7mgLITMKFOuCPdBGvt1PjChrf1BGojwMiHBgje/hyam4j6z2kDZzE6hh0u601mJH44 P5iGmQZY84BgGp52QabTYEi5wvWw51emcsx+6b22ClcgPFS6efpCgncx90wMASLtgpF8 wmUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669173; x=1776273973; 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=pPHYp8i7UG9LnNHrv4AlFKYXMB/HImkpdvlYCa2u69A=; b=E5xXRPhqfIkBe6+pQ2/5n6HXaXKBotUCsv3lOwCyA293t27KvtYVGnxarv9QoYTDDE ff4ybGZuCqbhYy8HAonFb/FaG/r4PXHpDg423RgcyHI1kvfUuGiStNtkwAd65LE+M4+A Qc0kXOdD49S6hom8tlkGg2E/SEGzA+vf5rw5xeZYz5yyG3j7edmnGR2QDk/ypOUTCdkR g/GZLdCs8LdJyArDImtCSikjTLgA5/KGEIFoJSHT3taIAiRVO3euVPiEXN+icz6WLHKi qe04Z5q7CITmLzVB77GNLDgTQ+wl+17/lEhmYSdyyJ2pl34wsbTmoA86ERaZb0tkVnqH qBfA== X-Forwarded-Encrypted: i=1; AJvYcCUVmPNO3rINQqf77PRezmO99nl6BE/xFvWnwVACGtqw97RAqGCuQcC4Df91G0yYfWMKKL8fQ0+wt0pLvZs=@vger.kernel.org X-Gm-Message-State: AOJu0YyeoMLDn5XrTBZ+PPWigBX+veIU8kzHMfJZGt5Rkbyx+3XCCdNx miblO1RM7zTnYJTh56cG01GCgby/O3zdsAvIpAZ69YGdQuh2/PsqNg0g0h1rtZwRQRp//mPPwNr TwZvACA== X-Received: from plpa9.prod.google.com ([2002:a17:902:9009:b0:2b2:45d8:c606]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3845:b0:2b0:c451:ae8a with SMTP id d9443c01a7336-2b2818521c1mr229989525ad.13.1775669172881; Wed, 08 Apr 2026 10:26:12 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:43 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=1569; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=ko2N+a8bmW24/l4K/at+f1QHh6ITswHFEAcwikZm7g8=; b=746PglFeH+OYu3l4MYzApNvi5cX7gmzFI+EH+QoQQGSI/WNdWDeTfTggu2aYEOF1AvAm4+CiO zbTdbLNvjMSDyUKybAzt3rRp24Zt8lyV82pf0BtA3Q4mEZHunp1EjUN X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-2-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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 --- mm/memory-failure.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2e53b3024391..fd9ed2cd761d 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -941,7 +941,9 @@ static int truncate_error_folio(struct folio *folio, un= signed 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); --=20 2.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 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 6F8BD3D9DA1 for ; Wed, 8 Apr 2026 17:26:15 +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=1775669177; cv=none; b=IAx1pe8HCrTSA1GtmzZsVm/XsHh0miVh7pBVTwgzlBabjB1ZLW+KzziOzY1KBK5F+bcjGv+5BpKj90MmJ+3J18XemvulqaXLNyr1J+7it2Ke6l4rG2vsELYreOohfFeo1xVUc5dCfIWzx9L+q8wudxVEcXXfST1ilGv+CnuDW24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669177; c=relaxed/simple; bh=sG0P7RhWvhPfeqHAnDvFiL/wdpauzKoG7D3X6bRIOBg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=L3aAlrze9/em+E8nxwFMZimXhItjXsKDK0lPk4MfIqJc7y4kb+aFWB8J+3XCuUF67z638CoNdOIN0bFvKUDiRvgpseeDsh6ncfqttCANE4yEkYoJvZsvqCpBmeLWRe3bYW9JIx+oblnnIGMoR1URvx9J35am6mtzLCoyyKgcJ9o= 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=hL/HvRbb; 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="hL/HvRbb" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82c649dc145so5446b3a.3 for ; Wed, 08 Apr 2026 10:26:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669175; x=1776273975; 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=HKfhxJtawehvSEWMDkPfY/SsNOZhfVJKas8DUTzpFWA=; b=hL/HvRbbr3VWYLQYgOb1k3af9d4hnNSo07gxM5r3cq9+2RXGiqPxSd3Yei3ZmMa+d8 /SDTU1e8/dpeDwhxXLZU2fetnfxt0Gt5XCj6uuqYlh0jriAKOgBAMT+JaiI0ynl4EEd+ Ggen7nfonys6NfIZ9y8mCHeOQ2lnmpC/j2wu6Gg0axtE1J4de5gL0KF844NCR78lKvmg T58YjOz/HHBbJFar2DvPnn9PdXbE55vMlYvqOCDKX+zAOp2ZM6SipKieDS6yYvaGIMx+ PzAMms3d1YhvJQB37vvgse260BmwwYWzTFq8GAWbSYoIFp4hwajYqy0W7E9B69n2V3AF J1JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669175; x=1776273975; 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=HKfhxJtawehvSEWMDkPfY/SsNOZhfVJKas8DUTzpFWA=; b=A1Iy/HgNd/BpFnQNsqr4T3d7w4NdWEbQuwArK7BGJdxABlaliDV/1hjP246uddmide as/PgVW+pgJ8b2V1Oh+9I5Twez7R/x200SK4XNAjMRaR3XkW1pvA5jQvTDQiUjP0Q6Zk ikjwYNVEMe1Erz8MQNz4hicu6FgXJZw3bi/6PI5Pgzo9nJ4B1oyjj56xvdGmdIt8H888 Knk5gt6G0dp6okp2lXZsjpBj1Mg9E6yUSVLhWqd0LZDtSXZC1oWqDCCX0Fp9+aWOpT3n 6QNk69Ph3XR3zlb8o2vtlTYIBEJKVwVJi31zXIigEhaXZ8YosIEbzEhalz5E0amWDEJd 5ZNg== X-Forwarded-Encrypted: i=1; AJvYcCWTvQM/h425ukqWSjT3ubAH5qOpARy8adBJJUt1AnR3E103o8CCImu+ZAIdi3bkfAM+8qFJnHhs2rqoBUo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz39efZe9Ngn6C2pnyBb3luOYsYYxrX2a25rAOHI1sZn8cTsasA p/27zOpJRAh3AS/bjsEj7qKB3fP5n428UIha9Qb3g/Q/Yv6ZWSaOaLwa5xsJXizu3xfQT270w9M AcAbJnw== X-Received: from pfbay5.prod.google.com ([2002:a05:6a00:3005:b0:82c:67aa:804]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a0b:b0:81f:852b:a925 with SMTP id d2e1a72fcca58-82d0da4594cmr21368656b3a.1.1775669174393; Wed, 08 Apr 2026 10:26:14 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:44 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=1598; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=sG0P7RhWvhPfeqHAnDvFiL/wdpauzKoG7D3X6bRIOBg=; b=HYYjhlQyURswF6uipGoryLPDVw7e6x7xLSDi6B5Ls1j0ivGRToHWOQGxxy9K2uu5HWYRcsBPt EKIp8P5HwgPAwc24TnV56V+kv3ClUL+8+ATdyRnYAbdQ0knKeaLNQGa X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-3-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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 --- 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.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.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 1E3643D75AF for ; Wed, 8 Apr 2026 17:26:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669178; cv=none; b=e5IqFNBgp07Ia77EI5PbTKN447YWnv3lQ0SqSXQEVZ5i96lBN2m5DvAe9BVBYo2HZsH9DnVUjASdGb/hHwTsLWXCq5iz0Hbfesx4vREQaWKXSYINu4cWTFjuIvIzDyF9iqXDcGO6pMNkwRFTki5XkmHj5MnyBqbMfBgeg3hh0F0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669178; c=relaxed/simple; bh=J3QZtuvE1lZ2QUWb/3XDrQaTozqcK1lsZfxrtY+rULk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KCs6GPm7q+HTYfBsD00b+7Fgn7I8vYpj0MhiMokG5rkJY6oU4KiHAhASYDrnV1d6fIi3hqlPDSHOQPMoAmbYikGK0zTF6r6gia/vGHMsCMsF/RxVqAvsVxqSvHUDjf4VnWynZsMYk7fFiWDwYknU50cEcOC/dWrUPibss0VOCP0= 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=sH55dldc; arc=none smtp.client-ip=209.85.214.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="sH55dldc" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b250d3699aso1797345ad.2 for ; Wed, 08 Apr 2026 10:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669176; x=1776273976; 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=cXBGnJ08RM3Dn6KYmVg3dZVgKAKRqoAR1kz7qqbY2VI=; b=sH55dldcsbWWuQDNHOOpviRIKYm9vXnAu9N36DbZGgujjMh7sK7jlLQvkMNeuLNoNo hG/Wab+3qaabwMTR5/oXKkSQnx9pHPUPxObcrP99E2uJ7lWU8lYGQEFKIVSv+2r4Xn5w GF+l3/eRgA0iVdzfsEa61beAzDKS30GkW042HXZGmxpgV4UCp0JsztLSjh07dVmVZGGo fuVBLzqyioGTx2ipvwBsxsmig8aZhysjXzBJwAVKW3J/idzKLNQTLxlNTmk+drkLqLQr ThWxOxLGmFQ8mumYkjxjhiG8d5i+QHsG69CLsV2req7dUztpkA0kpIRzxOeL0O+6rBUq lrZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669176; x=1776273976; 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=cXBGnJ08RM3Dn6KYmVg3dZVgKAKRqoAR1kz7qqbY2VI=; b=eTxkuGc/UelwbG7LedpKUc03oSS1lX74HjG4YzwxVA3ZWUH1xUfSwGxawF0YdIV9Gy OeJS6C4cqa9BsIxKnXVlKfJuExIDIDEHdQ+xBEphI/+cnOjeszlYQw9aBpp8Ahkn/cU/ 94EwzJJfu/GRMwyExtgcel/ADETTi0Apq3azwo9Reve1PHclJeXrFf4qB7chK3cS1wi3 7ecioOLx2zfqxcYSjYj8GrMN6c5fB89wSzdrmT1PX/1leP+/LZ2lxseq/YACadhwDNP0 Xwy9GOvNVP8HpUmqx7iessSkKpuVZlQ55jO0SBJdST4NBaDEYVUCdlblgsBEi73jLGkV JGfg== X-Forwarded-Encrypted: i=1; AJvYcCVfdIJavJjUqcMWLdnEvgAEqlAn+/GrIVbBdsV8KqNWv1eKguQ6PIgF9UmMcWqX6jVTOUTRJ1E2Cy8MzYc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3aJZwd75eu+ZAKG2SVdAdtVkcvckgWKHTO/PgJQp2a4L9/3WB ZsoFtaMEHt1+slNWvJmRKUMWwlPC2rwRdL2CCyA31GO8BCIRBGnSVBYTvNbypnGWtSyFxeEfF48 3/nN9Vw== X-Received: from pllo16.prod.google.com ([2002:a17:902:7790:b0:2b2:4331:5552]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3803:b0:2b2:4f43:b48c with SMTP id d9443c01a7336-2b2c7267313mr3087985ad.14.1775669176229; Wed, 08 Apr 2026 10:26:16 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:45 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=1543; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=J3QZtuvE1lZ2QUWb/3XDrQaTozqcK1lsZfxrtY+rULk=; b=ohyQXWxRZGPECeCqTFjtef8YZ+umakzibuW5apwDb2InHSLTkMGXhbBkBw+FaeA7lKNULxCbB XrJMn2cS9cmBHmXTKCX/+Omh2q/h6zyDLPCi7ZuJE70grdI7shFL2Gm X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-4-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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 --- 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 fd9ed2cd761d..d6628ad114a5 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.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 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 78FC83DA5BA for ; Wed, 8 Apr 2026 17:26:18 +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=1775669179; cv=none; b=bOikxmVRnvApfxsfu1TpFgV9Mrv3QhVIsbH4+d0HVx+zFDe/WB5QxbFWGgcXiUpqXcOhfBHPpEkGAYEu2a+mf/L8tY/AFwqk7MGzGckTHePc5Dpy87uz/HFpo4DYPV6RULLXtM8ZUl0nUgnaBjPwzH3cqkiwhrA0N3L1kSEELPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669179; c=relaxed/simple; bh=9j+Yjxv5DCIhDgqhSAFcOR8cdCu2/7Gl8VDuHjhEuMY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uuJKkwYXYzl1eNPX+xjA+y0Zoca3Scxkgof/OEFA099LPHWxljwsriG8E1jgUkHiTnVcIq9pJA8rGW8aglgLgs04/U/OpjlGR7/73XCAyUOZi56iNahCO39sV8QOQWNIG1WF0B9td91vkliJcPsXwW+H8oBBQy7FjZYVsWyKB9Q= 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=pZpMa2Hc; 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="pZpMa2Hc" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35842aa350fso310514a91.0 for ; Wed, 08 Apr 2026 10:26:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669178; x=1776273978; 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=coXWpWCJYRhXsanWDc3UBlYfp3L/GbnMTag+lQMZ4EU=; b=pZpMa2HcT2bdNr83iQTkU3t7HSRVAhYDWaB/RJjns3e2uQsLm/nYsHxOb5rfwyFb4S gblv6mXZjCjiOjytU7ade2fWeYcyGLvMC92IVqy8YuNEp8E7ZgTz961JnUKocngMPajQ Mlok2zAD14pzsacUBKgVjzZf1M0wgTnOpz0KpGMZdXXC1dYRhgpJsJVlIFjpv0IMPY7m oyCrjloPvWTxmOYDOaPCu8lIAkgdXdPPIskKvMeDS8X0CT0ylTZZEkvmI6LgIKKOIfu+ oz6nerElY53poRvf2/ss+TCnCNE1PDfnLE3UjpxIDso3tUw7OrqFH06zWbI+2WtdX3il GJEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669178; x=1776273978; 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=coXWpWCJYRhXsanWDc3UBlYfp3L/GbnMTag+lQMZ4EU=; b=Wpj4z0jlf96ZDHR9lA8/ZJPlk9WNk+dIOs/KVgT87liF03EjoroNC4UFU+6ePiEPmf vqnq/q1WN54EX2EMjizaKzfcuLd7ZSwpsGDHFVFQYPHC+RQUZQsnbZBWs+Bm/CCqbQHE rV1pTP4UwglVK8aASNnaEBDlooQVL+MzKQwiZqbe/rnmrOOHC94oC+lY3E4dcxiahsXb N3StCGyfIPA/4PgOLFxGBFTpJW5CDruydIIoeoIj6xTDhhaGGAGdlYmE1JF5YcbO3LfL rZ65Pxr7lL9tQuhBkqRZ6NtYlLBA/xVLnT18lQmJvqkmyVEXzlgvkhLXPtZ2Pdvaf0d2 5PjQ== X-Forwarded-Encrypted: i=1; AJvYcCXANpcQhF4epU12JIi0Ygr1Un6REzqwS80PN2RpgMwMUfNKfwyxdC22HpXw4UGQbyBcI0InJuHeYJSwdFo=@vger.kernel.org X-Gm-Message-State: AOJu0YziypSS2lGXsC4rRtT1WTHJ4JusZf6+28pj48WP0UnhHPEHfQPB QDYg88Dq0uS44CD1sS+rAKiL4vUN8So+jDKG6ksv6aOB59BhsR4iqoCdr6JAt907btkKYNpBtNs AAPNnaA== X-Received: from pjbcl15.prod.google.com ([2002:a17:90a:f68f:b0:35d:a03b:ab5e]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:52c3:b0:35d:a861:36de with SMTP id 98e67ed59e1d1-35de691b394mr22211390a91.24.1775669177699; Wed, 08 Apr 2026 10:26:17 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:46 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=4632; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=9j+Yjxv5DCIhDgqhSAFcOR8cdCu2/7Gl8VDuHjhEuMY=; b=ZLj3IPnlSz73RcVt/W7CdlvSDsYMGQCljZ+P1jxfdDIyI2haYYqfl7EVXP3SrZ7hpSAi0brzc aAD0ijgQuUJD3pVUZ4XpVhZmt5xnWRUQ+TjBbKyJ7ygMxyHCoLl8kxe X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-5-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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. Test that + madvise() call returns 0 when the poisoned shmem page is clean + trigger a SIGBUS when the poisoned shmem page is dirty + trigger another SIGBUS when the poisoned shmem page is fault-in again. Signed-off-by: Lisa Wang --- tools/testing/selftests/mm/memory-failure.c | 109 ++++++++++++++++++++++++= +++- 1 file changed, 106 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/mm/memory-failure.c b/tools/testing/se= lftests/mm/memory-failure.c index 3d9e0b9ffb41..eb3f8d98f6c9 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,84 @@ 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 { + 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.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 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 581623DA7CA for ; Wed, 8 Apr 2026 17:26:20 +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=1775669183; cv=none; b=YHkgthNS+HT9ZMr6rDzbKddF13V0Iq43tgDGkrVY5+efJOlOo9XWbtQr6D3h4dRycImT6YNuGgFL4X+qStSsFaAQpPmJvR5xSDd2AGpr8o2lg5zbqfc8DV9fQDgnT0oE5YD3liqjLXGMghb54sNt5aV4wStz9r/uOGAnTDC6FSE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669183; c=relaxed/simple; bh=PRy8p2rUQ0W21+IYbMpy4JGA6ghFl2d0Arn6M88nXQU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IsvMiF8/nmVizngk1xsQSSkM/TeQ6uzGRsv464bU6vzBXJMrk9m150yykrKga0n3eepbtivLz44jb+ReXs/XrNlgoHeOUcEwcZqN3IZOGmOm7gaj8tDmyG5Z0icvP70LTnAYVpcnpmOBo/7GhjtO3V6XgRlCPsBU+Nn6SnEYA94= 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=o04jWZ6U; 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="o04jWZ6U" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35641c14663so183589a91.2 for ; Wed, 08 Apr 2026 10:26:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669180; x=1776273980; 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=6M4pXx0B97fE1Sqiv/KOXEr7lN2rUW0ryR2fEAKsbFU=; b=o04jWZ6UbSzePuVg5cN/+tLVCHz/xYGcf98p0kKdKadfgdVY+ZQ88sulkVvdqv5Byg hu0iohWzP0a06dF6zz050WpswknYWSCygKSN1IYMN197YFFst49WJXoAC6mZuLi9NRgM mIHtpEFHLW+ni/A4tH5vQbSjtRTc6nT6nmJx+3I9uIGSy3Z6CYNRCwaB2JHbAvZ2m7gu qIGwZ/OQWDbwl+P0Ql44SpNNMUI/mecCYr+M6IZxqXvpyIo7uCRbJKqbfvrGDYkI7+Fg Eh8T4GVoynb13U391QnKX6FwPxCT7THIwQ2he1+cNgeG9ZZVtUrI74nx/fKaagoGo9BM z2JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669180; x=1776273980; 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=6M4pXx0B97fE1Sqiv/KOXEr7lN2rUW0ryR2fEAKsbFU=; b=MVGgtzMqKnb3JxefrUK00AVCJQAJ3s09oP7GzuoG/t7cl9x7ZZTX0KiuhQA+1X0TC0 SgbRVWlZmxTCLHAsfc7OHFj8kg1UfUqzNTLIVapBsmZakFx3BvDg32tbVSHOem46vatV 6F+r6dRrU5W0S1OxI3iwdCCRppE7HsXmwafWYjeuNG9VLxCTQLl0y/EKF2RRUR0M5n+8 K6Qzsu8FShxw4xbfMbeL6q7mm6Lzc9mhj7UcZWBF6fO9hQ7sADcn9+68T44rfQsyiZRK yVdEUibcVPPPieLZlBRzQrS7XEw7cllEmDOGaM/ix/SQ62JKIJNKka/jqrruB3dMpdIH rK4w== X-Forwarded-Encrypted: i=1; AJvYcCUXr5YzZEWK6XsRW59C2h9Mp/EK+nUhEdTtiwp1HVKxV+XNYiMbRuYBaB++tNTeoX0sKEbde3IVrtedlms=@vger.kernel.org X-Gm-Message-State: AOJu0YxuCHWf9p96ufzQBH9LuOXzg+2e8e/TuokWl93zlLRQaBIXt9ie H52k4oXO5Adfa/2KdQ7uRHtK+yUuCaZLxy/NjW4tPB9CSOSA+/A/18lNecucqOO3kmYxGiYG7xg HPN5B8A== X-Received: from pjbng10.prod.google.com ([2002:a17:90b:1a8a:b0:35c:15e7:3e9a]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:d2c7:b0:35b:e4d8:bb10 with SMTP id 98e67ed59e1d1-35de6941267mr21599298a91.14.1775669179620; Wed, 08 Apr 2026 10:26:19 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:47 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=7963; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=PRy8p2rUQ0W21+IYbMpy4JGA6ghFl2d0Arn6M88nXQU=; b=SelHs7lTDkGdo9DI5JdcOfHrxMcwdfFhOyxFyu4NGq2go+u9m95IzSNH4SMDLMXwVTFjLz3pP ikjRxFwOehVAWvjCfGs7Qg5lqkHHB0cx8vZjdnM9iGQtaPdfF+HPJIb X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-6-718f45eb7c75@google.com> Subject: [PATCH RFC v3 6/7] KVM: selftests: Add memory failure tests in guest_memfd_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/guest_memfd_test.c | 168 +++++++++++++++++++++= ++++ 1 file changed, 168 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 618c937f3c90..0ea4e7d7e6d5 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include =20 #include #include @@ -193,6 +195,171 @@ static void test_fault_overflow(int fd, size_t total_= size) test_fault_sigbus(fd, total_size, total_size * 4); } =20 +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 write_memory_failure(unsigned long pfn, bool mark, int 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 (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, return_code); + } + + close(fd); +} + +static void mark_memory_failure(unsigned long pfn, int return_code) +{ + write_memory_failure(pfn, true, return_code); +} + +static void unmark_memory_failure(unsigned long pfn, int return_code) +{ + write_memory_failure(pfn, false, return_code); +} + +enum memory_failure_injection_method { + MF_INJECT_DEBUGFS, + MF_INJECT_MADVISE, +}; + +static void do_test_memory_failure(int fd, size_t total_size, + enum memory_failure_injection_method method, int kill_config, + bool map_page, bool dirty_page, bool sigbus_expected, + int return_code) +{ + 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, fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + memory_failure_addr =3D mem + page_size; + if (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 (!map_page) + madvise(memory_failure_addr, page_size, MADV_DONTNEED); + + ret =3D prctl(PR_MCE_KILL, PR_MCE_KILL_SET, kill_config, 0, 0); + TEST_ASSERT_EQ(ret, 0); + + ret =3D 0; + switch (method) { + case MF_INJECT_DEBUGFS: { + /* DEBUGFS injection handles return_code test inside the mark_memory_fai= lure(). */ + if (sigbus_expected) + TEST_EXPECT_SIGBUS(mark_memory_failure(memory_failure_pfn, return_code)= ); + else + mark_memory_failure(memory_failure_pfn, 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 (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 (return_code =3D=3D 0) + TEST_ASSERT(ret =3D=3D return_code, "Memory failure failed. Errno: %s", + strerror(errno)); + else { + /* errno is memory_failure() return code. */ + TEST_ASSERT_EQ(errno, return_code); + } + break; + } + default: + TEST_FAIL("Unhandled memory failure injection method %d.", method); + } + + 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(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); +} + +static void test_memory_failure(int fd, size_t total_size) +{ + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_EAR= LY, true, true, true, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_EAR= LY, true, false, false, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_EAR= LY, false, true, false, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_LAT= E, true, true, false, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_LAT= E, true, false, false, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_DEBUGFS, PR_MCE_KILL_LAT= E, false, true, false, 0); + /* + * If madvise() is used to inject errors, memory_failure() handling is in= voked with the + * MF_ACTION_REQUIRED flag set, aligned with memory failure handling for = a consumed memory + * error, where the machine check memory corruption kill policy is ignore= d. Hence, testing with + * PR_MCE_KILL_DEFAULT covers all cases. + */ + do_test_memory_failure(fd, total_size, MF_INJECT_MADVISE, PR_MCE_KILL_DEF= AULT, true, true, true, 0); + do_test_memory_failure(fd, total_size, MF_INJECT_MADVISE, PR_MCE_KILL_DEF= AULT, true, false, false, 0); +} + static void test_fault_private(int fd, size_t total_size) { test_fault_sigbus(fd, 0, total_size); @@ -370,6 +537,7 @@ static void __test_guest_memfd(struct kvm_vm *vm, uint6= 4_t flags) gmem_test(mmap_supported, vm, flags); gmem_test(fault_overflow, vm, flags); gmem_test(numa_allocation, vm, flags); + gmem_test(memory_failure, vm, flags); } else { gmem_test(fault_private, vm, flags); } --=20 2.53.0.1213.gd9a14994de-goog From nobody Sun Jun 21 02:30:14 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 2B1D23DA7FB for ; Wed, 8 Apr 2026 17:26:22 +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=1775669183; cv=none; b=nXQDOwT0WDHYK+41isJQuWVU7LfNNeux0iU/hqKkmHYDZTejP2JOm24fQgisTT/8PkZI9rZMYTJF/hxDtZzmubY2YWCn1J5tN7LCufhCgt9ELwIkvDRi+i2aNfXDehdTx9+IZSy6H5tg9zJXiKs5orzD13oKZlYeGQEUcqIUs9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775669183; c=relaxed/simple; bh=ijzz7721/Uxn/cIYDu6fObmDcCDSsHBAV/IttC7RW3U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Mrxa19L5LngTNqLb4tw07Vwpxa7p2EacUq6HvagnOlVL3WSU84RFVi4Muq4qW6xvaGeNK2xI9i104OwBMHZBjOf/HbxP/GhBl4HM5tR1DwFcIp6s/fOaTTtXYLh8gjmEyhzEAmSxfs5aWQMtlcX+6PtU5w9Ndq8rGem+sGwQqsk= 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=PaOXtJCh; 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="PaOXtJCh" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-354bc535546so96348a91.3 for ; Wed, 08 Apr 2026 10:26:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775669181; x=1776273981; 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=qDOZkIKxiPaQK0xKrpR+eqPsSd9MFpMG2SR/o/KXRoA=; b=PaOXtJChxYFKDzExJRS+IfE4YVW3dWf5ljM0Ll46OTY6ZWk918PcxF253ENUgj2mKO YYv9gwbrcLqFqU26LmtNNdP3Q0CXX8uad/l8bMdaDEjTDn8g2Plre2aMObSjE77KBa7y nP7QlkACgmKF7yVf4Fvv95IzC0MzznEDGs1skBaSRHBOD2MBf6E0BilN1y61He2tVzxx pz8Muo4JW8o2nc+zuH4qbJyzFDUzVHmUbmpcdnj1XBYv7CU7symhKPgIaARK8C98PTIC Dc40zaYvDk8ZBpHUwmr9CgnFP63NfTe46SRvqqye6zv5Pc1yq0BTxBQ7Ow3zrR1S7iNh A2+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775669181; x=1776273981; 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=qDOZkIKxiPaQK0xKrpR+eqPsSd9MFpMG2SR/o/KXRoA=; b=afB36RpBuZfaywPP6DaRFM7YvLKWSosGDya+CerI0zkw6Nvw5GEbER++tWoPGMnEt0 etc7+1nBJxCjDj2oheAW+sNJfP/6kfOf2pTUNqYwPmM0UtJ5Yj+NIOkkN3Z1I5jr7XXc H4Luep670hb4IvpzkvPkAx6vRh01ytbP1a5nTB3RMJB5ImjD/EGk5SDiflknuJ26wFEh xC52z6ZAky4A3S9iXvIt98Sk9ZjOjRHhZTBxDMVcTq5HPxKQOlYwkMqo8CpBrVUyY8Ej nW4JieciSA41vnvhwK4+xEHto/mTl7cMpEVAbiG1vDuLBgUYxl6L5F4WqNxSD/jKZ50t kaXA== X-Forwarded-Encrypted: i=1; AJvYcCXzlbz9FxBKh1wOxoJkDxkJgNZ8f+4irD+EWNQsBv0hFCOtooSbb8PVLNl79RhERYgBt6c7qsWQLg9k8Q4=@vger.kernel.org X-Gm-Message-State: AOJu0YxWdHBTP5mlY5Hd4yG7poVDs3ijkWlfXsoCX1Xrwfjv1a0vEgAQ DtzeNqmZRpiN019U9pOHGYTVaxNny8r/0EjElgUUTNeVV0Wr6REJlBh9qUeyATcb/NRETo7dv/h DOeuiRg== X-Received: from pjbhl3.prod.google.com ([2002:a17:90b:1343:b0:35d:a369:bbea]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3c48:b0:35a:18b1:c245 with SMTP id 98e67ed59e1d1-35e3574c101mr173541a91.3.1775669181262; Wed, 08 Apr 2026 10:26:21 -0700 (PDT) Date: Wed, 08 Apr 2026 17:24:48 +0000 In-Reply-To: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-0-718f45eb7c75@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1775669168; l=3409; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=ijzz7721/Uxn/cIYDu6fObmDcCDSsHBAV/IttC7RW3U=; b=sRyqvXXGMNI5dZjLhIg1mr5q1swOpgzarSwWrk1NumIrtzSiI54MbVYzXC+7k09lxHjEFl4fv +zVMRi1MIeSBNGsLfAME4QP5EX4LbgDrrGBr1tO69JgO1LqU2DVF5ct X-Mailer: b4 0.14.3 Message-ID: <20260408-memory-failure-mf-delayed-fix-rfc-v3-v3-7-718f45eb7c75@google.com> Subject: [PATCH RFC v3 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 --- tools/testing/selftests/kvm/guest_memfd_test.c | 70 ++++++++++++++++++++++= +++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 0ea4e7d7e6d5..6615ee8bfcd8 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -26,6 +26,7 @@ #include "ucall_common.h" =20 static size_t page_size; +static uint64_t test_memory_failure_guest_gpa; =20 static void test_file_read_write(int fd, size_t total_size) { @@ -637,6 +638,73 @@ static void test_guest_memfd_guest(void) kvm_vm_free(vm); } =20 +static void __guest_code_read(void) +{ + uint8_t *mem =3D (uint8_t *)test_memory_failure_guest_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); + } +} + +static void test_memory_failure_guest(void) +{ + const uint64_t gpa =3D SZ_4G; + const int slot =3D 1; + + unsigned long memory_failure_pfn; + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + uint8_t *mem; + size_t size; + int fd; + + if (!kvm_has_cap(KVM_CAP_GUEST_MEMFD_FLAGS)) + return; + + vm =3D __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, __gues= t_code_read); + + size =3D vm->page_size; + fd =3D vm_create_guest_memfd(vm, size, GUEST_MEMFD_FLAG_MMAP | GUEST_MEMF= D_FLAG_INIT_SHARED); + vm_set_user_memory_region2(vm, slot, KVM_MEM_GUEST_MEMFD, gpa, size, NULL= , fd, 0); + + mem =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + virt_pg_map(vm, gpa, gpa); + + test_memory_failure_guest_gpa =3D gpa; + sync_global_to_guest(vm, test_memory_failure_guest_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, size); + + /* Fault page into stage2 page tables. */ + guest_read(vcpu, 0); + + mark_memory_failure(memory_failure_pfn, 0); + + guest_read(vcpu, EHWPOISON); + + close(fd); + kvm_vm_free(vm); + + unmark_memory_failure(memory_failure_pfn, 0); +} + int main(int argc, char *argv[]) { unsigned long vm_types, vm_type; @@ -644,7 +712,6 @@ int main(int argc, char *argv[]) TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); =20 page_size =3D getpagesize(); - /* * Not all architectures support KVM_CAP_VM_TYPES. However, those that * support guest_memfd have that support for the default VM type. @@ -657,4 +724,5 @@ int main(int argc, char *argv[]) test_guest_memfd(vm_type); =20 test_guest_memfd_guest(); + test_memory_failure_guest(); } --=20 2.53.0.1213.gd9a14994de-goog