From patchwork Mon Feb 24 21:14:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jane Chu X-Patchwork-Id: 13988926 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 31ADEC021A4 for ; Mon, 24 Feb 2025 21:15:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C6E266B0093; Mon, 24 Feb 2025 16:15:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BF8436B0095; Mon, 24 Feb 2025 16:15:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A98936B0098; Mon, 24 Feb 2025 16:15:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 7E3EF6B0093 for ; Mon, 24 Feb 2025 16:15:15 -0500 (EST) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 49F631A0160 for ; Mon, 24 Feb 2025 21:15:15 +0000 (UTC) X-FDA: 83156093790.01.20A54FE Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf05.hostedemail.com (Postfix) with ESMTP id DC22F100002 for ; Mon, 24 Feb 2025 21:15:12 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=Rbmmk0F0; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf05.hostedemail.com: domain of jane.chu@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=jane.chu@oracle.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740431713; a=rsa-sha256; cv=none; b=5/ohvr1bRORb+/sAG1U5HSbrJE/m7TY8kjHocPP+q5Tu6MWyte/Fpb3R3Ximft3Ycmhzjh FsdtcMcNa5zo0htosKZsimVuV0E5XdyOdblq9eNCOQlyvAMAUWQ9V1OazQM6jjD5R/oQPk 3A6UzUyi0VDBju/KgupzPdMLWUN9t8M= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=Rbmmk0F0; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf05.hostedemail.com: domain of jane.chu@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=jane.chu@oracle.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740431713; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=4SpDzd6ns5HXEJHJoua6NBwPKsjFUDkJuO+bUORWJN8=; b=GSKZkXMUu2RapSF/J2FFIU3LUkMujmS0SEBehRrU75mxgFXldcZCkA7AiXa1FQv9qMNm/1 +eSDUUMJ/QFY4cdLxmEY22B0KCWk6XBgAIOL8Y73oYBOj5ePepwQVHnOqqNcxYLtFsyaCI azfQC5F7sGa5f4BoLp3qk3uFLJw/cHk= Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 51OKfgIo016961; Mon, 24 Feb 2025 21:15:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h= content-transfer-encoding:date:from:message-id:mime-version :subject:to; s=corp-2023-11-20; bh=4SpDzd6ns5HXEJHJoua6NBwPKsjFU DkJuO+bUORWJN8=; b=Rbmmk0F0nGwTQClJDRgQhjwgklyYkoRdXCOhaq8LlYeEz WPB38nSJ8d5GZfFzoQ3op31dNtCOq4ZHjlT+uqiwAHkAUetRFMcW707t2GbHB4k1 G/m3IbEPLBOxdXiZEeKasCj/yYhLOqDMFWzdwv9NgNR/yAlsfg+igLLcCmvxxuSs lLvu3U+fbhcAseFrDHgs45oIOaAFZ+fGh63elpZtk1D5AXq4QSEuGLOXJRPiEjNU xwJtHMEmjiaEW1dFYRYxjei+P2+utetd0yw6csFzZBEm2+yqk6AE8jS2fpkGN6wV 1IR2j0mRpL+z72O32ezFaYqTwTcN45dJeqn2LAPOA== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 44y5gakmuk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 24 Feb 2025 21:15:02 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 51OLBGEV025436; Mon, 24 Feb 2025 21:15:01 GMT Received: from brm-x62-16.us.oracle.com (brm-x62-16.us.oracle.com [10.80.150.37]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 44y51esy6a-1; Mon, 24 Feb 2025 21:15:01 +0000 From: Jane Chu To: willy@infradead.org, peterx@redhat.com, akpm@linux-foundation.org, linmiaohe@huawei.com, kirill.shutemov@linux.intel.com, hughd@google.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] mm: make page_mapped_in_vma() hugetlb walk aware Date: Mon, 24 Feb 2025 14:14:45 -0700 Message-Id: <20250224211445.2663312-1-jane.chu@oracle.com> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-24_10,2025-02-24_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 spamscore=0 mlxlogscore=999 phishscore=0 mlxscore=0 suspectscore=0 adultscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502100000 definitions=main-2502240135 X-Proofpoint-ORIG-GUID: _QOr_NTjz6qd5eiFeNKLAKMJI1-HAInh X-Proofpoint-GUID: _QOr_NTjz6qd5eiFeNKLAKMJI1-HAInh X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: DC22F100002 X-Stat-Signature: 6ztud1skfe79mfy5rqq57xewf89n9qhi X-Rspam-User: X-HE-Tag: 1740431712-584755 X-HE-Meta: U2FsdGVkX19f2C8H22evwec75wyyIHDo2O4bZerEmGgbip3sY3yo5wF/KZGdNnIx3aKGyXiiW3qMkdSt++9xyZxT6bu4CUIUz8UQiGQJrIG8pBeYhFkg6pNwSZlObH07eT0UK9oqougl/h8680DyUCSLeRAfPtZ3atnCHMnt3oE0ggWY6K5nG2+k8D/to3b21MpFvEBPyEWoqF896+hx2Z3VNWqAHBY4ZTJVoOM3LIMB37Rd4DX7ZeNQZouwVFtaEhEHpgS4otuxckrwRSQ8wIwoLFC/N+j4uDJX4B9iQxdwmEjA1/dnqiBVNrSmVow5POsxXcpd7yZRD5/By0jxzQghUC5fFJ657XuuoosD/2CCP0U1fuWyGtG7n44r/knlX7DQCPu0W21BD0dROT/kSZuVhiI4bzQZNHXFVwttInmHoR3zwUKiw8hYPHaeQE3YuB3wwBvzfAgL28pNCHYjN6wA452OYD2SeNYxtc2FsufeoDbj/RVLJpkrLzGTPI1odO3kDJ0eM7oVOXkYE2JJY0NuN8uUvLRBWD0/W31uHl+EaRAGF8MNSpfj5mx3XT9pB+E87BoHuXNV0ug51hwBITJRHrBvpQ43NG8Q0VLuWq+M1HiK7msQo5JXlMu+1V89od2VLayvj6g9WW4iX/MA2ZUIR1AqyQwTzKZ2Y1gesb4WoiDBiSAwvto0h1ShlnqzCQP/tUWVW817NzZPIOKfUQSpwoDMfKjVL4q9y+eMP4DYDfj9A1zNvvl1GcV+UvvbXFg/vuP4DPJjdw7D1FYKAnPNR1INofQdRqKP+JbK43uFq2A6o3/VhV3bdoqnpEveKZD61lqL4ZorMfXfF1UP/nWqFJlvzi85YhLMRGZzFK9teG6ttBz6QH0ukJR8OU+dxmb8oUdVIza5pvnq1NqkStIMXDNu2ZNjq9rjYbsSQkVscNrTAidxJUbCfwRiiQkvb9KVND3RXdN3NOjngVl dir5ztYb 4nBQMglnnxaPjwuWTxJHl1wCx5McqMZ2TeyraWI71/p+v6QfHPgsOdVQQu9kJEB4CgeEOFs1NZjFNcIGfqC0ESppEnPq6Fs+4jkzZddZgvVJipmq8AUlLWUpa1799H6fp7xdRhjOp3Ze32vtBQWxWz57130eU7y/U8uWA4X/AEACeZmIpqAQoDJz7pJ0kYx/cjbPEoC3jxiJ+aq6GstfSjIyYv3Npj/Mmm8WRVGZh0dt6ylYJAJOA9CFwcwwOLcnjsujvyel9UenZE2elK+HOupTlWLBc6DAyyCTo X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: When a process consumes a UE in a page, the memory failure handler attempts to collect information for a potential SIGBUS. If the page is an anonymous page, page_mapped_in_vma(page, vma) is invoked in order to 1. retrieve the vaddr from the process' address space, 2. verify that the vaddr is indeed mapped to the poisoned page, where 'page' is the precise small page with UE. It's been observed that when injecting poison to a non-head subpage of an anonymous hugetlb page, no SIGBUS show up; while injecting to the head page produces a SIGBUS. The casue is that, though hugetlb_walk() returns a valid pmd entry (on x86), but check_pte() detects mismatch between the head page per the pmd and the input subpage. Thus the vaddr is considered not mapped to the subpage and the process is not collected for SIGBUS purpose. This is the calling stack collect_procs_anon page_mapped_in_vma page_vma_mapped_walk hugetlb_walk huge_pte_lock check_pte check_pte() header says that it "check if [pvmw->pfn, @pvmw->pfn + @pvmw->nr_pages) is mapped at the @pvmw->pte" but practically works only if pvmw->pfn is the head page pfn at pvmw->pte. Hindsight acknowledging that some pvmw->pte could point to a hugepage of some sort such that it makes sense to make check_pte() work for hugepage. Signed-off-by: Jane Chu --- mm/page_vma_mapped.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c index 81839a9e74f1..367209e65830 100644 --- a/mm/page_vma_mapped.c +++ b/mm/page_vma_mapped.c @@ -84,6 +84,7 @@ static bool map_pte(struct page_vma_mapped_walk *pvmw, pmd_t *pmdvalp, * mapped at the @pvmw->pte * @pvmw: page_vma_mapped_walk struct, includes a pair pte and pfn range * for checking + * @pte_nr: the number of small pages described by @pvmw->pte. * * page_vma_mapped_walk() found a place where pfn range is *potentially* * mapped. check_pte() has to validate this. @@ -100,7 +101,7 @@ static bool map_pte(struct page_vma_mapped_walk *pvmw, pmd_t *pmdvalp, * Otherwise, return false. * */ -static bool check_pte(struct page_vma_mapped_walk *pvmw) +static bool check_pte(struct page_vma_mapped_walk *pvmw, unsigned long pte_nr) { unsigned long pfn; pte_t ptent = ptep_get(pvmw->pte); @@ -133,7 +134,11 @@ static bool check_pte(struct page_vma_mapped_walk *pvmw) pfn = pte_pfn(ptent); } - return (pfn - pvmw->pfn) < pvmw->nr_pages; + if ((pfn + pte_nr - 1) < pvmw->pfn) + return false; + if (pfn > (pvmw->pfn + pvmw->nr_pages - 1)) + return false; + return true; } /* Returns true if the two ranges overlap. Careful to not overflow. */ @@ -208,7 +213,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw) return false; pvmw->ptl = huge_pte_lock(hstate, mm, pvmw->pte); - if (!check_pte(pvmw)) + if (!check_pte(pvmw, pages_per_huge_page(hstate))) return not_found(pvmw); return true; } @@ -291,7 +296,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw) goto next_pte; } this_pte: - if (check_pte(pvmw)) + if (check_pte(pvmw, 1)) return true; next_pte: do {