From patchwork Wed May 17 16:09:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiaqi Yan X-Patchwork-Id: 13245280 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 8F911C77B7F for ; Wed, 17 May 2023 16:10:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2C844900007; Wed, 17 May 2023 12:10:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 25249900003; Wed, 17 May 2023 12:10:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0F1E7900007; Wed, 17 May 2023 12:10:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D6050900003 for ; Wed, 17 May 2023 12:10:41 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id C4B1EC0618 for ; Wed, 17 May 2023 16:10:40 +0000 (UTC) X-FDA: 80800235040.07.BAED20F Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf05.hostedemail.com (Postfix) with ESMTP id 0D3E010001F for ; Wed, 17 May 2023 16:10:03 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=axQ41qX1; spf=pass (imf05.hostedemail.com: domain of 3W_xkZAgKCBI10s80Gs5y66y3w.u64305CF-442Dsu2.69y@flex--jiaqiyan.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3W_xkZAgKCBI10s80Gs5y66y3w.u64305CF-442Dsu2.69y@flex--jiaqiyan.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684339804; a=rsa-sha256; cv=none; b=iPqLDcJJeg+MFqGsGmmJyByyYyfFfEQijAjJ8ch2Mxhh01ABcQNJfwmDQ42emo3DzLkxY/ ++881FHJOhyc7NfRW+pn+2WfxDUBuepoO3/mMoZd5m61LUcxVrXpvH+TV5WSsx4Itd2U5X 9MaToxDtuB9cVNsUr8jQSf+3L9fwjQk= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=axQ41qX1; spf=pass (imf05.hostedemail.com: domain of 3W_xkZAgKCBI10s80Gs5y66y3w.u64305CF-442Dsu2.69y@flex--jiaqiyan.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3W_xkZAgKCBI10s80Gs5y66y3w.u64305CF-442Dsu2.69y@flex--jiaqiyan.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684339804; 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=4afwjJMNRVLZWsRS4KvH1UWrNK7pSNXsAEU4xOupb6Y=; b=6jsnkzLyUHmy1Gj9vgivGkqQYbcwPRqEJZRCbHVEEaWZv8wIgWUXaCMJUey52C/amqS0Oz ZcdGGkW3aHBmH/dIakidySiq9aMxq9TRHQNvvqLaYBiWX2Rle/kQhQVDiy/4W4sUh0Tbt9 S914BUUONBgdkpXnNfcPQ9BOvO+70bA= Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-ba81b24b878so1836353276.3 for ; Wed, 17 May 2023 09:10:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1684339803; x=1686931803; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4afwjJMNRVLZWsRS4KvH1UWrNK7pSNXsAEU4xOupb6Y=; b=axQ41qX1bwiHJbGU6rrt3d0A/FAXog8UjScM7eAjhvO/VZz1uMpCiXfvNRTVLE3/8S OZBGnYY6NkXRzHCcXWb2deoRCp4d/IhzJGUh0wL1C9VUN2hWUXoDFRR7iXDO/6Wl+fp6 uGwIan2D0pw5vLh98Q1bRnbHw7ENy/oETdEpQ8m8wE2UMa7QnS7eUD2E3CuA2ie5z6mc Q3h9U6cGrBmDrF/iHiQeKEXmB/AqVVSqZ2+ND4BoFj+Gq0VO1MO60ZY7L3bL5eaUrqOU INdMQsIXL5q34h0EXxp3baPOV9jVqICirZUX4wvP0xgrgao+63OSBIe1/yr8wrkYoNgo iHsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684339803; x=1686931803; 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=4afwjJMNRVLZWsRS4KvH1UWrNK7pSNXsAEU4xOupb6Y=; b=h8jXMrF09Va95lMyAl+jq5V9RcusPY+lx9N69jrenoezY4Lp3FQjG9n5xMCr/13G9U 8qqgZ0yfYC3X4VBR8rUNpzklxVU4gVRmZWEqbf9eWYiQr6oK8zRg++S+n+TskJjJl+8a 4InwE2v80ulQfYJ4Mjqy1ulKMeUg+LUR0uXyNvbTDL/pDPnHA7J1kX+oq6eu3wmGCwIY vVzkjZU2BgGzmQu1umrzNc/S2wi/rnTAao8oNBfA1SzZx2H7lMsPinbviAHu3ybkJhsQ kgiujJ0IgQacXuOK5FNo2IGOrpuQqus+rsHdBWscjzWbgrhUTjMd7+99OMTLw0XDGR24 lK1g== X-Gm-Message-State: AC+VfDxGDyuZWyoCefHJlOr8GmKVvTVMze5VoOnq2lZsnHL6ha3DUga1 0W+yU6i0flnfPthzm7ZLiEHDjpUGriWq3Q== X-Google-Smtp-Source: ACHHUZ5jetsUCam+N66UMpWQp6kuy86/2g1XYzaVSDPJC584NE14V4DeuwZ0XEKGYqDKMI3zAZXmMykVQH43Wg== X-Received: from yjq3.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:272f]) (user=jiaqiyan job=sendgmr) by 2002:a25:ce12:0:b0:ba8:1fab:4f99 with SMTP id x18-20020a25ce12000000b00ba81fab4f99mr2620511ybe.9.1684339803118; Wed, 17 May 2023 09:10:03 -0700 (PDT) Date: Wed, 17 May 2023 16:09:47 +0000 In-Reply-To: <20230517160948.811355-1-jiaqiyan@google.com> Mime-Version: 1.0 References: <20230517160948.811355-1-jiaqiyan@google.com> X-Mailer: git-send-email 2.40.1.606.ga4b1b128d6-goog Message-ID: <20230517160948.811355-3-jiaqiyan@google.com> Subject: [PATCH v1 2/3] hugetlbfs: improve read HWPOISON hugepage From: Jiaqi Yan To: mike.kravetz@oracle.com, songmuchun@bytedance.com, naoya.horiguchi@nec.com, shy828301@gmail.com, linmiaohe@huawei.com Cc: akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, duenwen@google.com, axelrasmussen@google.com, jthoughton@google.com, Jiaqi Yan X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 0D3E010001F X-Stat-Signature: 58rxgbpm7hc1ioah93en5do19nfs9qtr X-HE-Tag: 1684339803-339617 X-HE-Meta: U2FsdGVkX1/3g0E0YNGzOJlrBPpD/b2jwT5d0Hhc8cH4YFYQu0rnVB7JRmqDg2MlgcgzP+nsMph3JxuBUhak51ncINdUKzDRTWZ97CVFsyMiuSbDG8pmGOTDSSMz2zpBNv8KF1CwRjPZIQM448mf5XwURqpX256kdLW4CGjFg1Sq0rwbq5afspF0kWtrOqCu4ALH9hYjdnaJj7DiRg5TCannd6umshiBaBudWAdypT34mcEo34p3wZxrkqUZ3HRp6CpZ5AmU4MW5k92CoDsDne2K6JJTBNAs566+FpdXsdCloAGhcfAXuBehpnG/HmTItqePOi3ed6kwtENTsJDbVLR0TPVugK/NVsgHtyhD+OZffrM2pdwxVS6BySYRMpCDmzm2g4No71Z/Lyb6M3fp5ht/1w3exTz3Dt2UA1WSd8cDL/xoF0oJkAYVptPqW0za6JGzaJGCKnGEIxS54F5cgIzMIxHwOQ0dMU70EqwClmTudamBw2dgZKehqwzDsEhkkRaRx0ZYi5ZXj0NvTaCytw2yC9zWdq12iF88T9UDlto8ap070adou8DizwTFmz8gPIYi8FQw452SCs+VH6Wl5mreUzIRzU4Ev8N7mQHmj1GXJw0mCKUiPfvYx0IJ/xAnIKt4iHp6IimE74kb8r9qj5SaHeZmNMQTfpUHrsuiiZq1oE9iPbZwLxhQ7GFcQ1uGFskAgT3vzik3OaA/oDkOtpVYJnIHTB+uCgOOfsEytXKDVtB6QwDTT//pAEerpzzA6QM4kRyC4JvGzu05Q/nhRKcpxYlP32kg4SskNKZhij4tmtowVY3jL7S06cCfrBdX3C/hYS5D8INbr1pTAXC76iUJzTzqXpoXZy4SDN5F4uFbztbI9FdbN0pGdcZLtOtVABPQtqXMQ00qPnJ8gfCQEoSgc2i8uamA426jIHXpXXqDPjCVL7+MwohAoxw9d8PBG70i3GrNxT5skmm7ep6 wXfHXPF2 nkgk1+B/NtjWvPe9KBLPe8Xo08EXcjH8Bu6MDe71Tg43WouR2KDWskKk9RiYUQ240partc6oHd3fMDkSPxlOgaFaEqvJPEwdKIYifZIdIOaFV2nAceXb7gwnoJkoJKXJ3KdF/7AaZ2P8HvzLbKWRuZUlD1MXQCaysWG6nDH+TPrGuxetEEUxsDoiE0Yy6+YRt7kIXM40+qCh/MuMBjcGG3ZwMjXdsfl6/xzcwysTWECpRjHlTonzLj2qm6XyVhfDigRU9L8m4X+uy0ZMXXLge9moZKvwtI8TB2Ekco0x1pQsKGFuJforPlhQbrPxlyHa3FW70vLBon91XHazSEisSfpgLPZ4ByARtAHerU+yvO1pr/jSuMMnHtYQK08+VCoQy2jz/o8e7EuGiuuta6uVYpR/zbZHtmr4KH4C3SlqsaaLcJidB4Rk1Io4w6wsSw+LkI4jv354CSk/5lgjfAD5df3/yJHsooaYJsz1PNUhJi2XTq2OXvnwI3Tor4iRb9zounoMMPNs+IkaHZe9rVTKILYAOxaaOTQY11eKB41pwZA5LTQDU1FXVY8onf7Dp/6/qktuRyKZItHRxd1So1/tlRuL5QzmyZkoVgE+WIhZkm6xbq9GLoXDNAPRQwg== 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: When a hugepage contains HWPOISON pages, read() fails to read any byte of the hugepage and returns -EIO, although many bytes in the HWPOISON hugepage are readable. Improve this by allowing hugetlbfs_read_iter returns as many bytes as possible. For a requested range [offset, offset + len) that contains HWPOISON page, return [offset, first HWPOISON page addr); the next read attempt will fail and return -EIO. Signed-off-by: Jiaqi Yan --- fs/hugetlbfs/inode.c | 62 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index ecfdfb2529a3..1baa08ec679f 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -282,6 +282,46 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, } #endif +/* + * Someone wants to read @bytes from a HWPOISON hugetlb @page from @offset. + * Returns the maximum number of bytes one can read without touching the 1st raw + * HWPOISON subpage. + * + * The implementation borrows the iteration logic from copy_page_to_iter*. + */ +static size_t adjust_range_hwpoison(struct page *page, size_t offset, size_t bytes) +{ + size_t n = 0; + size_t res = 0; + struct folio *folio = page_folio(page); + + folio_lock(folio); + + /* First subpage to start the loop. */ + page += offset / PAGE_SIZE; + offset %= PAGE_SIZE; + while (1) { + if (find_raw_hwp_page(folio, page) != NULL) + break; + + /* Safe to read n bytes without touching HWPOISON subpage. */ + n = min(bytes, (size_t)PAGE_SIZE - offset); + res += n; + bytes -= n; + if (!bytes || !n) + break; + offset += n; + if (offset == PAGE_SIZE) { + page++; + offset = 0; + } + } + + folio_unlock(folio); + + return res; +} + /* * Support for read() - Find the page attached to f_mapping and copy out the * data. This provides functionality similar to filemap_read(). @@ -300,7 +340,7 @@ static ssize_t hugetlbfs_read_iter(struct kiocb *iocb, struct iov_iter *to) while (iov_iter_count(to)) { struct page *page; - size_t nr, copied; + size_t nr, copied, want; /* nr is the maximum number of bytes to copy from this page */ nr = huge_page_size(h); @@ -328,16 +368,26 @@ static ssize_t hugetlbfs_read_iter(struct kiocb *iocb, struct iov_iter *to) } else { unlock_page(page); - if (PageHWPoison(page)) { - put_page(page); - retval = -EIO; - break; + if (!PageHWPoison(page)) + want = nr; + else { + /* + * Adjust how many bytes safe to read without + * touching the 1st raw HWPOISON subpage after + * offset. + */ + want = adjust_range_hwpoison(page, offset, nr); + if (want == 0) { + put_page(page); + retval = -EIO; + break; + } } /* * We have the page, copy it to user space buffer. */ - copied = copy_page_to_iter(page, offset, nr, to); + copied = copy_page_to_iter(page, offset, want, to); put_page(page); } offset += copied;