From mboxrd@z Thu Jan 1 00:00:00 1970 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 9D5B032B981 for ; Sun, 31 May 2026 05:58:36 +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=1780207118; cv=none; b=PWtD86zq3EwyHBwo/ryF28Y/1RC+6ylHQ1T3cQCSKR0R/DfuLysF87hilBu/Pt6NrmAKscTRY9b3ms2Z75bahvUkmt5y1GGxEczWyG2GH+hEx1THyVO/9B8nMexMkpExFFJ6CyU+zvsqT51hjy8WShdUHtdKKGutUYUgVoG6UUQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780207118; c=relaxed/simple; bh=SZWZPJWGyZ4Y4qxqaULM6epTJGugPNAJ8oZwETj4sgo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ugGu+DDu4YNzw1rUvmP9PjXvbQnSuhm4EnLt3aeGfJ3wWfUJM8KVH8OWtZ4/PtecT4BGrqOvw7kFUtqdAxcxlfzxdJe+ixiuLUX3OJFxgrrB2VAkP+mAeSmw1t7ZUR3CL6VMblsTSSlbHF/wBjyRAXaM6Yv7zvl0iBTvV/VR6iw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jiaqiyan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=huS6Ve77; 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--jiaqiyan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="huS6Ve77" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-36d98b54cf2so204462a91.1 for ; Sat, 30 May 2026 22:58:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780207116; x=1780811916; 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=Nv+dqUY9M7caT19LqyoDWfIhP+5KrZo4lI6j0vjgDSg=; b=huS6Ve77V4Iwmp5Vi3f14KUCVY0lP8056+gSz1Nmej9IPOzE1hLuI+G2juediCgHTj abZLA8kwoHnh0B/gkRqsISyfgpzLUvVLRGpWNZMW3U0p8PG9YJt8dBHx4UbfyfJTUCeO bHyPe25ecCfweiStWW6OTy5j9SddZOSUZPfg2jGY20LMaK0iax5UU4bzZMAEKND/szXX bjU3hxo4dEI5UuL799D173cYS1PGH5atWoZO8YsahkZhNBgnO7fPAXrOZohIcYEwFHIR kf5kmHpgmf1vloQ3KMjQLy5YSfIOpkZWw8HHxS927Xm7/Gyg0tMYQw0kScOGt9qnctQ0 JgLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780207116; x=1780811916; 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=Nv+dqUY9M7caT19LqyoDWfIhP+5KrZo4lI6j0vjgDSg=; b=CCYacyxRuEVvMfXlF1k8BO6bEho8v4mj/yiuPdAsu7gWJoNwWQJAlr3qI05eSwHw3r FENXFIREklwGwnAuELdUmOFNWu+VFyfcx6br+GutmIueLRginAkUSz5ZztFKUV6n9wKJ Ob1AfqeJH05mxqdTk1NHyOCetTH2PIHEXjOknc3MKpQg+EORKbeGTzmJJrsyMdRTHsLh kZHf2gbAluhILhAGykkfgLTgmCLfew2SwfvyJCpEq5tKTx4Q2q6W/KrHBOKUS82rcNPX MoMhM8sOX3kQg7I7YIBwSWjgtUhBKqA990X/puh8ALRUtbVpwJnrQw6BpcIYNagAQeV4 crXA== X-Forwarded-Encrypted: i=1; AFNElJ/kBRvmCvt7I0uJlCvH+Iy/tpzIdjKkWkjESz8j/jxumfE4X7V0vFvi9VR1pxDGQBXear9UaXcA1wPlfs8=@vger.kernel.org X-Gm-Message-State: AOJu0YxbxUTJZ+K44MfxinxfTNdZIME3v2dgmnIVUyn7YOHXrIOYoZLh MiOIRGs2hE/cKAapwOtvHYdT46/9gYeOyeHLyhkOwT9bFYrC0G/Ca5L4f7U2AMw3PZt93VlKteW D1lJQxt3jx4ZFQg== X-Received: from pghu10.prod.google.com ([2002:a63:ef0a:0:b0:c79:81bb:79df]) (user=jiaqiyan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5848:b0:36b:afa0:c676 with SMTP id 98e67ed59e1d1-36c68476da9mr5562659a91.22.1780207115665; Sat, 30 May 2026 22:58:35 -0700 (PDT) Date: Sun, 31 May 2026 05:58:29 +0000 In-Reply-To: <20260531055829.3636554-1-jiaqiyan@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260531055829.3636554-1-jiaqiyan@google.com> X-Mailer: git-send-email 2.54.0.823.g6e5bcc1fc9-goog Message-ID: <20260531055829.3636554-5-jiaqiyan@google.com> Subject: [PATCH v5 4/4] selftests/mm: add hard memory failure anonymous 1G HugeTLB page test From: Jiaqi Yan To: ljs@kernel.org, linmiaohe@huawei.com, osalvador@kernel.org, ziy@nvidia.com, harry.yoo@oracle.com, willy@infradead.org Cc: osalvador@suse.de, lorenzo.stoakes@oracle.com, jackmanb@google.com, hannes@cmpxchg.org, nao.horiguchi@gmail.com, david@kernel.org, william.roche@oracle.com, tony.luck@intel.com, wangkefeng.wang@huawei.com, jane.chu@oracle.com, akpm@linux-foundation.org, muchun.song@linux.dev, liam@infradead.org, rientjes@google.com, duenwen@google.com, jthoughton@google.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, vbabka@suse.cz, rppt@kernel.org, shuah@kernel.org, surenb@google.com, mhocko@suse.com, boudewijn@delta-utec.com, Jiaqi Yan Content-Type: text/plain; charset="UTF-8" Add a new testcase to validate memory failure recovery for HWPoison anonymous 1G HugeTLB page, including proper SIGBUS delivery, releasing a 1G HugeTLB page containing one HWPoison page to buddy allocator, and isolation of the raw HWPoison page. Although can be added in future, this patch does not support testing the MADV_SOFT variant. Signed-off-by: Jiaqi Yan --- tools/testing/selftests/mm/memory-failure.c | 73 +++++++++++++++++++-- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/mm/memory-failure.c b/tools/testing/selftests/mm/memory-failure.c index 032ed952057c..ea43b2877c81 100644 --- a/tools/testing/selftests/mm/memory-failure.c +++ b/tools/testing/selftests/mm/memory-failure.c @@ -18,6 +18,7 @@ #include #include +#include "hugepage_settings.h" #include "vm_util.h" enum inject_type { @@ -27,6 +28,7 @@ enum inject_type { enum result_type { MADV_HARD_ANON, + MADV_HARD_ANON_HUGETLB, MADV_HARD_CLEAN_PAGECACHE, MADV_HARD_DIRTY_PAGECACHE, MADV_SOFT_ANON, @@ -47,6 +49,8 @@ FIXTURE(memory_failure) int pagemap_fd; int kpageflags_fd; bool triggered; + /* Number of initial HugeTLB pages with default page size. */ + unsigned long nr_hugetlb_pages; }; FIXTURE_VARIANT(memory_failure) @@ -157,11 +161,11 @@ static void check(struct __test_metadata *_metadata, FIXTURE_DATA(memory_failure void *vaddr, enum result_type type, int setjmp) { unsigned long size; + unsigned long nr_hugetlb_pages; uint64_t pfn_flags; switch (type) { case MADV_SOFT_ANON: - case MADV_HARD_CLEAN_PAGECACHE: case MADV_SOFT_CLEAN_PAGECACHE: case MADV_SOFT_DIRTY_PAGECACHE: /* It is not expected to receive a SIGBUS signal. */ @@ -174,6 +178,7 @@ static void check(struct __test_metadata *_metadata, FIXTURE_DATA(memory_failure ASSERT_NE(pagemap_get_pfn(self->pagemap_fd, vaddr), self->pfn); break; case MADV_HARD_ANON: + case MADV_HARD_ANON_HUGETLB: case MADV_HARD_DIRTY_PAGECACHE: /* The SIGBUS signal should have been received. */ ASSERT_EQ(setjmp, 1); @@ -183,17 +188,36 @@ static void check(struct __test_metadata *_metadata, FIXTURE_DATA(memory_failure ASSERT_EQ(siginfo.si_code, BUS_MCEERR_AR); ASSERT_EQ(1UL << siginfo.si_addr_lsb, self->page_size); ASSERT_EQ(siginfo.si_addr, vaddr); - - /* XXX Check backing pte is hwpoison entry when supported. */ - ASSERT_TRUE(pagemap_is_swapped(self->pagemap_fd, vaddr)); break; default: SKIP(return, "unexpected inject type %d.\n", type); } + if (type == MADV_HARD_ANON || type == MADV_HARD_DIRTY_PAGECACHE) { + /* + * Check backing pte is hwpoison entry when supported. + * Although try_to_unmap_one() also installs hwpoison entry + * for HugeTLB, pagemap_hugetlb_range() doesn't parse + * swap entries at all. + */ + ASSERT_TRUE(pagemap_is_swapped(self->pagemap_fd, vaddr)); + } + /* Check if the value of HardwareCorrupted has increased. */ ASSERT_EQ(get_hardware_corrupted_size(&size), 0); - ASSERT_EQ(size, self->corrupted_size + self->page_size / 1024); + + if (type == MADV_HARD_ANON_HUGETLB) { + /* + * Only one page is hardware corrupted; the rest should all be + * released to buddy allocator. + */ + ASSERT_EQ(size, self->corrupted_size + getpagesize() / 1024); + /* HugeTLB should have lost the HWPoison HugeTLB page. */ + nr_hugetlb_pages = hugetlb_nr_default_pages(); + ASSERT_EQ(nr_hugetlb_pages + 1, self->nr_hugetlb_pages); + } else { + ASSERT_EQ(size, self->corrupted_size + self->page_size / 1024); + } /* Check if HWPoison flag is set. */ ASSERT_EQ(pageflags_get(self->pfn, self->kpageflags_fd, &pfn_flags), 0); @@ -247,6 +271,45 @@ TEST_F(memory_failure, anon) ASSERT_EQ(munmap(addr, self->page_size), 0); } +TEST_F(memory_failure, anon_hugetlb) +{ + char *addr; + int ret; + const unsigned long nr_alloc_hugetlb_pages = 4; + unsigned long alloc_size; + + if (variant->type == MADV_SOFT) + SKIP(return, "Soft offline test is not implemented"); + + /* HugeTLB settings will be automatically restored when test exits. */ + hugetlb_setup_default(nr_alloc_hugetlb_pages); + + alloc_size = default_huge_page_size() * nr_alloc_hugetlb_pages; + self->page_size = default_huge_page_size(); + self->nr_hugetlb_pages = hugetlb_nr_default_pages(); + + addr = mmap(0, alloc_size, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0); + if (addr == MAP_FAILED) + SKIP(return, "mmap failed, not enough memory or 1G hugetlb not supported.\n"); + memset(addr, 0xce, alloc_size); + + prepare(_metadata, self, addr); + + ret = sigsetjmp(signal_jmp_buf, 1); + if (!self->triggered) { + self->triggered = true; + ASSERT_EQ(variant->inject(self, addr), 0); + FORCE_READ(*addr); + } + + check(_metadata, self, addr, MADV_HARD_ANON_HUGETLB, ret); + + cleanup(_metadata, self, addr); + + ASSERT_EQ(munmap(addr, alloc_size), 0); +} + static int prepare_file(const char *fname, unsigned long size) { int fd; -- 2.54.0.823.g6e5bcc1fc9-goog