lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230713001833.3778937-1-jiaqiyan@google.com>
Date:   Thu, 13 Jul 2023 00:18:29 +0000
From:   Jiaqi Yan <jiaqiyan@...gle.com>
To:     linmiaohe@...wei.com, mike.kravetz@...cle.com,
        naoya.horiguchi@....com
Cc:     akpm@...ux-foundation.org, songmuchun@...edance.com,
        shy828301@...il.com, linux-mm@...ck.org,
        linux-kernel@...r.kernel.org, jthoughton@...gle.com,
        Jiaqi Yan <jiaqiyan@...gle.com>
Subject: [PATCH v4 0/4] Improve hugetlbfs read on HWPOISON hugepages

Today when hardware memory is corrupted in a hugetlb hugepage,
kernel leaves the hugepage in pagecache [1]; otherwise future mmap or
read will suject to silent data corruption. This is implemented by
returning -EIO from hugetlb_read_iter immediately if the hugepage has
HWPOISON flag set.

Since memory_failure already tracks the raw HWPOISON subpages in a
hugepage, a natural improvement is possible: if userspace only asks for
healthy subpages in the pagecache, kernel can return these data.

This patchset implements this improvement. It consist of three parts.
The 1st commit exports the functionality to tell if a subpage inside a
hugetlb hugepage is a raw HWPOISON page. The 2nd commit teaches
hugetlbfs_read_iter to return as many healthy bytes as possible.
The 3rd commit properly tests this new feature.

[1] commit 8625147cafaa ("hugetlbfs: don't delete error page from pagecache")

Changelog

v3 => v4
* incorporate feedbacks from Matthew Wilcox <willy@...radead.org>,
  Miaohe Lin <linmiaohe@...wei.com>, Mike Kravetz
  <mike.kravetz@...cle.com> and Naoya Horiguchi
  <naoya.horiguchi@....com>.
* rename is_raw_hwp_subpage => is_raw_hwpoison_page_in_hugepage.
* instead of taking hugetlb_lock, is_raw_hwpoison_page_in_hugepage needs
  to hold mf_mutex.
* use llist_for_each_entry, instead of llist_for_each_entry_safe in
  is_raw_hwpoison_page_in_hugepage.
* is_raw_hwpoison_page_in_hugepage doesn't need the folio argument.
* no need to export struct raw_hwp_page to header file.
* v4 is based on commit fd3006d2d0e7 ("Sync mm-stable with v6.5-rc1.").

v2 => v3
* Update commit messages for future reader to know background and
  code details.
* v3 is based on commit 5bb367dca2b9 ("Merge branch 'master' into
  mm-stable").

v1 => v2
* incorporate feedbacks from both Mike Kravetz
  <mike.kravetz@...cle.com> and Naoya Horiguchi
  <naoya.horiguchi@....com>.
* __folio_free_raw_hwp deletes all entries in raw_hwp_list before it
  traverses and frees raw_hwp_page.
* find_raw_hwp_page => __is_raw_hwp_subpage and __is_raw_hwp_subpage
  only returns bool instead of a raw_hwp_page entry.
* is_raw_hwp_subpage holds hugetlb_lock while checking
  __is_raw_hwp_subpage.
* No need to do folio_lock in adjust_range_hwpoison.
* v2 is based on commit a6e79df92e4a ("mm/gup: disallow FOLL_LONGTERM
  GUP-fast writing to file-backed mappings").

Jiaqi Yan (4):
  mm/hwpoison: delete all entries before traversal in
    __folio_free_raw_hwp
  mm/hwpoison: check if a raw page in a hugetlb folio is raw HWPOISON
  hugetlbfs: improve read HWPOISON hugepage
  selftests/mm: add tests for HWPOISON hugetlbfs read

 fs/hugetlbfs/inode.c                          |  57 +++-
 include/linux/hugetlb.h                       |   5 +
 mm/memory-failure.c                           |  48 ++-
 tools/testing/selftests/mm/.gitignore         |   1 +
 tools/testing/selftests/mm/Makefile           |   1 +
 .../selftests/mm/hugetlb-read-hwpoison.c      | 322 ++++++++++++++++++
 6 files changed, 421 insertions(+), 13 deletions(-)
 create mode 100644 tools/testing/selftests/mm/hugetlb-read-hwpoison.c

-- 
2.41.0.255.g8b1d071c50-goog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ