From mboxrd@z Thu Jan 1 00:00:00 1970 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 D72CBC001B0 for ; Thu, 13 Jul 2023 00:18:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A22718E000C; Wed, 12 Jul 2023 20:18:43 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9830E8E0001; Wed, 12 Jul 2023 20:18:43 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7B00E8E000C; Wed, 12 Jul 2023 20:18:43 -0400 (EDT) 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 6D7F18E0001 for ; Wed, 12 Jul 2023 20:18:43 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 3DE0E1203FD for ; Thu, 13 Jul 2023 00:18:43 +0000 (UTC) X-FDA: 81004677726.05.0CA68BB Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf22.hostedemail.com (Postfix) with ESMTP id 6DB7BC0013 for ; Thu, 13 Jul 2023 00:18:41 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=OxVY6Z7l; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf22.hostedemail.com: domain of 34EKvZAgKCE80zr7zFr4x55x2v.t532z4BE-331Crt1.58x@flex--jiaqiyan.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=34EKvZAgKCE80zr7zFr4x55x2v.t532z4BE-331Crt1.58x@flex--jiaqiyan.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689207521; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Iz4QSmIvTSTUsAdxwi3pCBw4pt8RugCrQx5KDc9ZhJs=; b=2GKyPxLxYL5DVDYyXkj8USqCAEskpibIDcPGpNeRWN6CcwALagQs5Shw/GVGBuvFUUtCt6 CrObDHYaj28NR5c3XbkSvXo9EmR5TGy7N2fGK42TVpttR239QVkf23fviJ0wrdO54tWVK1 U43n5JeJFmsDFRJHtyiv34REPV5T4S0= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=OxVY6Z7l; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf22.hostedemail.com: domain of 34EKvZAgKCE80zr7zFr4x55x2v.t532z4BE-331Crt1.58x@flex--jiaqiyan.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=34EKvZAgKCE80zr7zFr4x55x2v.t532z4BE-331Crt1.58x@flex--jiaqiyan.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689207521; a=rsa-sha256; cv=none; b=ouZ3jN3lsGgkdo3SDyWZ+8n3uPerWShhFTkBZ1j/Jqy2vfWbvhh/6z9AWSIgSSfS6hxl1b m7LmgooeBZCLirkzDbyA4SV+P417/is0qqTz2/v6KGzxVK3QYtmNi3M+4D/MdLMmxPyQp1 8Pw453haKjncPZpsQLiW+4mcGLgHvdI= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8b2a2e720so824425ad.3 for ; Wed, 12 Jul 2023 17:18:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689207520; x=1691799520; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Iz4QSmIvTSTUsAdxwi3pCBw4pt8RugCrQx5KDc9ZhJs=; b=OxVY6Z7lXNfLpGGQxHTUt1swejOIFF85FUW0wE2VE8vdLB5aDIEaplEBhJovE6UIuU K4MI2omqzLcf0878ohV/qbCyn1o1btoxNO1zmo4XpzgNCwhqbsR5g9lPMhF/oc6c5OSH FLFQ8rcC3HlG6YKuWPQCFnkeyENr45NxeouUwj5SMJayn/oY+aa5qTUD8r4awoQKd282 07sAZWdt7BPtWzt9aI4AGI/dz9iMygnhJ+O+zdqcVmDbmZTctgty2teAKbz/LapOZrLR jUhKEwIXQ2hO2jhE5Geirl2yikNH3XAhBveTKUwqbOhLRH3RICugfJqK+TjpYtt4DoV1 LizA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689207520; x=1691799520; 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=Iz4QSmIvTSTUsAdxwi3pCBw4pt8RugCrQx5KDc9ZhJs=; b=MKW1mRTgklhFuvLdJ2lCEKXQ+iQso1emsmeVofGjjw4noYj0HgSfbsE+/JdjqWTOn2 Rd/T0vpOpRIwmYDUjkrjPhucLrA711Z1kHLrQWrG6vDy6wTg3PRGlcnpIjVBkjfoeFKl xjV7Eq5NSMahxLodKG5SRUk1R9ZSJ8Nfk87Cy/QgGKw4ZyTYyvOfWoGMY4MYzEI7wKRT AcciytctaFb/e/koxzdmR/w7A/BlNulMeu9HC3hq5wwxSbDfKtVuY3wSiuxIQbM72o1b STrNTRbVxVqhFExOdcY+LOgVx9mfpAHIQVhka+yqkwlbS9zQUjdsulJb736Zmp2i+JBB cOAQ== X-Gm-Message-State: ABy/qLZ8wibBF0UwqlYTpxbFwudWTx6nxieWz4XTbw6FrBoHnx7bNVnX XqIz/GQifxh03k+u9HHzZT34e27YR7xOOQ== X-Google-Smtp-Source: APBJJlFBNAQ4nTEEROlscxAMFHxffimTCXNSjblZZoYT2wX9TgjL8pV7vT6yXRoYce4lKt7cw6slHJX3L0xABg== X-Received: from yjq3.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:272f]) (user=jiaqiyan job=sendgmr) by 2002:a17:902:e54e:b0:1b5:1fe8:a91 with SMTP id n14-20020a170902e54e00b001b51fe80a91mr611plf.3.1689207520379; Wed, 12 Jul 2023 17:18:40 -0700 (PDT) Date: Thu, 13 Jul 2023 00:18:31 +0000 In-Reply-To: <20230713001833.3778937-1-jiaqiyan@google.com> Mime-Version: 1.0 References: <20230713001833.3778937-1-jiaqiyan@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230713001833.3778937-3-jiaqiyan@google.com> Subject: [PATCH v4 2/4] mm/hwpoison: check if a raw page in a hugetlb folio is raw HWPOISON From: Jiaqi Yan To: linmiaohe@huawei.com, mike.kravetz@oracle.com, naoya.horiguchi@nec.com Cc: akpm@linux-foundation.org, songmuchun@bytedance.com, shy828301@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, jthoughton@google.com, Jiaqi Yan Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 6DB7BC0013 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: jp4fk84phw17raj3c3z8cajk7dhcpegu X-HE-Tag: 1689207521-290287 X-HE-Meta: U2FsdGVkX18h7qEwyHTOWZIMEX3zxKtF8/m42Fa5/P3ePWVZxAZCFn6IJcW+YRb23IL2+S29YaWy6oI15YILWm/19uzNIdz3dTHHjUxTHLQ6x0W3wqCyMc192dXReRoVSjNPwEcAy5Nuk7+ZAgItheV0MfGh2M69OtRaZdyds7UeUbJwSB1BhGfVe/LKeqc6JewwjQIrNenjSSQYJjMg4aRY44R4NeYDkgY3foW7629KVlQE5dXs7dTRtB7lm6bfzBJrug9+s4kv6zL5mXEKCNxkJ8GprFGwgDASlVbJ6TBLN2ydxxa3Ei3At2IcjL0IASmk5RWtgJKcJTuFyFzU9qbcfD2y/Gr9xMjF0BmVVKDsc4bP2+4mYV5RYhwZxm72x+vUHp78JY2qArBepNQyKx9Ao/IcCkVrBmiqg2xK+4lDtjZAymgmagMrgIK1R4GRZ7VdKZtUnpq8UmkNsywCvXEFS7cdglliNy6cFi6zzt7fwLA1E3DsSlsNZy9Kn1ewNCPR76xLJ3BX2UtlLX0euQdDu1HTy212ea/tARR7+LtMrGc/oIflPzstagK68mMmFwa2H3RpR1rU/8TJlk8ggIUJOfAMEk3nhlAzFhoHlQf6ate4sLLcbDbExL6JsVqOn5oFcUtcGIsxYAat9XV5C8LkIIOp+TRyEnwsHu3tObb+4/x9xJyZyI7tBAT/0tFZTLQLUM6LCIiPeBgPfkTDiINCzNqOMeYOxUZbZlw4CKQV9B9cx2/QyqMl0JOpgzusHida/kZOWZusa7Uszk7buCGyadxFPboDN4rYEmqV4QoxB5TAXysGqiXqyPjaJ7bXl3eCGDPktR+Ly3VI92jINU/EvMu2Gh1Scfk+cGRs/2u4aDhVz0AKllmm7rIhtRQ+54RXmnWB1hRYB6V02CThxZ0WH1pEFeuvlurt97yEH0QQmFS3Lr2wMurLU8KDSRlRVGyayLSZ7ishPvyxFOc Sk4f0NEm hhaXfoPVZQYgNNbs6gVHRg88euDT0OfU6QjbaperuwGG7aQ1Rj50Qm+TRJcQ25b1gE6mNxHwVQJV2QHfKBE0tXfH4EaRwqH9azpk4K+ahgKAJ7+FZLoYIMIDATX5FbtPXSINmqI1/L70DULM+zSeYrwjNaPk1Qcrx1WMaAtsI0trVY4GVM2fofQ3xzPGV0K+7+lAWaGlyQwKObW0wTFCQoNrghuTmv5ZExkzgBj8C7LPed81KhFcfggnsOH5a8tO81L02JierVu5BvXEiReFJziD8Y8aCgxZDKpa25QYqFMzfCtAJaR3nNFfsInwjwmH2TKdtOXLauCWrxoMqoRAaMTQStUKhWtPbvl43k1JC2kMSrxxMxBvBkMwUmUkUZ3fxFskTYySki7T0tHdfIXOt+zzjkvPyHwEehBSMCPZo9OKEdAACl/KV7ZDUaJy2OCAFGcnaVglCz6wXoAmrUaf+VSvabGPdQpHHqkBtHQHE859ZZx8kAQKjsYSd0EceC6yFlVi6DChiMVaZ7JKkmZAE3i2JCW8BpIuExc9GozMYdKJCwyWQP5paePBF5kEIVmVufEA3G8h2cS0zXHrNKaXGfBtzKVInjEYbMQ5AW+CE9Dfyw8dNf1KmVo1l4PXtjxF7bpXKPdyJ11P9Udbap7ztl5O0uO/c1m8xBvstU0PB3DXksydlCA4jYJfHycIYlzew57FO 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: Add the functionality, is_raw_hwpoison_page_in_hugepage, to tell if a raw page in a hugetlb folio is HWPOISON. This functionality relies on RawHwpUnreliable to be not set; otherwise hugepage's raw HWPOISON list becomes meaningless. is_raw_hwpoison_page_in_hugepage holds mf_mutex in order to synchronize with folio_set_hugetlb_hwpoison and folio_free_raw_hwp who iterate, insert, or delete entry in raw_hwp_list. llist itself doesn't ensure insertion and removal are synchornized with the llist_for_each_entry used by is_raw_hwpoison_page_in_hugepage (unless iterated entries are already deleted from the list). Caller can minimize the overhead of lock cycles by first checking HWPOISON flag of the folio. Exports this functionality to be immediately used in the read operation for hugetlbfs. Reviewed-by: Mike Kravetz Reviewed-by: Naoya Horiguchi Reviewed-by: Miaohe Lin Signed-off-by: Jiaqi Yan --- include/linux/hugetlb.h | 5 +++++ mm/memory-failure.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index ca3c8e10f24a..0a96cfacb746 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -1007,6 +1007,11 @@ void hugetlb_register_node(struct node *node); void hugetlb_unregister_node(struct node *node); #endif +/* + * Check if a given raw @page in a hugepage is HWPOISON. + */ +bool is_raw_hwpoison_page_in_hugepage(struct page *page); + #else /* CONFIG_HUGETLB_PAGE */ struct hstate {}; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index a08677dcf953..d610d8f03f69 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -75,6 +75,8 @@ atomic_long_t num_poisoned_pages __read_mostly = ATOMIC_LONG_INIT(0); static bool hw_memory_failure __read_mostly = false; +static DEFINE_MUTEX(mf_mutex); + inline void num_poisoned_pages_inc(unsigned long pfn) { atomic_long_inc(&num_poisoned_pages); @@ -1813,6 +1815,7 @@ EXPORT_SYMBOL_GPL(mf_dax_kill_procs); #endif /* CONFIG_FS_DAX */ #ifdef CONFIG_HUGETLB_PAGE + /* * Struct raw_hwp_page represents information about "raw error page", * constructing singly linked list from ->_hugetlb_hwpoison field of folio. @@ -1827,6 +1830,41 @@ static inline struct llist_head *raw_hwp_list_head(struct folio *folio) return (struct llist_head *)&folio->_hugetlb_hwpoison; } +bool is_raw_hwpoison_page_in_hugepage(struct page *page) +{ + struct llist_head *raw_hwp_head; + struct raw_hwp_page *p; + struct folio *folio = page_folio(page); + bool ret = false; + + if (!folio_test_hwpoison(folio)) + return false; + + if (!folio_test_hugetlb(folio)) + return PageHWPoison(page); + + /* + * When RawHwpUnreliable is set, kernel lost track of which subpages + * are HWPOISON. So return as if ALL subpages are HWPOISONed. + */ + if (folio_test_hugetlb_raw_hwp_unreliable(folio)) + return true; + + mutex_lock(&mf_mutex); + + raw_hwp_head = raw_hwp_list_head(folio); + llist_for_each_entry(p, raw_hwp_head->first, node) { + if (page == p->page) { + ret = true; + break; + } + } + + mutex_unlock(&mf_mutex); + + return ret; +} + static unsigned long __folio_free_raw_hwp(struct folio *folio, bool move_flag) { struct llist_node *t, *tnode, *head; @@ -2106,8 +2144,6 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, return rc; } -static DEFINE_MUTEX(mf_mutex); - /** * memory_failure - Handle memory failure of a page. * @pfn: Page Number of the corrupted page -- 2.41.0.255.g8b1d071c50-goog