From nobody Mon Feb 9 21:37:03 2026 Received: from canpmsgout12.his.huawei.com (canpmsgout12.his.huawei.com [113.46.200.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 631EE305057; Wed, 7 Jan 2026 09:26:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=113.46.200.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767777974; cv=none; b=tbM/kigxMDJSepHv3AClJ3XczY82bSzDLOpk4EKNgqAj7dj4rrRD1rAEhPJWoHJidv144aWzkCb4WKSgcVWp3YjyUif1MIE9tbBQVlCbOv+hOEZBHZ3xMl6MgnZfrDpRXlRK7JpYvTGKTSJofAypu5Sc4akuWpycS8MAfzLwF2Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767777974; c=relaxed/simple; bh=zMyyYUP4fiVarfVIzaeoWF1+u+ZVqa/orDG58TaEvFw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=eJU34h2eCjSfHupboE0R6q56TWiJ83XvQrJR0/wFcqgGqFJRTWB0Tkw18SYPxuQPwrp5xlT4DUS0PvQMaWNw3TXc1oO+BFF4LQuU4b26eAiuGgP2dqvFZbECSK6n9qY+yEov2ZojGWxdrF02/xpSLN321EUeEthNpHn8SvOmm0A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b=iXONkfoa; arc=none smtp.client-ip=113.46.200.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b="iXONkfoa" dkim-signature: v=1; a=rsa-sha256; d=huawei.com; s=dkim; c=relaxed/relaxed; q=dns/txt; h=From; bh=XIAJBshX9UsaOLqWvmn0k/csmGtpC9VX/+1HAPPsDhA=; b=iXONkfoa/uF/4R4ajhM6wWinUkwHTSF8eaRHL5IvK+DX7ajR7bW1NvMDZYFtqQzDVMMXIgh23 FuahsRow8QmPRAKOUu4LD4ehjF/NvnutjV5r/ttdwh6jmT+9nVd3E4tbRHAPb4PMf8CS9ykdi+I DVJ11cTQDTy8p/tpD9j4ZDM= Received: from mail.maildlp.com (unknown [172.19.163.15]) by canpmsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4dmMyd5zgRznTZn; Wed, 7 Jan 2026 17:23:05 +0800 (CST) Received: from dggemv712-chm.china.huawei.com (unknown [10.1.198.32]) by mail.maildlp.com (Postfix) with ESMTPS id 21E9F40539; Wed, 7 Jan 2026 17:26:10 +0800 (CST) Received: from kwepemq500010.china.huawei.com (7.202.194.235) by dggemv712-chm.china.huawei.com (10.1.198.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Wed, 7 Jan 2026 17:26:09 +0800 Received: from huawei.com (10.173.125.37) by kwepemq500010.china.huawei.com (7.202.194.235) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Wed, 7 Jan 2026 17:26:08 +0800 From: Miaohe Lin To: , CC: , , , , , , , , , , , Subject: [PATCH 3/3] selftests/mm: add memory failure dirty pagecache test Date: Wed, 7 Jan 2026 17:37:10 +0800 Message-ID: <20260107093710.3928374-4-linmiaohe@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20260107093710.3928374-1-linmiaohe@huawei.com> References: <20260107093710.3928374-1-linmiaohe@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems200002.china.huawei.com (7.221.188.68) To kwepemq500010.china.huawei.com (7.202.194.235) Content-Type: text/plain; charset="utf-8" This patch adds a new testcase to validate memory failure handling for dirty pagecache. This performs similar operations as clean pagecaches except fsync() is not used to keep pages dirty. This test helps ensure that memory failure handling for dirty pagecache works correctly, including proper SIGBUS delivery, page isolation, and recovery paths. Signed-off-by: Miaohe Lin --- tools/testing/selftests/mm/memory-failure.c | 58 +++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/mm/memory-failure.c b/tools/testing/se= lftests/mm/memory-failure.c index 41bc669cef60..275ab1c6de0c 100644 --- a/tools/testing/selftests/mm/memory-failure.c +++ b/tools/testing/selftests/mm/memory-failure.c @@ -26,8 +26,10 @@ enum inject_type { enum result_type { MADV_HARD_ANON, MADV_HARD_CLEAN_PAGECACHE, + MADV_HARD_DIRTY_PAGECACHE, MADV_SOFT_ANON, MADV_SOFT_CLEAN_PAGECACHE, + MADV_SOFT_DIRTY_PAGECACHE, }; =20 static jmp_buf signal_jmp_buf; @@ -159,6 +161,7 @@ static void check(struct __test_metadata *_metadata, FI= XTURE_DATA(memory_failure 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. */ ASSERT_EQ(setjmp, 0); =20 @@ -169,6 +172,7 @@ static void check(struct __test_metadata *_metadata, FI= XTURE_DATA(memory_failure ASSERT_NE(pagemap_get_pfn(self->pagemap_fd, vaddr), self->pfn); break; case MADV_HARD_ANON: + case MADV_HARD_DIRTY_PAGECACHE: /* The SIGBUS signal should have been received. */ ASSERT_EQ(setjmp, 1); =20 @@ -241,18 +245,27 @@ TEST_F(memory_failure, anon) ASSERT_EQ(munmap(addr, self->page_size), 0); } =20 +static int prepare_file(const char *fname, unsigned long size) +{ + int fd; + + fd =3D open(fname, O_RDWR | O_CREAT, 0664); + if (fd >=3D 0) { + unlink(fname); + ftruncate(fd, size); + } + return fd; +} + TEST_F(memory_failure, clean_pagecache) { - const char *fname =3D "./clean-page-cache-test-file"; int fd; char *addr; int ret; =20 - fd =3D open(fname, O_RDWR | O_CREAT, 0664); + fd =3D prepare_file("./clean-page-cache-test-file", self->page_size); if (fd < 0) SKIP(return, "failed to open test file.\n"); - unlink(fname); - ftruncate(fd, self->page_size); =20 addr =3D mmap(0, self->page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); @@ -282,4 +295,41 @@ TEST_F(memory_failure, clean_pagecache) ASSERT_EQ(close(fd), 0); } =20 +TEST_F(memory_failure, dirty_pagecache) +{ + int fd; + char *addr; + int ret; + + fd =3D prepare_file("./dirty-page-cache-test-file", self->page_size); + if (fd < 0) + SKIP(return, "failed to open test file.\n"); + + addr =3D mmap(0, self->page_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr =3D=3D MAP_FAILED) + 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 (!self->triggered) { + self->triggered =3D true; + ASSERT_EQ(variant->inject(self, addr), 0); + FORCE_READ(*addr); + } + + if (variant->type =3D=3D MADV_HARD) + check(_metadata, self, addr, MADV_HARD_DIRTY_PAGECACHE, ret); + else + check(_metadata, self, addr, MADV_SOFT_DIRTY_PAGECACHE, ret); + + cleanup(_metadata, self, addr); + + ASSERT_EQ(munmap(addr, self->page_size), 0); + + ASSERT_EQ(close(fd), 0); +} + TEST_HARNESS_MAIN --=20 2.33.0